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. |
|
|
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. |
|
|
Heure | Horodatage spécifique indiquant le début du problème et sa durée. |
|
|
Prérequis | Informations détaillées de l'endroit où le problème est observé. |
|
|
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 | À NE PAS 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 (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 | À NE PAS FAIRE |
---|---|
Le nouveau proxy
|
Le proxy (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
|
Nos clients reçoivent des erreurs
(Le simple fait de transmettre des erreurs |
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 | À NE PAS 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 (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 | À NE PAS FAIRE |
---|---|
Les erreurs Informations sur la configuration Apigee :
Les détails de l'API défaillante sont les suivants :
Erreur :
|
Le nombre d'erreurs (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 :
Informations de configuration Apigee hybrid :
| 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 :
|
Versions d'Apigee hybrid et des composants |
|
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 :
|
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 :
|
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
|
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
# 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
Fichiernetwork-topology.png
joint - Fichier YAML de remplacement
Fichieroverrides.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