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 akan memudahkan tim Dukungan Google Cloud untuk 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. Tindakan ini memerlukan waktu lebih lama dan dapat menyebabkan keterlambatan dalam penyelesaian masalah. Panduan Praktik Terbaik ini memungkinkan Anda mengetahui informasi yang kami perlukan untuk menyelesaikan kasus dukungan teknis Anda dengan lebih cepat.

Mendeskripsikan masalah

Masalah harus berisi informasi yang menjelaskan detail tentang apa yang terjadi dan apa yang diharapkan terjadi, serta kapan dan bagaimana hal itu terjadi. Kasus dukungan yang baik harus berisi informasi utama berikut 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 mendetail yang menguraikan masalah, termasuk pesan error 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 terjadi.
  • 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

Ada berbagai produk Apigee, yaitu Apigee on Google Cloud dan Apigee hybrid, jadi kami memerlukan informasi spesifik tentang produk mana yang mengalami masalah.

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

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

Deployment proxy API gagal

(Kami perlu mengetahui produk Apigee yang bermasalah.)

Kita mendapatkan 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 error (jika ada) serta perilaku yang diharapkan dan sebenarnya yang diamati.

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

ANJURAN LARANGAN

Proxy edgemicro baru edgemicro_auth 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 proxy menampilkan error atau respons yang tidak diharapkan.)

Klien kami mendapatkan error 500 dengan pesan error berikut 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 Error 500 saat membuat permintaan ke proxy API.

(Hanya menyampaikan Error 500 tidak memberikan informasi yang memadai bagi kami untuk menyelidiki masalahnya. Kita perlu mengetahui pesan error dan kode error sebenarnya yang sedang diamati.)

Waktu

Waktu adalah informasi yang sangat kritis. Penting bagi Engineer Dukungan untuk mengetahui kapan pertama kali masalah ini terjadi, berapa lama masalah ini terjadi, dan apakah masalah tersebut masih terjadi.

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

Tabel berikut menyediakan beberapa contoh yang menampilkan waktu dan durasi yang akurat saat masalah terjadi di kolom DOS, dan informasi yang ambigu atau tidak jelas tentang kapan masalah tersebut terjadi di 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 masalah ini diamati.)

Latensi tinggi diamati pada Proxy API berikut dari 2020-11-09 15:30 IST hingga 2020-11-09 18:10 IST ...

Latensi tinggi diamati di beberapa Proxy API minggu lalu.

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

Penyiapan

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

  • Jika menggunakan Apigee di Google Cloud, Anda mungkin memiliki lebih dari satu organisasi. Oleh karena itu, kami perlu mengetahui organisasi spesifik dan detail lainnya tempat Anda mengamati masalah:
    • Nama Organisasi dan Lingkungan
    • Nama proxy dan nomor revisi API (untuk kegagalan permintaan API)
  • Jika menggunakan campuran, Anda mungkin menggunakan salah satu dari banyak platform hybrid yang didukung dan topologi penginstalan. Jadi, kami perlu mengetahui platform dan topologi hybrid yang Anda gunakan, termasuk detail seperti jumlah pusat data dan node.

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

ANJURAN LARANGAN

401 Error telah meningkat di Apigee on 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 masalah 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
    Apigee hybrid env: dev
  • Detail nama cluster Kubernetes
    k8sCluster:
    nama: user-cluster-1
    region: us-east1
  • Topologi jaringan
    Melampirkan file network-topology.png.
Debug gagal pada Apigee hybrid.

Artefak berguna

Memberikan artefak yang terkait dengan masalah tersebut akan mempercepat penyelesaian karena membantu kami memahami perilaku sebenarnya yang Anda amati dan mendapatkan lebih banyak insight.

Bagian ini menjelaskan beberapa artefak berguna yang berguna untuk semua produk Apigee:

Artefak umum untuk semua produk Apigee

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

Artefak Deskripsi
Men-debug output alat Output alat Debug berisi informasi mendetail 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. Metrik ini 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 apa pun, seperti kegagalan TLS handshake, error 502, 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 platform hybrid yang didukung berikut 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: Versi
    apigeectl
  • Versi Agen Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versi MART Apigee:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versi Apigee Sinkronkanr:
    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: Versi
    kubectl
  • Istio CLI dan versi server: Versi
    istioctl
Topologi jaringan Diagram topologi penginstalan Apigee yang menjelaskan penyiapan 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 tiap cluster pusat data/Kubernetes dan membagikannya kepada 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 mengalami masalah seperti pod yang macet 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 proxy:
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 organisasi Public Cloud kami. 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 proxy: 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, berikan project ID tempat Anda mengirim log.>
    Apigee hybrid org:
    Apigee hybrid env:
  • Apigee hybrid dan versi CLI lainnya:
    Versi Apigee Hybrid CLI (apigeectl):
    Versi Kubernetes:
  • 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 hibrida
    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 Apigee Hybrid (apigeectl):
    Versi: 1.2.0
    Commit: ac09109
    ID Build: 214
    Waktu Build: 2020-03-30T20:23:36Z
    Versi Go: go1.12

    Versi Kubernetes:
    {0 /
    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"}

    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
    region: 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