Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.
Wenn Sie im Supportfall detaillierte und erforderliche Informationen angeben, ist es für das Google Cloud-Supportteam leichter, Ihnen schnell und effizient zu antworten. Wenn in Ihrem Support kritische Details fehlen, müssen wir nach weiteren Informationen fragen, was unter Umständen mehrmals erforderlich ist. Dieser Vorgang dauert länger und kann zu Verzögerungen bei der Problembehebung führen. In diesem Best Practices-Leitfaden erfahren Sie, welche Informationen wir benötigen, um Ihren technischen Supportfall schneller bearbeiten zu können.
Problem beschreiben
Die Beschreibung des Problems sollte Informationen dazu enthalten, was geschehen ist, was hätte geschehen sollen und wann und wie das Problem aufgetreten ist. Ein guter Supportfall sollte die folgenden wichtigen Informationen zu jedem Apigee-Produkt enthalten:
Schlüsselinformationen | Beschreibung | Apigee in Google Cloud | Apigee hybrid |
---|---|---|---|
Produkt | Bestimmtes Apigee-Produkt, in dem das Problem auftritt, einschließlich Versionsinformationen, falls zutreffend |
|
|
Problemdetails | Klare und ausführliche Problembeschreibung, die das Problem zusammen mit der vollständigen Fehlermeldung beschreibt, falls vorhanden. |
|
|
Zeit | Der spezifische Zeitstempel für den Beginn und das Ende des Problems. |
|
|
Setup | Detaillierte Informationen, unter denen das Problem beobachtet wird. |
|
|
In den folgenden Abschnitten sind diese Konzepte detaillierter beschrieben.
Produkt
Es gibt verschiedene Apigee-Produkte, Apigee in Google Cloud und Apigee Hybrid. Daher benötigen wir genaue Informationen darüber, bei welchem Produkt das Problem auftritt.
Die folgende Tabelle enthält einige Beispiele für vollständige Informationen in der Spalte DOs und unvollständige Informationen in der Spalte DON'Ts:
DOs | DON'Ts |
---|---|
Die Bereitstellung des API-Proxys OAuth2 ist in unserer Apigee on Google Cloud-Organisation fehlgeschlagen ... |
Bereitstellung des API-Proxys fehlgeschlagen (Wir müssen das Apigee-Produkt kennen, in dem das Problem auftritt.) |
Beim Zugriff auf Cassandra mit cqlsh in Apigee Hybrid Version 1.3 wird der folgende Fehler angezeigt... |
Wir können nicht mit (Informationen zur Hybridversion fehlen) |
Problemdetails
Geben Sie genaue Informationen zum beobachteten Problem an, einschließlich der Fehlermeldung (falls vorhanden) und des erwarteten und tatsächlichen Verhaltens.
Die folgende Tabelle enthält einige Beispiele für vollständige Informationen in der Spalte DOs und unvollständige Informationen in der Spalte DON'Ts:
DOs | DON'Ts |
---|---|
Neuer
|
Neuer (Der Proxyname ist unbekannt. Es ist nicht klar, ob der Proxy einen Fehler oder eine unerwartete Antwort zurückgibt.) |
Unsere Clients erhalten bei Anfragen an den API-Proxy
|
Unsere Clients erhalten
(Wenn Sie |
Zeit
Die Zeit ist sehr wichtig. Der Support-Entwickler muss wissen, wann Sie das Problem erstmals bemerkt haben, wie lange es anhielt und ob das Problem weiterhin auftritt.
Der Support-Entwickler, der das Problem bearbeitet, befindet sich möglicherweise nicht in Ihrer Zeitzone. Daher erschweren relative Aussagen des Zeitraums die Diagnose des Problems. Es wird daher empfohlen, für das Datum und den Zeitstempel das ISO 8601-Format zu verwenden, um genaue Angaben dazu bereitzustellen, wann das Problem beobachtet wurde.
Die folgende Tabelle enthält einige Beispiele, die den genauen Zeitpunkt und die Dauer des Auftretens des Problems in der Spalte DOs und mehrdeutige oder unklare Informationen darüber, wann das Problem auftrat, in der Spalte DON'Ts zeigen:
DOs | DON'Ts |
---|---|
Riesige Anzahl von 503s wurde gestern zwischen dem 06.11.2020 um 17:30 Uhr (UTC) und dem 06.11.2020 um 17:35 Uhr (UTC) beobachtet... |
Riesige Anzahl von (Die Verwendung des implizierten Datums ist zwingend erforderlich. Außerdem ist unklar, in welcher Zeitzone das Problem beobachtet wurde.) |
Starke Latenzen wurden bei den folgenden API-Proxys von 09.11.2020, 15:30 IST, bis zum 09.11.2020 um 18:10 IST beobachtet ... |
In der letzten Woche wurden bei einigen API-Proxys hohe Latenzen beobachtet. Dabei ist nicht ersichtlich, an welchem Tag und zu welcher Uhrzeit dieses Problem in der letzten Woche aufgetreten ist. |
Einrichtung
Wir benötigen genaue Angaben dazu, wo genau das Problem auftritt. Je nach verwendetem Produkt benötigen wir die folgenden Informationen:
- Wenn Sie mit Apigee in Google Cloud arbeiten, haben Sie möglicherweise mehrere Organisationen. Wir müssen die Organisation (und andere Details) kennen, bei der das Problem beobachtet wurde:
- Organisations- und Umgebungsnamen
- API-Proxyname und Revisionsnummern (bei API-Anfragefehlern)
- Wenn Sie Hybrid verwenden, verwenden Sie möglicherweise eine der vielen unterstützten Hybridplattformen und Installationstopologien. Wir müssen wissen, welche Hybridplattform und Topologie Sie verwenden, einschließlich der Details wie Anzahl der Rechenzentren und Knoten.
Die folgende Tabelle enthält einige Beispiele für vollständige Informationen in der Spalte DOs und unvollständige Informationen in der Spalte DON'Ts:
DOs | DON'Ts |
---|---|
Details zur Apigee-Einrichtung:
Die Details der fehlgeschlagenen API sind:
Fehler:
|
Er enthält keine Informationen über das verwendete Produkt, da das Problem beobachtet wird, sowie keine Konfigurationsdetails. |
Debug schlägt mit dem folgenden Fehler in Apigee Hybrid 1.3 fehl Fehler:
Einrichtung von Apigee Hybrid:
| Debugging schlägt in Apigee Hybrid fehl. |
Nützliche Artefakte
Die Bereitstellung von Artefakten, die mit dem Problem zusammenhängen, beschleunigt die Problemlösung, da wir so das Verhalten besser nachvollziehen und analysieren können.
In diesem Abschnitt werden einige nützliche Artefakte beschrieben, die für alle Apigee-Produkte hilfreich sind:
Gängige Artefakte für alle Apigee-Produkte
Die folgenden Artefakte sind für alle Apigee-Produkte nützlich: Apigee on Google Cloud und Apigee Hybrid:
Artefakt | Beschreibung |
---|---|
Ausgabe des Debugging-Tools | Die Ausgabe des Debug-Tools enthält detaillierte Informationen zu den API-Anfragen, die durch Apigee-Produkte fließen. Dies ist bei Laufzeitfehlern wie 4XX , 5XX und Latenzproblemen hilfreich. |
Screenshots | Screenshots vermitteln den Kontext des tatsächlichen Verhaltens oder beobachteten Fehlers. Sie ist hilfreich, wenn Fehler oder Probleme beobachtet werden, etwa in der Benutzeroberfläche oder in Analytics. |
HAR (Http ARchive) | HAR ist eine Datei, die von HTTP-Sitzungstools für die Behebung von Problemen mit der Benutzeroberfläche erfasst wird. Dies kann mit Browsern wie Chrome, Firefox oder Internet Explorer erfasst werden. |
tcpdumps |
Das tcpdump -Tool erfasst TCP/IP-Pakete, die über das Netzwerk übertragen oder empfangen werden. Dies ist bei netzwerkbezogenen Problemen wie TLS-Handshake-Fehlern, 502 -Fehlern und Latenzproblemen usw. |
Zusätzliche Artefakte für Hybrid
Für Hybrid benötigen wir möglicherweise zusätzliche Artefakte, die eine schnellere Diagnose von Problemen ermöglichen.
Artefakt | Beschreibung |
---|---|
Plattform von Apigee Hybrid | Geben Sie eine der folgenden
unterstützten Hybridplattformen an:
|
Apigee Hybrid und abhängige Komponentenversionen |
|
Netzwerktopologie | Das Apigee-Installationstopologiediagramm zur Beschreibung Ihrer Hybrideinrichtung mit allen Rechenzentren, Kubernetes-Clustern, Namespaces und Pods. |
Überschreibt YAML-Datei | Die Datei overrides.yaml , die in jedem Rechenzentrum zum Installieren der Apigee Hybrid-Laufzeitebene verwendet wird.
|
Status der Bereitstellung von Apigee Hybrid |
Die Ausgabe der folgenden Befehle in jedem Rechenzentrum/Kubernetes-Cluster:
|
Apigee Hybrid-Komponentenkomponenten |
Geben Sie Links zu den Stackdriver-Logs für die Hybrid-Komponenten an ODER Sie können die Protokolle der Apigee Hybrid-Komponenten mit den folgenden Befehlen in jedem Rechenzentrum/Kubernetes-Cluster abrufen und mit uns teilen:
|
Logs beschreiben |
Detaillierte Informationen zum Pod. Dies ist insbesondere dann hilfreich, wenn Probleme wie Pods auftreten, die im Status
|
Cloud Monitoring |
|
Von Apigee Hybrid zu erfassende Daten
Sie können auch das Skript Zu erfassen basierend auf den unten aufgeführten Befehlen ausführen.
###--- "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
# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*
Wenn die TAR-Datei größer als 25 MB ist, können Sie sie auf Google Drive hochladen und den Link mit uns teilen. Alternativ können Sie große Dateien mit dem Aufteilungsbefehl in 25-MB-Blöcke aufteilen, die in das Supportportal hochgeladen werden können.
# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"
Fallvorlagen und Beispielfälle
Dieser Abschnitt enthält Fallvorlagen und Beispielfälle für verschiedene Produkte gemäß den in diesem Dokument beschriebenen Best Practices:
Apigee Cloud
Vorlage
Dieser Abschnitt enthält eine Beispielvorlage für Apigee in Google Cloud.
Problem:
<Geben Sie eine detaillierte Beschreibung des Problems oder des beobachteten Verhaltens an. Geben Sie den Produktnamen und die Version an, falls zutreffend.>
Fehlermeldung:
<Geben Sie die vollständige angezeigte Fehlermeldung an (falls vorhanden)>
Problemstartzeit (ISO 8601-Format):
Problemendzeit (ISO 8601-Format):
Apigee-Einrichtungsdetails:
Org.-Namen:
Umg.-Namen:
API-Proxy-Namen:
Revisionsnummern:
Zu reproduzierende Schritte:
<Geben Sie nach Möglichkeit Schritte zum Reproduzieren des Problems an>
Diagnosedaten:
<Liste der angehängten Dateien>
Beispielfall
Dieser Abschnitt enthält einen Beispielfall für Apigee in Google Cloud.
Problem:
In der Public Cloud-Organisation werden viele 503-Dienstfehler nicht angezeigt. Können Sie sich das Problem genauer ansehen oder es beheben oder uns eine Lösung vorschlagen?
Fehlermeldung:
{"fault":{"faultstring":"The Service is temporarily available", "detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}
Problemstartzeit (ISO 8601-Format): 2020-04-06:30 ISSST
Problemendzeit (ISO 8601-Format): Das Problem besteht weiterhin.
Edge-Cloud-Einrichtungsdetails:
Org.-Namen: myorg
Umg.-Namen: dev
API-Proxy-Namen: myproxy
Revisionsnummern: 3
Zu reproduzierende Schritte:
Führen Sie den folgenden curl
-Befehl aus, um das Problem zu reproduzieren:
curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'
Diagnosedaten:
Ausgabe des Debugging-Tools (trace-503.xml
)
Hybrid
Vorlage
Dieser Abschnitt enthält eine Beispielvorlage für Apigee Hybrid.
Problem:
<Geben Sie eine detaillierte Beschreibung des Problems oder des beobachteten Verhaltens an. Geben Sie den Produktnamen und die Version an, falls zutreffend.>
Fehlermeldung:
<Geben Sie die vollständige angezeigte Fehlermeldung an (falls vorhanden)>
Problemstartzeit (ISO 8601-Format):
Problemendzeit (ISO 8601-Format):
Einrichtung von Apigee Hybrid:
- Apigee Hybrid-Plattform:
<Informationen für die Plattform bereitstellen, auf der Sie Hybrid und die zugehörige Version installiert haben>
- Google Cloud-Projekt, hybride Organisation und Umgebung:
Google Cloud-Projekt-ID:
<Wenn Sie Google Kubernetes Engine (GKE) verwenden), müssen Sie die Projekt-ID angeben, in der sich die Cluster befinden. Wenn Sie GKE On-Prem, Azure Kubernetes Service oder Amazon EKS verwenden, geben Sie die Projekt-ID an, an die Sie die Logs senden möchten.>
Apigee hybrid org:
Apigee hybrid env: - Apigee Hybrid und andere CLI-Versionen:
Apigee Hybrid CLI (apigeectl
)-Version:
Kubectl-Version: - Details zum Kubernetes-Clusternamen:
k8sCluster:
Name:
Region: - Netzwerktopologie:
<Fügen Sie die Netzwerktopologie hinzu, die die Einrichtung Ihres Apigee-Hybridnetzwerks einschließlich Rechenzentren, Kubernetes-Clustern, Namespaces und Pods beschreibt.> - Überschreibt die YAML-Datei:
<Anhängen der YAML-Datei anhängen>
Zu reproduzierende Schritte
<Geben Sie nach Möglichkeit Schritte zum Reproduzieren des Problems an>
Diagnosedaten:
<Liste der angehängten Dateien>
Beispielfall
Dieser Abschnitt enthält einen Beispielfall für Apigee Hybrid.
Problem:
Beim Ausführen von Management-APIs in Apigee Hybrid 1.3 werden Fehler ausgegeben.
Fehlermeldung:
[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" } }
Problemstartzeit (ISO 8601-Format): Seit 24.10.2020, 10:30 Uhr PDT
Problemendzeit (ISO 8601-Format): Das Problem wird fortgesetzt.
Einrichtung von Apigee Hybrid:
- Apigee Hybrid-Plattform
GKE-Version 1.15.1 - Google Cloud-Projekt, Hybrid-Organisation und -Umgebung
Google Cloud-Projekt-ID:apigee-hybrid-123456
Hinweis: Das ist die ID des Projekts, in dem sich die Cluster befinden
Apigee hybrid org:apigee-hybrid-123456
Apigee hybrid env:dev
- Apigee Hybrid und andere CLI-Versionen:
Version von Apigee Hybrid CLI (apigeectl
):
Version:1.2.0
Commit:ac09109
Build-ID:214
Build-Zeit:2020-03-30T20:23:36Z
Go-Version:go1.12
Kubectl-Version:
Clientversion: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"}
Serverversion:version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
- Details zum Kubernetes-Clusternamen:
k8sCluster:
Name:user-cluster-1
Region:us-east1
- Netzwerktopologie
Hängt die Dateinetwork-topology.png
an - Überschreibt YAML-Datei
Hängt die Dateioverrides.yaml
an
Zu reproduzierende Schritte:
Führen Sie die folgende Verwaltungs-API aus, um den Fehler zu beobachten:
curl -X GET --header "Authorization: Bearer <TOKEN>" "https://apigee.googleapis.com/v1/organizations/apigee-hybrid-123456/environments/dev/keyvaluemaps"
Diagnosedaten:
Folgende Dateien wurden angehängt:
network-topology.png
overrides.yaml file
- MART-Logs
- Synchronizer-Logs