Best Practices für Google Cloud Apigee-Supportfälle

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
  • Hybridversion
Problemdetails Klare und ausführliche Problembeschreibung, die das Problem zusammen mit der vollständigen Fehlermeldung beschreibt, falls vorhanden.
  • Fehlermeldung
  • Ausgabe des Debugging-Tools
  • Schritte zum Reproduzieren des Problems
  • API-Anfrage/-Befehl abschließen
  • Fehlermeldung
  • Ausgabe des Debugging-Tools
  • Schritte zum Reproduzieren des Problems
  • API-Anfrage/-Befehl abschließen
  • Diagnoseprotokolle der Komponente
  • Cloud Monitoring-Messwerte
Zeit Der spezifische Zeitstempel für den Beginn und das Ende des Problems.
  • Datum, Uhrzeit und Zeitzone des Problems
  • Dauer des Problems
  • Datum, Uhrzeit und Zeitzone des Problems
  • Dauer des Problems
Setup Detaillierte Informationen, unter denen das Problem beobachtet wird.
  • Name der Organisation
  • Env-Name
  • Name des API-Proxys
  • Überarbeitung

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 cqlsh auf Cassandra zugreifen.

(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 edgemicro-Proxy edgemicro_auth schlägt mit folgendem Fehler fehl:

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

Neuer edgemicro-Proxy wurde heute nicht erstellt

(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 500-Fehler mit der folgenden Fehlermeldung:

{"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"}}}

Unsere Clients erhalten 500-Fehler, wenn sie Anfragen an den API-Proxy senden.

(Wenn Sie 500-Fehler einfach nur mitteilen, fehlen uns Informationen, um das Problem zu untersuchen. Wir müssen die tatsächliche Fehlermeldung und den tatsächlich aufgetretenen Fehlercode kennen.)

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 503s gestern um 17:30 Uhr für 5 Minuten beobachtet.

(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

401-Fehler treten in Apigee on Google Cloud seit dem 06.11.2020 um 09:30 Uhr (UTC) häufiger auf.

Details zur Apigee-Einrichtung:

Die Details der fehlgeschlagenen API sind:
Org.-Namen: myorg
Envs: test
API-Proxy-Namen: myproxy
Überarbeitungsnummern: 3

Fehler:

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

401 Fehler sind gestiegen.

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:

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}

Einrichtung von Apigee Hybrid:

  • Apigee Hybrid-Plattform:
    Anthos GKE On-Prem Version 1.4.0
  • Google Cloud-Projekt, Hybrid-Organisation und -Umgebung
    Google Cloud-Projekt-ID: apigee-hybrid-123456
    Apigee Hybrid org: apigee-hybrid-123456
    Apigee Hybrid env: dev
  • Details zum Kubernetes-Clusternamen:
    k8sCluster:
    Name: user-cluster-1
    Region: us-east1
  • Netzwerktopologie
    Hängt die Datei network-topology.png an.
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:
  • GKE
  • GKE On-Prem
  • AKS (Azure Kubernetes Service)
  • Amazon EKS
  • GKE on AWS
Apigee Hybrid und abhängige Komponentenversionen
  • Apigee Hybrid-CLI-Version:
    apigeectl-Version
  • Apigee Connect-Agent-Version:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Apigee MART-Version:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Apigee Synchronizer-Version:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Apigee Cassandra-Version:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Apigee-Laufzeitversion:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • Kubernetes-Befehlszeile und Serverversionen:
    kubectl-Version
  • Istio Befehlszeile und Serverversionen:
    istioctl-Version
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:

kubectl get pods -A
kubectl get services -A

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:

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

  • Apigee Connect-Agent-Logs:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • MART Logs:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Synchronizer Logs:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Apigee Cassandra-Logs:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • MP/Apigee-Laufzeitlogs (von allen Apigee-Laufzeit-Pods):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Logs beschreiben

Detaillierte Informationen zum Pod.

Dies ist insbesondere dann hilfreich, wenn Probleme wie Pods auftreten, die im Status CrashLoopBackoff hängen bleiben.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Link zu Ihrem Messwert-Dashboard
  • Snapshots von Dashboards im Zusammenhang mit Cloud Monitoring-Messwerten.

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

Sobald Logs generiert wurden, komprimieren Sie die gesamte Ausgabedatei mit dem folgenden Befehl in eine einzige TAR-Datei.

	# 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 Datei network-topology.png an
  • Überschreibt YAML-Datei
    Hängt die Datei overrides.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