Praktik terbaik untuk kasus dukungan Google Cloud Apigee

Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Lihat Dokumentasi Apigee Edge.

Memberikan informasi yang detail dan diperlukan dalam kasus dukungan membuatnya agar tim Dukungan Google Cloud dapat merespons Anda dengan cepat dan efisien. Jika kasus dukungan Anda tidak memiliki detail penting, kami perlu meminta informasi lebih lanjut, yang mungkin perlu bolak-balik beberapa kali. Proses ini memerlukan waktu yang lebih lama dan dapat menyebabkan keterlambatan penyelesaian masalah. Panduan Praktik Terbaik ini memungkinkan Anda mengetahui informasi kami perlu menyelesaikan kasus dukungan teknis Anda lebih cepat.

Mendeskripsikan masalah

Masalah harus berisi informasi yang menjelaskan secara detail mengenai terjadi versus apa yang diharapkan terjadi, serta kapan dan bagaimana hal itu terjadi. Kasus dukungan yang baik harus berisi kunci berikut informasi untuk setiap produk Apigee:

Informasi utama Deskripsi Apigee di Google Cloud Apigee hybrid
Produk Produk Apigee tertentu yang mengamati masalah, termasuk informasi versi jika ada.
  • Versi hybrid
Detail Masalah Deskripsi masalah yang jelas dan rinci yang menguraikan masalah, termasuk pesan {i>error<i} yang lengkap, jika ada.
  • Pesan error
  • Output alat debug
  • Langkah-langkah untuk merekonstruksi masalah
  • Menyelesaikan permintaan/perintah API
  • Pesan error
  • Output alat debug
  • Langkah-langkah untuk merekonstruksi masalah
  • Menyelesaikan permintaan/perintah API
  • Log diagnostik komponen
  • Metrik Cloud Monitoring
Waktu Stempel waktu spesifik kapan masalah mulai terjadi dan berapa lama masalah tersebut berlangsung.
  • Tanggal, waktu, dan zona waktu terjadinya masalah
  • Durasi masalah
  • Tanggal, waktu, dan zona waktu terjadinya masalah
  • Durasi masalah
Penyiapan Informasi mendetail tempat masalah diamati.
  • Nama organisasi
  • Nama env
  • Nama proxy API
  • Revisi

Bagian berikut menjelaskan konsep-konsep ini secara lebih mendetail.

Produk

Terdapat berbagai produk Apigee, yaitu Apigee on Google Cloud dan Apigee hybrid, jadi kita memerlukan informasi spesifik produk tertentu yang memiliki masalah.

Tabel berikut berisi beberapa contoh yang menunjukkan informasi lengkap di kolom TINDAKAN, dan informasi yang tidak lengkap di kolom LARANGAN kolom:

ANJURAN LARANGAN
Deployment proxy API OAuth2 gagal di Apigee di Google Cloud organisasi ...

Deployment proxy API gagal

(Kami perlu mengetahui produk Apigee yang bermasalah.)

Kita mendapatkan pesan error berikut saat mengakses Cassandra menggunakan cqlsh pada Apigee hybrid versi 1.3 ...

Kami tidak dapat mengakses Cassandra menggunakan cqlsh.

(Informasi versi campuran tidak ada)

Detail Masalah

Berikan informasi akurat tentang masalah yang sedang diamati, termasuk pesan {i>error<i} (jika ada) serta perilaku yang diperkirakan dan benar-benar diamati.

Tabel berikut berisi beberapa contoh yang menunjukkan informasi lengkap di kolom TINDAKAN, dan informasi yang tidak lengkap di kolom Kolom LARANGAN:

ANJURAN LARANGAN

Proxy edgemicro baru edgemicro_auth adalah gagal dengan error berikut:

{"error":"missing_authorization","error_description":"Missing Authorization header"}

Proxy edgemicro baru yang dibuat hari ini tidak berfungsi

(Nama proxy tidak diketahui. Tidak jelas apakah {i>proxy<i} itu kesalahan atau respons tidak terduga.)

Klien kami mengalami 500 error dengan hal berikut pesan error saat membuat permintaan ke proxy API:

{"fault":{"faultstring":"Execution of JSReadResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"content\" from undefined. (JSReadResponse.js:23)","detail":{"errorcode":"steps.javascript.ScriptExecutionFailed"}}}

Klien kami mendapatkan 500 Error saat membuat permintaan ke proxy API.

(Hanya menyampaikan Error 500 tidak memberikan informasi agar kami dapat menyelidiki masalah tersebut. Kita perlu mengetahui pesan kesalahan aktual dan kode kesalahan yang sedang diamati.)

Waktu

Waktu adalah informasi yang sangat kritis. Penting bagi Teknisi Dukungan untuk mengetahui kapan Anda pertama kali melihat masalah ini, berapa lama berlangsung, dan apakah masalah itu masih terjadi.

Teknisi Dukungan yang menyelesaikan masalah ini mungkin tidak berada di zona waktu Anda, jadi pernyataan relatif tentang waktu membuat masalah menjadi lebih sulit untuk didiagnosis. Oleh karena itu, sebaiknya gunakan ISO 8601 format tanggal dan stempel waktu untuk memberikan informasi waktu yang tepat kapan masalah itu diamati.

Tabel berikut memberikan beberapa contoh yang menunjukkan waktu dan cara durasi masalah terjadi di kolom TINDAKAN, dan informasi yang ambigu atau tidak jelas tentang kapan masalah itu terjadi dalam Kolom LARANGAN:

ANJURAN LARANGAN
Sejumlah besar 503s diamati kemarin antara 06-11-2020 17.30 PDT dan 06-11-2020 17.35 PDT...

Sejumlah besar 503s diamati kemarin pukul 17.30 selama 5 menit.

(Kami terpaksa menggunakan tanggal tersirat dan juga tidak jelas di zona waktu mana yang diamati untuk masalah ini.)

Latensi tinggi diamati pada Proxy API berikut dari 09-11-2020 15.30 IST hingga 09-11-2020 18.10 IST ...

Latensi tinggi diamati di beberapa Proxy API minggu lalu.

(Tidak jelas pada hari dan durasi mana masalah ini diamati minggu lalu.)

Penyiapan

Kami perlu mengetahui detail tentang lokasi masalah yang Anda alami. Bergantung pada produk yang Anda gunakan, kami memerlukan informasi berikut:

  • Jika Anda menggunakan Apigee di Google Cloud, Anda mungkin memiliki lebih dari satu organisasi, jadi kami perlu mengetahui organisasi secara spesifik dan tempat Anda mengamati masalah:
    • Nama Organisasi dan Lingkungan
    • Nama proxy dan nomor revisi API (untuk kegagalan permintaan API)
  • Jika Anda menggunakan campuran, Anda mungkin menggunakan salah satu dari banyak model yang didukung platform hybrid dan topologi instalasi. Kita perlu mengetahui platform dan topologi hybrid yang Anda gunakan, termasuk detailnya seperti jumlah pusat data dan {i>node<i}.

Tabel berikut menyediakan beberapa contoh yang menampilkan informasi lengkap di kolom TINDAKAN, dan informasi tidak lengkap di kolom LARANGAN:

ANJURAN LARANGAN

401 Error telah meningkat pada Apigee di Google Cloud sejak 06-11-2020 09:30 CST.

Detail penyiapan Apigee:

Detail API yang gagal adalah sebagai berikut:
Nama organisasi: myorg
Nama Env: test
Nama proxy API: myproxy
Nomor revisi: 3

Error:

{"fault":{"faultstring":"Failed to resolve API Key variable request.header.X-APP-API_KEY","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}

401 Error telah meningkat.

(Laporan ini tidak memberikan informasi apa pun tentang produk yang digunakan, karena kapan masalahnya yang diamati atau detail penyiapan apa pun.)

Debug gagal dengan error berikut pada Apigee hybrid versi 1.3

Error:

Error while Creating trace session for corp-apigwy-discovery, revision 3, environment dev.

Failed to create DebugSession {apigee-hybrid-123456 dev corp-apigwy-discovery 3 ca37384e-d3f4-4971-9adb-dcc36c392bb1}

Detail penyiapan Apigee Hybrid:

  • Platform hybrid Apigee:
    Anthos GKE lokal versi 1.4.0
  • Project Google Cloud, organisasi hybrid, dan lingkungan
    ID Project Google Cloud: apigee-hybrid-123456
    Organisasi hybrid Apigee: apigee-hybrid-123456
    Lingkungan hybrid Apigee: dev
  • Detail nama cluster Kubernetes
    k8sCluster: Nama
    : user-cluster-1 Wilayah
    : us-east1
  • Topologi jaringan
    Melampirkan file network-topology.png.
Debug gagal pada Apigee hybrid.

Artefak berguna

Memberikan artefak yang terkait dengan masalah kepada kami akan mempercepat proses resolusi Anda, karena membantu kami memahami perilaku yang tepat yang sedang Anda mengamati dan mendapatkan lebih banyak wawasan.

Bagian ini menjelaskan beberapa artefak berguna yang bermanfaat bagi semua Produk Apigee:

Artefak umum untuk semua produk Apigee

Artefak berikut berguna untuk semua produk Apigee: Apigee di Google Cloud dan Apigee hybrid:

Artefak Deskripsi
Men-debug output alat Output alat Debug berisi informasi detail tentang permintaan API yang mengalir melalui Produk Apigee. Hal ini berguna untuk error runtime seperti 4XX, 5XX, dan masalah latensi.
Screenshot Screenshot membantu menyampaikan konteks perilaku sebenarnya atau error yang diamati. Penting berguna untuk setiap error atau masalah yang diamati, seperti di UI atau Analytics.
HAR (Http ARchive) HAR adalah file yang direkam oleh alat sesi HTTP untuk proses debug masalah terkait UI. Gambar ini dapat direkam menggunakan browser seperti Chrome, Firefox, atau Internet Explorer.
tcpdumps Alat tcpdump menangkap paket TCP/IP yang ditransfer atau diterima melalui jaringan. Cara ini berguna untuk masalah terkait jaringan seperti kegagalan TLS handshake, 502 error, dan masalah latensi, dll.

Artefak tambahan untuk hybrid

Untuk hybrid, kami mungkin memerlukan beberapa artefak tambahan yang akan memfasilitasi diagnosis masalah dengan lebih cepat.

Artefak Deskripsi
Platform hybrid Apigee Tentukan salah satu dari yang berikut ini platform hybrid yang didukung yang digunakan:
  • GKE
  • GKE on-prem
  • AKS (Layanan Kubernetes Azure)
  • Amazon EKS
  • GKE on AWS
Versi komponen hybrid dan dependen Apigee
  • Versi CLI hybrid Apigee:
    apigeectl versi
  • Versi Agen Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versi Apigee MART:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versi Apigee Synchronizer:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Versi Apigee Cassandra:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Versi Runtime Apigee:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • Kubernetes CLI dan versi server:
    kubectl versi
  • Istio CLI dan versi server:
    istioctl versi
Topologi jaringan Diagram topologi instalasi Apigee yang menjelaskan konfigurasi hybrid Anda, termasuk semua pusat data, cluster Kubernetes, namespace, dan pod.
Mengganti File YAML File overrides.yaml yang digunakan di setiap pusat data untuk menginstal bidang runtime hybrid Apigee.
Status deployment hybrid Apigee

Output dari perintah berikut di setiap cluster pusat data/Kubernetes:

kubectl get pods -A
kubectl get services -A

Log komponen hybrid Apigee

Memberikan link ke log StackDriver untuk komponen hybrid ATAU

Anda dapat mengambil log komponen hybrid Apigee menggunakan perintah berikut di setiap cluster pusat data/Kubernetes dan membagikannya dengan kami:

kubectl -n {namespace} get pods
kubectl -n {namespace} logs {pod-name}

  • Log Agen Apigee Connect:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Log MART:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Log sinkronisasi:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Log Apigee Cassandra:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Log Runtime MP/Apigee (dari semua pod apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Menjelaskan log

Informasi mendetail tentang pod.

Hal ini berguna terutama jika Anda mengamati masalah seperti pod yang terjebak dalam status CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Tautkan ke Dasbor metrik Anda
  • Snapshot dasbor apa pun yang terkait dengan Metrik Cloud Monitoring.

Hybrid Apigee Harus Dikumpulkan

Anda juga dapat menjalankan skrip Harus-Kumpulkan berdasarkan perintah yang tercantum di bawah;

###--- "kubectl config" commands to get the config details of the whole Apigee Hybrid cluster ---####

kubectl config get-clusters 2>&1 | tee /tmp/k_config_get_clusters_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config get-contexts 2>&1 | tee /tmp/k_config_get_contexts_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config get-users 2>&1 | tee /tmp/k_config_get_users_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config view 2>&1 | tee /tmp/k_config_view_$(date +%Y.%m.%d_%H.%M.%S).txt

### --- Collect all details of all nodes in the Kubernetes cluster.---###

kubectl describe node 2>&1 |  tee /tmp/k_describe_node_$(date +%Y.%m.%d_%H.%M.%S).txt

###--- "kubectl get -A " commands to get CRD details for the whole Apigee Hybrid setup ---####

kubectl get clusterissuers -A -o wide 2>&1 | tee /tmp/k_get_clusterissuers_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get certificate -A -o wide 2>&1 | tee /tmp/k_get_certificate_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get certificaterequest -A -o wide 2>&1 | tee /tmp/k_get_certificaterequest_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get crd -A 2>&1 | tee /tmp/k_get_crd_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ConfigMap -A 2>&1 | tee /tmp/k_get_ConfigMap_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRole -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRoleBinding -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Deployments -A -o wide >&1 | tee /tmp/k_get_deployments_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get events -A -o wide 2>&1 | tee /tmp/k_get_events_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get endpoints -A  2>&1 | tee /tmp/k_get_endpoints_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get issuers -A -o wide 2>&1 | tee /tmp/k_get_issuers_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get mutatingwebhookconfigurations  2>&1 | tee /tmp/k_get_mutatingwebhookconfigurations_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get nodes -o wide --show-labels 2>&1 | tee /tmp/k_get_nodes_labels_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ns 2>&1 | tee /tmp/k_get_namespace_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PriorityClass -A -o wide 2>&1 | tee /tmp/k_get_PriorityClass_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pv -A -o wide 2>&1 | tee /tmp/k_get_pv_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pvc -A -o wide 2>&1 | tee /tmp/k_get_pvc_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Role -A -o wide 2>&1 | tee /tmp/k_get_role_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get RoleBinding -A -o wide 2>&1 | tee /tmp/k_get_Role_Binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get replicaset -A -o wide 2>&1 | tee /tmp/k_get_replicaset_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sa -A -o wide 2>&1 | tee /tmp/k_get_service_accounts_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get services -A -o wide 2>&1 | tee /tmp/k_get_services_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get svc -A 2>&1 | tee /tmp/k_get_svc_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get secrets -A 2>&1 | tee /tmp/k_get_secrets_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations -A  2>&1  | tee /tmp/k_get_validatingwebhookconfigurations_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations apigee-validating-webhook-configuration 2>&1  | tee /tmp/k_get_apigee-validating-webhook-configuration_$(date +%Y.%m.%d_%H.%M.%S).txt

### --- List top resource consuming nodes and pods ---####

kubectl top nodes 2>&1 | tee /tmp/k_top_nodes_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl top pod -A --containers 2>&1 | tee /tmp/k_top_pod_all_containers_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl get" commands to fetch list of all CRD for "apigee" namespace ----- #####

kubectl get all -n apigee -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ad -n apigee 2>&1 | tee /tmp/k_get_ad_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeorganization -n apigee 2>&1 | tee /tmp/k_get_apigeeorganization_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeenv -n apigee  2>&1 | tee /tmp/k_get_apigeeenv_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeds -n apigee  2>&1 | tee /tmp/k_get_apigeeds_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeedatastore -n apigee 2>&1 | tee /tmp/k_get_apigeedatastore_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeDeployment -n apigee 2>&1 | tee /tmp/k_get_apigeedeployment_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRedis -n apigee 2>&1 | tee /tmp/k_get_ApigeeRedis_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRoute -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoute_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRouteConfig -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoutesconfig_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Apigeetelemetry -n apigee 2>&1 | tee /tmp/k_get_Apigeetelemetry_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeissues -n apigee 2>&1 | tee /tmp/k_get_apigeeissues_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ControllerRevision -n apigee -o wide 2>&1 | tee /tmp/k_get_ControllerRevision_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get cronjob -n apigee -o wide 2>&1 | tee /tmp/k_get_cronjob_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get gateway -n apigee 2>&1 | tee /tmp/k_get_gateway_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PodDisruptionBudget -n apigee -o wide 2>&1 | tee /tmp/k_get_PodDisruptionBudget_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sc -n apigee -o wide 2>&1 | tee /tmp/k_get_storageclass_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sts -n apigee 2>&1 | tee /tmp/k_get_sts_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get volumesnapshot -n apigee -o wide 2>&1 | tee /tmp/k_get_volumesnapshot_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands to fetch details of all CRD for "apigee" namespace ----- #####

for p in $(kubectl -n apigee get apigeeorganization --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeorganization ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeorganization_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeenv --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeenv ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeenv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeds --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeds ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeds_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeedatastore --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeedatastore ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeedatastore_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeDeployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeDeployment ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeDeployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRedis --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRedis ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRedis_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRoute --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRoute ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRoute_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRouteConfig --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRouteConfig ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRouteConfig_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get Apigeetelemetry --no-headers -o custom-columns=":metadata.name") ; do kubectl describe Apigeetelemetry ${p} -n apigee 2>&1 | tee /tmp/k_desc_Apigeetelemetry_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeissues --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeissues ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeissues_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ControllerRevision --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe ControllerRevision ${p} 2>&1 | tee /tmp/k_desc_ControllerRevision_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee 2>&1 | tee /tmp/k_desc_certificate_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get cronjob --no-headers -o custom-columns=":metadata.name") ; do kubectl describe cronjob ${p} -n apigee 2>&1 | tee /tmp/k_desc_cronjob_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get daemonset --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe daemonset ${p} 2>&1 | tee /tmp/k_desc_daemonset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get deployments --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe deployments ${p} 2>&1 | tee /tmp/k_desc_deployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get hpa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe hpa ${p} -n apigee 2>&1 | tee /tmp/k_desc_hpa_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee 2>&1 | tee /tmp/k_desc_jobs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get PodDisruptionBudget --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe PodDisruptionBudget ${p} 2>&1 | tee /tmp/k_desc_PodDisruptionBudget_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get pv --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pv ${p} 2>&1 | tee /tmp/k_desc_pv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get pvc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pvc ${p} 2>&1 | tee /tmp/k_desc_pvc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe sc ${p} 2>&1 | tee /tmp/k_desc_storageclass_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get sts --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sts ${p} -n apigee 2>&1 | tee /tmp/k_desc_sts_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe secrets ${p} 2>&1 | tee /tmp/k_desc_secrets_n_apigee${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee 2>&1 | tee /tmp/k_desc_services_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee 2>&1 | tee /tmp/k_desc_service_account_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n apigee 2>&1 | tee /tmp/k_desc_svc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command to fetch logs of all containers in the "apigee" namespace ----- #####

for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" commands for "apigee-system" namespace ----- #####

kubectl get all -n apigee-system -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get jobs -o wide -n apigee-system 2>&1 | tee /tmp/k_get_jobs_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_certificate_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get deployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe deployment ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_deployment_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_jobs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rolebinding --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rolebinding ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_rolebinding_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_services_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_serviceaccount_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_secrets_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" command for "cert-manager" namespace ----- #####

kubectl get all -n cert-manager -o wide 2>&1 | tee /tmp/k_get_all_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get crd -n cert-manager 2>&1 | tee /tmp/k_get_crd_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get deployment  --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe deployment $(p) 2>&1 | tee /tmp/k_desc_deployment_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get endpoints --no-headers -o custom-columns=":metadata.name") ; do kubectl describe endpoints ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_endpoints_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe po ${p} 2>&1 | tee /tmp/k_desc_po_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_replicaset_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_serviceaccount_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_secrets_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_service_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_svc_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

Setelah log dibuat, kompresi semua file output dalam satu bola tar menggunakan perintah di bawah;

	# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*

Jika ukuran file tar lebih besar dari 25 MB, Anda dapat menguploadnya ke Google Drive dan membagikan link-nya kepada kami. Atau Anda dapat menggunakan perintah split untuk memecah file besar menjadi potongan-potongan berukuran 25 MB yang dapat diunggah ke portal Support.

	# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"

Template kasus dan contoh kasus

Bagian ini menyediakan template kasus dan contoh kasus untuk berbagai produk berdasarkan praktik terbaik yang dijelaskan dalam dokumen ini:

Cloud Apigee

Template

Bagian ini menyediakan template contoh untuk Apigee on Google Cloud.

Masalah:

<Berikan deskripsi terperinci tentang masalah atau perilaku yang Anda amati. Sertakan nama dan versi produk jika ada.>

Pesan error:

<Sertakan pesan error lengkap yang diamati (jika ada)>

Masalah waktu mulai (format ISO 8601):

Masalah waktu berakhir (format ISO 8601):

Detail penyiapan Apigee:
Nama organisasi:
Nama Env:
Nama proxy API:
Nomor revisi:

Langkah-langkah untuk mereproduksi bug:

<Berikan langkah-langkah untuk merekonstruksi masalah jika memungkinkan>

Informasi diagnostik:

<Daftar file terlampir>

Contoh kasus

Bagian ini memberikan contoh kasus untuk Apigee on Google Cloud.

Masalah:

Kami melihat tingginya error Layanan Tidak Tersedia 503 di akun Public Cloud kami org. Dapatkah Anda melihat masalah tersebut dan menyelesaikannya atau memberi tahu kami cara mengatasinya?

Pesan error:

{"fault":{"faultstring":"The Service is temporarily available", "detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}

Waktu mulai masalah (format ISO 8601): 2020-10-04 06:30 IST

Waktu berakhir masalah (format ISO 8601): Masalah masih terjadi.

Detail penyiapan Apigee Cloud:
Nama organisasi: myorg
Nama Env: dev
Nama proxy API: myproxy
Nomor revisi: 3

Langkah-langkah untuk mereproduksi bug:

Jalankan perintah curl berikut untuk mereproduksi masalah:

curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'

Informasi diagnostik:

Output alat debug (trace-503.xml)

Hybrid

Template

Bagian ini menyediakan template contoh untuk Apigee Hybrid.

Masalah:

<Berikan deskripsi terperinci tentang masalah atau perilaku yang Anda amati. Sertakan nama dan versi produk jika ada.>

Pesan error:

<Sertakan pesan error lengkap yang diamati (jika ada)>

Masalah waktu mulai (format ISO 8601):

Masalah waktu berakhir (format ISO 8601):

Detail penyiapan Apigee Hybrid:

  • Platform hybrid Apigee:

    <Berikan informasi tentang Platform tempat Anda menginstal hybrid dan versinya.>

  • Project Google Cloud, Organisasi dan Lingkungan hybrid:
    ID project Google Cloud:
    <Jika Anda menggunakan Google Kubernetes Engine (GKE), pastikan Anda memberikan project ID tempat cluster berada. Jika Anda menggunakan GKE lokal, Azure Kubernetes Service, atau Amazon EKS, lalu berikan project ID tempat Anda sedang mengirim log.>
    Organisasi Apigee Hybrid:
    Apigee Hybrid env:
  • Apigee Hybrid dan versi CLI lainnya:
    Versi CLI hybrid Apigee (apigeectl):
    Versi Kubectl:
  • Detail nama cluster Kubernetes:
    k8sCluster: Nama
    : Region
    :
  • Topologi jaringan:
    <Lampirkan topologi jaringan yang menjelaskan penyiapan hybrid Apigee Anda, termasuk pusat data, cluster Kubernetes, namespace, dan pod.>
  • Mengganti File YAML:
    <Lampirkan file YAML Ganti.>

Langkah-langkah untuk mereproduksi

<Berikan langkah-langkah untuk merekonstruksi masalah jika memungkinkan>

Informasi diagnostik:

<Daftar file terlampir>

Contoh kasus

Bagian ini memberikan contoh kasus untuk Apigee Hybrid.

Masalah:

Kita mendapatkan error saat menjalankan API pengelolaan di Apigee hybrid versi 1.3.

Pesan error:

[ERROR] 400 Bad Request
{
"error": {
"code": 400,
"message": "Error processing MART request: INTERNAL_ERROR",
"errors": [
{
"message": "Error processing MART request: INTERNAL_ERROR",
"domain": "global",
"reason": "failedPrecondition"
}
],
"status": "FAILED_PRECONDITION"
}
}

Masalah waktu mulai (format ISO 8601): Sejak 24-10-2020 pukul 10.30 PDT

Waktu berakhir masalah (format ISO 8601): Terus mengamati masalah.

Detail penyiapan Apigee Hybrid:

  • Platform hybrid Apigee
    GKE versi 1.15.1
  • Project Google Cloud, Organisasi dan Lingkungan hybrid
    ID project Google Cloud: apigee-hybrid-123456
      Catatan: Ini adalah project ID tempat cluster berada.
    Organisasi Apigee Hybrid: apigee-hybrid-123456
    Lingkungan hybrid Apigee: dev
  • Apigee Hybrid dan versi CLI lainnya:
    Versi CLI hybrid Apigee (apigeectl):
    Versi: 1.2.0
    Commit: ac09109
    ID Build: 214
    Waktu Pembuatan: 2020-03-30T20:23:36Z
    Versi Go: go1.12

    Versi Kubectl:
    Versi Klien:
    version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:40:16Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"darwin/amd64"}

    Versi Server:
    version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
  • Detail nama cluster Kubernetes:
    k8sCluster: Nama
    : user-cluster-1 Wilayah
    : us-east1
  • Topologi jaringan
    Melampirkan file network-topology.png
  • Mengganti File YAML
    Melampirkan file overrides.yaml

Langkah-langkah untuk mereproduksi bug:

Jalankan API pengelolaan berikut untuk mengamati error:

curl -X GET --header "Authorization: Bearer <TOKEN>" "https://apigee.googleapis.com/v1/organizations/apigee-hybrid-123456/environments/dev/keyvaluemaps"

Informasi Diagnostik:

Terlampir file berikut:

  • network-topology.png
  • overrides.yaml file
  • Log MART
  • Log sinkronisasi