Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Lihat dokumentasi
Apigee Edge.
Memberikan informasi yang mendetail dan diperlukan dalam kasus dukungan akan mempermudah tim Dukungan Google Cloud merespons Anda dengan cepat dan efisien. Jika kasus dukungan Anda tidak memiliki detail penting, kami perlu meminta informasi lebih lanjut, yang mungkin melibatkan komunikasi berulang beberapa kali. Cara ini membutuhkan waktu lebih lama dan dapat menyebabkan keterlambatan dalam penyelesaian masalah. Panduan Praktik Terbaik ini memberi tahu Anda informasi yang kami perlukan untuk menyelesaikan kasus dukungan teknis Anda lebih cepat.
Menjelaskan masalah
Masalah harus berisi informasi yang menjelaskan detail tentang apa yang terjadi versus 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 tempat masalah diamati, termasuk informasi versi jika berlaku. |
|
|
| Detail masalah | Deskripsi masalah yang jelas dan mendetail yang menguraikan masalahnya, termasuk pesan error lengkap, jika ada. |
|
|
| Waktu | Stempel waktu spesifik saat masalah dimulai dan berapa lama berlangsung. |
|
|
| Penyiapan | Informasi mendetail tentang tempat masalah diamati. |
|
|
Bagian berikut menjelaskan konsep ini secara lebih mendetail.
Produk
Ada berbagai produk Apigee, Apigee di Google Cloud dan Apigee hybrid, jadi kami memerlukan informasi spesifik tentang produk tertentu yang mengalami masalah.
Tabel berikut memberikan beberapa contoh yang menunjukkan informasi lengkap di kolom LAKUKAN, dan informasi tidak lengkap di kolom JANGAN LAKUKAN:
| ANJURAN | LARANGAN |
|---|---|
Deployment proxy API OAuth2 gagal di organisasi
Apigee di Google Cloud kami ... |
Deployment proxy API gagal (Kami perlu mengetahui produk Apigee tempat Anda melihat masalah tersebut.) |
Kami mendapatkan error berikut saat mengakses Cassandra menggunakan
cqlsh di Apigee hybrid versi 1.3 ... |
Kami tidak dapat mengakses Cassandra menggunakan (Informasi versi hybrid tidak ada) |
Detail masalah
Berikan informasi yang tepat tentang masalah yang diamati, termasuk pesan error (jika ada) serta perilaku yang diharapkan dan yang diamati.
Tabel berikut memberikan beberapa contoh yang menunjukkan informasi lengkap di kolom BOLEH, dan informasi tidak lengkap di kolom TIDAK BOLEH:
| ANJURAN | LARANGAN |
|---|---|
|
Proxy
|
Proxy (Nama proxy tidak diketahui. Tidak jelas apakah proxy menampilkan error atau respons yang tidak terduga.) |
|
Klien kami mendapatkan error
|
Klien kami mendapatkan Error
(Hanya menyampaikan Error |
Waktu
Waktu adalah informasi yang sangat penting. Penting bagi Engineer Dukungan untuk mengetahui kapan Anda pertama kali melihat masalah ini, berapa lama masalah tersebut berlangsung, dan apakah masalahnya masih berlanjut.
Engineer Dukungan yang menyelesaikan masalah mungkin tidak berada di zona waktu Anda, sehingga pernyataan waktu yang bersifat relatif membuat masalah lebih sulit didiagnosis. Oleh karena itu, sebaiknya gunakan format ISO 8601 untuk stempel tanggal dan waktu guna memberikan informasi waktu yang tepat saat masalah diamati.
Tabel berikut memberikan beberapa contoh yang menunjukkan waktu dan durasi akurat terjadinya masalah di kolom BOLEH, dan informasi yang ambigu atau tidak jelas tentang kapan masalah terjadi di kolom TIDAK BOLEH:
| ANJURAN | LARANGAN |
|---|---|
Sejumlah besar 503s diamati kemarin antara
2020-11-06 17.30 PDT dan 2020-11-06 17.35 PDT... |
Sejumlah besar (Kita harus menggunakan tanggal yang tersirat dan tidak jelas juga di zona waktu mana masalah ini terjadi.) |
| Latensi tinggi diamati pada Proxy API berikut dari 2020-11-09 15.30 IST hingga 2020-11-09 18.10 IST ... |
Latensi tinggi diamati pada beberapa Proxy API minggu lalu. (Tidak jelas pada hari dan durasi berapa masalah ini diamati dalam seminggu terakhir.) |
Penyiapan
Kami perlu mengetahui detail tentang di mana tepatnya Anda melihat masalah tersebut. 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 tertentu dan detail lainnya tempat Anda mengamati masalah tersebut:
- Nama Organisasi dan Lingkungan
- Nama proxy API dan nomor revisi (untuk kegagalan permintaan API)
- Jika menggunakan hybrid, Anda dapat menggunakan salah satu dari banyak platform hybrid dan topologi penginstalan yang didukung. Jadi, kami perlu mengetahui platform dan topologi hybrid yang Anda gunakan, termasuk detailnya seperti jumlah pusat data dan node.
Tabel berikut memberikan beberapa contoh yang menunjukkan informasi lengkap di kolom YANG BOLEH, dan informasi tidak lengkap di kolom YANG TIDAK BOLEH:
| ANJURAN | LARANGAN |
|---|---|
|
Detail penyiapan Apigee:
Detail API yang gagal adalah sebagai berikut:
Error:
|
(Tidak memberikan informasi apa pun tentang produk yang digunakan, sejak kapan masalah tersebut diamati, atau detail penyiapan apa pun.) |
Proses debug gagal dengan error berikut di Apigee hybrid versi 1.3 Error:
Detail penyiapan Apigee Hybrid:
| Proses debug gagal di Apigee Hybrid. |
Artefak berguna
Dengan memberikan artefak yang terkait dengan masalah tersebut, penyelesaian masalah akan lebih cepat karena kami dapat memahami persis perilaku yang Anda amati dan mendapatkan lebih banyak insight tentangnya.
Bagian ini menjelaskan beberapa artefak berguna yang bermanfaat untuk 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 |
|---|---|
| Output alat debug | Output alat Debug berisi informasi mendetail tentang permintaan API yang mengalir melalui
produk Apigee. Hal ini berguna untuk error runtime apa pun seperti 4XX,
5XX, dan masalah latensi. |
| Screenshot | Screenshot membantu menyampaikan konteks perilaku atau error sebenarnya yang diamati. Hal ini berguna untuk mengetahui error atau masalah yang diamati, seperti di UI atau Analytics. |
| HAR (Http ARchive) | HAR adalah file yang direkam oleh alat sesi HTTP untuk men-debug masalah terkait UI. Hal ini dapat direkam menggunakan browser seperti Chrome, Firefox, atau Internet Explorer. |
tcpdumps |
Alat tcpdump merekam paket TCP/IP yang ditransfer atau diterima melalui
jaringan. Hal ini berguna untuk masalah terkait jaringan seperti kegagalan handshake TLS,
error 502, dan masalah latensi, dll. |
Artefak tambahan untuk hybrid
Untuk hybrid, kami mungkin memerlukan beberapa artefak tambahan yang akan memfasilitasi diagnosis masalah yang lebih cepat.
| Artefak | Deskripsi |
|---|---|
| Platform Apigee Hybrid | Tentukan salah satu
platform hybrid yang didukung yang digunakan:
|
| Versi komponen dependen dan Apigee Hybrid |
|
| Topologi jaringan | Diagram topologi penginstalan Apigee yang menjelaskan penyiapan hybrid Anda, termasuk semua pusat data, cluster Kubernetes, namespace, dan pod. |
| File YAML Penggantian | File overrides.yaml yang digunakan di setiap pusat data untuk menginstal bidang runtime hybrid Apigee.
|
| Status deployment Apigee Hybrid |
Output dari perintah berikut di setiap pusat data/cluster Kubernetes:
|
| Log komponen Apigee Hybrid |
Berikan link ke log Cloud Operations (StackDriver) untuk komponen hybrid ATAU Anda dapat mengambil log komponen Apigee hybrid menggunakan perintah berikut di setiap pusat data/cluster Kubernetes dan membagikannya kepada kami:
|
| Mendeskripsikan log |
Informasi mendetail tentang pod. Hal ini berguna terutama jika Anda mengamati masalah seperti pod yang macet dalam status
|
| Cloud Monitoring |
|
Pengumpulan data wajib Apigee Hybrid
Anda juga dapat menjalankan skrip Must-Gather 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 -o yaml 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 sr -n apigee -o wide 2>&1 | tee /tmp/k_get_sr_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
# 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 linknya kepada kami. Atau, Anda dapat menggunakan perintah split untuk memecah file besar menjadi beberapa bagian berukuran 25 MB yang dapat diupload ke portal Dukungan.
# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"
Pengumpulan data penting Cassandra Apigee Hybrid
Mengumpulkan data dasar
Berikan informasi berikut:
- Platform Apigee Hybrid (GKE, GKE On-Prem, AKS, EKS, dll.)
- Versi Apigee Hybrid
- ID project Google Cloud
- Organisasi Apigee Hybrid
- Lingkungan Apigee Hybrid
- Apakah ini deployment satu region atau multi-region?
- File
overrides.yaml(satu untuk setiap cluster) - Berapa banyak organisasi Apigee hybrid yang diinstal pada satu cluster?
- Apakah ada perubahan terbaru?
Mengumpulkan informasi proses debug Cassandra
Run the below script to capture Cassandra debugging information from an Apigee hybrid cluster: # Create a temporary directory to store the Cassandra debugging information. mkdir /tmp/apigee-cassandra-debug-info/ # Loop through all Cassandra pods for APIGEE_CASSANDRA_POD in $(kubectl -n apigee get pods -l app=apigee-cassandra --no-headers -o custom-columns=":metadata.name") ; do # Get Cassandra version kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD version' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_version_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra datacenter status kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_status_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra cluster information kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD describecluster' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_describecluster_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get current ring/token status across the datacenter kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD ring' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_ring_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get more information about heap usage, uptime, exceptions, etc kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD info' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_info_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get gossip info kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gossipinfo' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gossipinfo_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra compaction details kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionhistory' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionhistory_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getcompactionthroughput' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getcompactionthroughput_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getconcurrentcompactors' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getconcurrentcompactors_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get status of current Cassandra operations kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tpstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tpstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD netstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_netstat_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gcstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gcstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get proxy histograms (shows the full request latency recorded by the coordinator) kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD proxyhistograms' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_proxyhistograms_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt done # compress all collected data tar -czvf apigee-cassandra-debug-info-$(date +%Y.%m.%d_%H.%M.%S).tar.gz -C /tmp apigee-cassandra-debug-info
Template kasus dan contoh kasus
Bagian ini menyediakan template kasus dan contoh kasus untuk berbagai produk berdasarkan praktik terbaik yang dijelaskan dalam dokumen ini:
Apigee Cloud
Template
Bagian ini menyediakan template contoh untuk Apigee di Google Cloud.
Masalah:
<Berikan deskripsi mendetail tentang masalah atau perilaku yang diamati di pihak Anda. Sertakan nama dan versi produk jika berlaku.>
Pesan error:
<Sertakan pesan error lengkap yang diamati (jika ada)>
Waktu mulai masalah (format ISO 8601):
Waktu berakhir masalah (format ISO 8601):
Detail penyiapan Apigee:
Nama org:
Nama env:
Nama proxy API:
Nomor revisi:
Langkah-langkah untuk mereproduksi:
<Berikan langkah-langkah untuk mereproduksi masalah jika memungkinkan>
Informasi diagnostik:
<List of files attached>
Contoh kasus
Bagian ini memberikan contoh kasus untuk Apigee di Google Cloud.
Masalah:
Kami melihat banyak error 503 Service Unavailable di org. Public Cloud kami. Bisakah Anda menyelidiki masalah ini dan menyelesaikannya atau memberi tahu kami cara menyelesaikannya?
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 org: myorg
Nama env: dev
Nama proxy API: myproxy
Nomor revisi: 3
Langkah-langkah untuk mereproduksi:
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 mendetail tentang masalah atau perilaku yang diamati di pihak Anda. Sertakan nama dan versi produk jika berlaku.>
Pesan error:
<Sertakan pesan error lengkap yang diamati (jika ada)>
Waktu mulai masalah (format ISO 8601):
Waktu berakhir masalah (format ISO 8601):
Detail penyiapan Apigee Hybrid:
- Platform Apigee Hybrid:
<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 ID project tempat cluster berada. Jika Anda menggunakan GKE on-prem, Azure Kubernetes Service, atau Amazon EKS, berikan project ID tempat Anda mengirim log.>
Org hybrid Apigee:
Lingkungan hybrid Apigee: - Apigee hybrid dan versi CLI lainnya:
Versi CLI (apigeectl) Apigee hybrid:
Versi Kubectl: - Detail nama cluster Kubernetes:
k8sCluster:
name:
region: - Topologi jaringan:
<Lampirkan topologi jaringan yang menjelaskan penyiapan Apigee Hybrid Anda, termasuk pusat data, cluster Kubernetes, namespace, dan pod.> - File YAML Penggantian:
<Lampirkan file YAML Penggantian.>
Langkah-langkah untuk mereproduksi
<Berikan langkah-langkah untuk mereproduksi masalah jika memungkinkan>
Informasi diagnostik:
<List of files attached>
Contoh kasus
Bagian ini memberikan contoh kasus untuk Apigee Hybrid.
Masalah:
Kami 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"
}
}
Waktu mulai masalah (format ISO 8601): Sejak 24-10-2020 10.30 PDT
Waktu berakhir masalah (format ISO 8601): Masih mengamati masalah ini.
Detail penyiapan Apigee Hybrid:
- Platform Apigee Hybrid
GKE versi 1.15.1 - Project Google Cloud, Organisasi dan Lingkungan Hybrid
Project ID Google Cloud:apigee-hybrid-123456
Catatan: Ini adalah project ID tempat cluster berada.
Org Apigee Hybrid:apigee-hybrid-123456
Env Apigee Hybrid: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 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:
name:user-cluster-1
region:us-east1 - Topologi jaringan
Melampirkan filenetwork-topology.png - Mengganti File YAML
Melampirkan fileoverrides.yaml
Langkah-langkah untuk mereproduksi:
Jalankan Management API 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:
Melampirkan file berikut:
network-topology.pngoverrides.yaml file- Log MART
- Log sinkronisasi