Bonnes pratiques relatives aux demandes d'assistance Google Cloud Apigee

Vous consultez la documentation d'Apigee et d'Apigee hybrid.
Consultez la documentation d'Apigee Edge.

En fournissant des informations détaillées et requises dans la demande d'assistance, vous permettez à l'équipe d'assistance de Google Cloud de vous répondre avec rapidité et efficacité. Dans le cas contraire, nous devons demander des informations supplémentaires, impliquant plusieurs échanges. Cela prend plus de temps et peut entraîner des retards de résolution. Ce guide des bonnes pratiques vous indique les informations dont nous avons besoin pour résoudre votre demande d'assistance technique plus rapidement.

Décrire le problème

Un problème doit contenir des informations expliquant ce qui s'est passé et ce qui aurait dû se passer, ainsi que la date et l'origine du problème. Une bonne demande d'assistance doit contenir les informations clés suivantes pour chacun des produits Apigee :

Informations clés Description Apigee sur Google Cloud Apigee hybrid
Produit Produit Apigee dans lequel le problème est observé, y compris les informations de version le cas échéant.
  • Version hybride
Informations sur le problème Description claire et détaillée du problème, y compris le message d'erreur complet, le cas échéant.
  • Message d'erreur
  • Résultat de l'outil Debug
  • Étapes permettant de reproduire le problème
  • Requête/commande API complète
  • Message d'erreur
  • Résultat de l'outil Debug
  • Étapes permettant de reproduire le problème
  • Requête/commande API complète
  • Journaux de diagnostic des composants
  • Métriques Cloud Monitoring
Heure Horodatage spécifique indiquant le début du problème et sa durée.
  • Date, heure et fuseau horaire de l'occurrence du problème
  • Durée du problème
  • Date, heure et fuseau horaire de l'occurrence du problème
  • Durée du problème
Prérequis Informations détaillées de l'endroit où le problème est observé.
  • Nom de l'organisation
  • Nom de l'environnement
  • Nom de proxy d'API
  • Révision

Ces concepts sont décrits plus en détail dans les sections suivantes.

Produit

Il existe différents produits Apigee, Apigee sur Google Cloud et Apigee hybrid. Nous avons donc besoin d'informations spécifiques sur le produit qui rencontre un problème.

Le tableau suivant contient des exemples d'informations complètes dans la colonne À FAIRE et des informations incomplètes dans la colonne À NE PAS FAIRE :

À FAIRE
Le déploiement du proxy d'API OAuth2 a échoué sur notre organisation Apigee sur Google Cloud

Échec du déploiement du proxy d'API

(Nous devons connaître le produit Apigee dans lequel vous rencontrez le problème.)

L'erreur suivante est renvoyée lors de l'accès à Cassandra à l'aide de cqlsh sur la version hybride 1.3 d'Apigee

Impossible d'accéder à Cassandra avec cqlsh.

(Informations sur la version hybride manquantes)

Informations sur le problème

Fournissez des informations précises sur le problème observé, y compris le message d'erreur (le cas échéant), le comportement attendu et le comportement réel observé.

Le tableau suivant contient des exemples d'informations complètes dans la colonne À FAIRE et des informations incomplètes dans la colonne À NE PAS FAIRE :

À FAIRE

Le nouveau proxy edgemicro edgemicro_auth échoue avec l'erreur suivante :

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

Le proxy edgemicro créé aujourd'hui ne fonctionne pas

(Le nom du proxy est inconnu. Nous ne savons pas si le proxy renvoie une erreur ou une réponse inattendue).

Nos clients reçoivent des erreurs 500 avec le message d'erreur suivant lorsqu'ils envoient des requêtes au proxy d'API :

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

Nos clients reçoivent des erreurs 500 lorsqu'ils envoient des requêtes au proxy d'API.

(Le simple fait de transmettre des erreurs 500 ne nous permet pas d'examiner le problème. Nous avons besoin de connaître le message d'erreur et le code d'erreur en cours d'observation.)

Temps

L'heure est une information essentielle. Il est important que l'ingénieur du service d'assistance sache quand vous avez rencontré ce problème pour la première fois, sa durée et l'éventuelle persistance du problème.

Il est possible que l'ingénieur du service d'assistance en charge de la résolution du problème se trouve dans un fuseau horaire différent du vôtre. Par conséquent, les déclarations relatives sur le temps rendent le problème plus difficile à diagnostiquer. Il est donc recommandé d'utiliser le format ISO 8601 pour la date et l'heure afin d'indiquer le moment exact auquel le problème a été observé.

Le tableau suivant fournit des exemples indiquant des informations exactes concernant l'heure et la durée du problème dans la colonne À FAIRE et des informations ambiguës ou peu claires dans la colonne À NE PAS FAIRE :

À FAIRE
Une nombre important de 503s ont été observés hier entre2020-11-06 17:30 PDT et 2020-11-06 17:35 PDT...

Un nombre important de 503s ont été observés hier à 17h30 pendant 5 minutes.

(Nous sommes obligés d'utiliser la date implicite et le fuseau horaire dans lequel ce problème a été observé n'est pas clair.)

Des latences élevées ont été observées sur les proxys d'API suivants du 2020-11-09 15:30 IST au 2020-11-09 18:10 IST ...

Des latences élevées ont été observées sur certains proxys d'API la semaine dernière.

(La date, l'heure et la durée de ce problème sont incertaines.)

Préparation

Nous avons besoin de détails sur l'emplacement exact du problème. Selon le produit que vous utilisez, nous avons besoin des informations suivantes :

  • Si vous utilisez Apigee Cloud, vous pouvez avoir plusieurs organisations. Nous devons donc connaître l'organisation et d'autres détails concernant le problème :
    • Noms des organisations et des environnements
    • Nom du proxy d'API et numéros de révision (pour les échecs de requêtes d'API)
  • Si vous utilisez une architecture hybride, vous utilisez peut-être l'une des nombreuses plates-formes hybrides compatibles et des topologies d'installation. Nous devons donc connaître la plate-forme hybride et la topologie que vous utilisez, y compris des détails tels que le nombre de centres de données et de nœuds.

Le tableau suivant contient des exemples d'informations complètes dans la colonne À FAIRE et des informations incomplètes dans la colonne À NE PAS FAIRE :

À FAIRE

Les erreurs 401 ont été observées sur Apigee sur Google Cloud depuis le 06/11/2020 09:30 CST.

Informations sur la configuration Apigee :

Les détails de l'API défaillante sont les suivants :
Noms des organisations : myorg
Noms des environnements : test
Noms des proxys d'API : myproxy
Numéros de révision : 3

Erreur :

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

Le nombre d'erreurs 401 a augmenté.

(Ne fournit aucune information sur le produit utilisé, depuis quand le problème est observé ou des informations sur la configuration.)

Debug échoue avec l'erreur suivante sur Apigee hybrid version 1.3

Erreur :

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}

Informations de configuration Apigee hybrid :

  • Plate-forme hybride Apigee :
    Anthos GKE On-Prem version 1.4.0
  • Projet Google Cloud, organisation hybride et environnement
    ID de projet Google Cloud : apigee-hybrid-123456
    Organisation hybride Apigee : apigee-hybrid-123456
    Environnement hybride Apigee : dev
  • Détails du nom du cluster Kubernetes
    k8sCluster :
    nom : user-cluster-1
    région : us-east1
  • Topologie de réseau
    Fichier network-topology.png joint.
Debug échoue sur la solution Apigee hybrid.

Artefacts utiles

En nous fournissant des artefacts liés au problème, vous nous aidez à accélérer la résolution, car cela nous aidera à comprendre le comportement exact que vous observez et à obtenir davantage d'informations à son sujet.

Cette section décrit des artefacts qui sont utiles pour tous les produits Apigee :

Artefacts communs pour tous les produits Apigee

Les artefacts suivants sont utiles pour tous les produits Apigee : Apigee sur Google Cloud et Apigee hybrid:

Artefact Description
Résultat de l'outil Debug Le résultat de l'outil Debug contient des informations détaillées sur les requêtes API qui traversent les produits Apigee. Cela se révèle utile pour les erreurs d'exécution, telles que 4XX, 5XX et les problèmes de latence.
Captures d'écran Les captures d'écran permettent de relayer le contexte du comportement réel ou l'erreur en cours d'observation. Cela se révèle utile pour les erreurs ou les problèmes observés, tels que l'interface utilisateur ou Analytics.
HAR (Http ARchive) HAR est un fichier capturé par les outils de session HTTP afin de déboguer les problèmes liés à l'interface utilisateur. Vous pouvez le capturer à l'aide de navigateurs tels que Chrome, Firefox ou Internet Explorer.
tcpdumps L'outil tcpdump capture les paquets TCP/IP transférés ou reçus sur le réseau. Cette fonctionnalité est utile pour les problèmes réseau tels que les échecs de handshake TLS, les erreurs 502, les problèmes de latence, etc.

Artefacts supplémentaires pour les environnements hybrides

Dans le cas d'un environnement hybride, nous pouvons avoir besoin d'artefacts supplémentaires qui facilitent un diagnostic plus rapide des problèmes.

Artefact Description
Plate-forme Apigee hybrid Spécifiez l'une des plates-formes hybrides compatibles suivantes qui sont utilisées :
  • GKE
  • GKE On-Prem
  • AKS (Azure Kubernetes Service)
  • Amazon EKS
  • GKE sur AWS
Versions d'Apigee hybrid et des composants
  • Version de la CLI Apigee hybrid :
    version apigeectl
  • Version de l'agent Apigee Connect :
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Version d'Apigee MART :
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Version du synchronisateur Apigee :
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Version Cassandra Apigee :
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Version d'exécution Apigee :
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • CLI Kubernetes et versions de serveur : version
    kubectl
  • CLI Istio et versions du serveur :
    version istioctl
Topologie du réseau Le schéma de topologie d'installation Apigee décrivant votre configuration hybride, y compris tous les centres de données, les clusters Kubernetes, les espaces de noms et les pods.
Fichier YAML de remplacement Le fichier overrides.yaml utilisé dans chaque centre de données pour l'installation du plan d'exécution Apigee hybrid.
État du déploiement Apigee hybrid

Le résultat des commandes suivantes dans chaque centre de données ou cluster Kubernetes :

kubectl get pods -A
kubectl get services -A

Journaux des composants Apigee hybrid

Fournissez des liens vers les journaux Stackdriver pour les composants hybrides OU

Vous pouvez récupérer les journaux des composants hybrides Apigee à l'aide des commandes suivantes dans chaque centre de données ou cluster Kubernetes, puis les partager avec nous :

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

  • Journaux de l'agent Apigee Connect :
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Journaux MART :
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Journaux du synchronisateur :
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Journaux Cassandra Apigee :
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Journaux d'exécution MP/Apigee (de tous les pods d'exécution Apigee) :
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Décrire les journaux

Informations détaillées sur le pod.

Ceci est particulièrement utile si vous rencontrez des problèmes tels que des pods bloqués dans l'état CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Lien vers le tableau de bord des métriques
  • Instantanés de tous les tableaux de bord associés aux métriques Cloud Monitoring

Must-Gather Apigee Hybrid

Vous pouvez également exécuter le script Must-Gather en fonction des commandes ci-dessous.

###--- "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

Une fois les journaux générés, compressez l'ensemble du fichier de sortie dans un seul fichier tar-ball à l'aide de la commande ci-dessous :

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

Si la taille du fichier tar est supérieure à 25 Mo, vous pouvez l'importer dans Google Drive et partager le lien avec nous. Vous pouvez également utiliser la commande "split" pour diviser les fichiers volumineux en fragments de 25 Mo pouvant être importés sur le portail d'assistance.

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

Modèles et exemples de demandes

Cette section fournit des modèles et des exemples de demandes pour différents produits selon les bonnes pratiques décrites dans ce document :

Apigee Cloud

Modèle

Cette section fournit un exemple de modèle pour Apigee sur Google Cloud.

Problème :

<Fournissez une description détaillée du problème ou du comportement observé à votre niveau. Incluez le nom du produit et sa version, le cas échéant.>

Message d'erreur :

<Incluez le message d'erreur complet observé (le cas échéant)>

Heure de début du problème (format ISO 8601) :

Heure de fin du problème (format ISO 8601) :

Informations sur la configuration Apigee :
Noms des organisation :
Noms des environnements :
Noms des proxys d'API :
Numéros de révision :

Procédure à reproduire :

<Si possible, indiquez la procédure à suivre pour reproduire le problème>

Informations de diagnostic :

<Liste des fichiers joints>

Exemple de demande

Cette section fournit un exemple de demande pour Apigee sur Google Cloud.

Problème :

Nous constatons un grand nombre d'erreurs 503 de type Service indisponible dans notre organisation de cloud public. Pouvez-vous examiner le problème et nous aider à le résoudre ?

Message d'erreur :

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

Heure de début du problème (format ISO 8601) : 2020-10-04 06:30 IST

Heure de fin du problème (format ISO 8601) : le problème persiste.

Informations sur la configuration Apigee Cloud :
Noms des organisations : myorg
Noms des environnements : dev
Noms des proxy d'API : myproxy
Numéros de révision : 3

Procédure à reproduire :

Exécutez la commande curl suivante pour reproduire le problème :

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

Informations de diagnostic :

Résultats de l'outil Debug (trace-503.xml)

Hybride

Modèle

Cette section fournit un exemple de demande pour Apigee hybrid.

Problème :

<Fournissez une description détaillée du problème ou du comportement observé à votre niveau. Incluez le nom du produit et sa version, le cas échéant.>

Message d'erreur :

<Incluez le message d'erreur complet observé (le cas échéant)>

Heure de début du problème (format ISO 8601) :

Heure de fin du problème (format ISO 8601) :

Informations de configuration Apigee hybrid :

  • Plate-forme hybride Apigee :

    <Fournissez les informations sur la plate-forme sur laquelle vous avez installé Apigee hybrid et sa version.>

  • Projet Google Cloud, organisation et environnement hybride :
    ID de projet Google Cloud :
    . <Si vous utilisez Google Kubernetes Engine (GKE), assurez-vous de fournir l'ID du projet où se trouvent les clusters. Si vous utilisez GKE On-Prem, Azure Kubernetes Service ou Amazon EKS, indiquez l'ID du projet vers lequel vous envoyez les journaux.>
    Organisation hybride Apigee :
    Environnement hybride Apigee :
  • Apigee hybrid et autres versions de CLI :
    version de CLI Apigee hybrid (apigeectl) :
    Version Kubectl :
  • Détails du nom du cluster Kubernetes :
    k8sCluster :
    nom :
    région :
  • Topologie de réseau :
    <Joignez la topologie du réseau décrivant la configuration de votre environnement hybride Apigee, y compris les centres de données, les clusters Kubernetes, les espaces de noms et les pods.>
  • Fichier YAML de remplacement :
    <Joignez le fichier YAML de remplacement.>

Procédure à reproduire

<Si possible, indiquez la procédure à suivre pour reproduire le problème>

Informations de diagnostic :

<Liste des fichiers joints>

Exemple de demande

Cette section fournit un exemple de demande pour Apigee hybrid.

Problème :

Nous rencontrons des erreurs lors de l'exécution d'API de gestion sur la version 1.3 d'Apigee hybrid.

Message d'erreur :

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

Heure de début du problème (format ISO 8601) : 2020-10-24 10:30 PDT

Heure de fin du problème : (format ISO 8601) : ce problème persiste.

Informations de configuration Apigee hybrid :

  • Plate-forme hybride Apigee
    Version 1.15.1 de GKE
  • Projet Google Cloud, organisation et environnement hybrides
    ID de projet Google Cloud : apigee-hybrid-123456
      Remarque : Il s'agit de l'ID du projet où se trouvent les clusters.
    Organisation hybride Apigee : apigee-hybrid-123456
    Environnement hybride Apigee : dev
  • Apigee hybrid et autres versions de CLI :
    Version de l'interface de ligne de commande hybride Apigee (apigeectl) :
    Version : 1.2.0
    Validation : ac09109
    ID de compilation : 214
    Heure de compilation : 2020-03-30T20:23:36Z
    Version Go : go1.12

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

        Version du serveur :
    version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
  • Détails du nom du cluster Kubernetes :
    k8sCluster :
    nom : user-cluster-1
    région : us-east1
  • Topologie de réseau
    Fichier network-topology.png joint
  • Fichier YAML de remplacement
    Fichier overrides.yaml joint

Procédure à reproduire :

Exécutez l'API de gestion suivante pour observer l'erreur :

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

Informations de diagnostic :

Les fichiers suivants sont joints :

  • network-topology.png
  • overrides.yaml file
  • Journaux MART
  • Journaux du synchronisateur