Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Si proporcionas información detallada y obligatoria en el caso de asistencia, el equipo de Asistencia de Google Cloud podrá responderte de forma rápida y eficiente. Si faltan detalles importantes en tu caso de asistencia, tendremos que pedirte más información, lo que puede implicar que tengamos que comunicarnos varias veces. Esto lleva más tiempo y puede provocar retrasos en la resolución de los problemas. En esta guía de prácticas recomendadas se indica la información que necesitamos para resolver tu incidencia de asistencia técnica más rápido.
Describir el problema
Un problema debe contener información que explique los detalles de lo que ha ocurrido en comparación con lo que se esperaba que ocurriera, así como cuándo y cómo ha ocurrido. Un buen caso de asistencia debe contener la siguiente información clave para cada uno de los productos de Apigee:
Información clave | Descripción | Apigee en Google Cloud | Apigee Hybrid |
---|---|---|---|
Producto | Producto de Apigee específico en el que se observa el problema, incluida la información de la versión, si procede. |
|
|
Detalles del problema | Una descripción clara y detallada del problema, en la que se indique la incidencia y el mensaje de error completo, si lo hay. |
|
|
Hora | La marca de tiempo específica en la que empezó el problema y cuánto duró. |
|
|
Configuración | Información detallada sobre dónde se observa el problema. |
|
|
En las secciones siguientes se describen estos conceptos con más detalle.
Producto
Hay diferentes productos de Apigee, como Apigee en Google Cloud y Apigee Hybrid, por lo que necesitamos información específica sobre el producto concreto que tiene el problema.
En la siguiente tabla se muestran algunos ejemplos de información completa en la columna Qué hacer e información incompleta en la columna Qué no hacer:
Prácticas recomendadas | Prácticas no recomendadas |
---|---|
El despliegue del proxy de API OAuth2 ha fallado en nuestra organización Apigee en Google Cloud. |
No se ha podido desplegar el proxy de APIs (Necesitamos saber en qué producto de Apigee se produce el problema). |
Recibimos el siguiente error al acceder a Cassandra mediante
cqlsh en Apigee Hybrid versión 1.3 ... |
No podemos acceder a Cassandra con (Falta información sobre la versión híbrida) |
Detalles del problema
Proporciona información precisa sobre el problema que has observado, como el mensaje de error (si lo hay) y el comportamiento esperado y real.
En la siguiente tabla se muestran algunos ejemplos de información completa en la columna Qué hacer e información incompleta en la columna Qué no hacer:
Prácticas recomendadas | Prácticas no recomendadas |
---|---|
El nuevo proxy
|
El nuevo proxy de (El nombre del proxy es desconocido. No está claro si el proxy devuelve un error o una respuesta inesperada. |
Nuestros clientes están recibiendo errores
|
Nuestros clientes reciben errores
(Si solo nos indicas que hay |
Hora
El tiempo es un dato muy importante. Es importante que el ingeniero del equipo de Asistencia sepa cuándo notaste este problema por primera vez, cuánto duró y si sigue ocurriendo.
Es posible que el ingeniero del equipo de Asistencia que resuelva el problema no se encuentre en tu zona horaria, por lo que las afirmaciones relativas a la hora dificultan el diagnóstico del problema. Por lo tanto, te recomendamos que uses el formato ISO 8601 para la marca de fecha y hora, de modo que se proporcione la información exacta sobre el momento en el que se observó el problema.
En la siguiente tabla se muestran algunos ejemplos en los que se indica la hora y la duración exactas del problema en la columna Qué hacer, así como información ambigua o poco clara sobre cuándo se produjo el problema en la columna Qué no hacer:
Prácticas recomendadas | Prácticas no recomendadas |
---|---|
Ayer se observó un gran número de 503s entre las
17:30 (PDT) del 6 de noviembre del 2020 y las 17:35 (PDT) del 6 de noviembre del 2020... |
Ayer a las 17:30 se observó un gran número de Nos vemos obligados a usar la fecha implícita y tampoco está claro en qué zona horaria se observó este problema. |
Se han observado latencias altas en los siguientes proxies de API desde las 15:30 (IST) del 9 de noviembre del 2020 hasta las 18:10 (IST) del 9 de noviembre del 2020 ... |
La semana pasada se observaron latencias altas en algunas APIs Proxy. (No está claro qué día y durante cuánto tiempo se observó este problema la semana pasada). |
Configuración
Necesitamos saber los detalles sobre dónde se produce exactamente el problema. En función del producto que utilice, necesitaremos la siguiente información:
- Si usas Apigee en Google Cloud, es posible que tengas más de una organización, por lo que necesitamos saber la organización específica y otros detalles sobre el problema:
- Nombres de la organización y del entorno
- Nombre del proxy de API y números de revisión (en caso de errores en solicitudes a la API)
- Si usas híbrido, puede que estés usando una de las muchas plataformas híbridas y topologías de instalación compatibles. Por lo tanto, necesitamos saber qué plataforma y topología híbridas utilizas, incluidos los detalles, como el número de centros de datos y nodos.
En la siguiente tabla se muestran algunos ejemplos de información completa en la columna Qué hacer y de información incompleta en la columna Qué no hacer:
Prácticas recomendadas | Prácticas no recomendadas |
---|---|
Detalles de la configuración de Apigee:
Los detalles de la API que falla son los siguientes:
Error:
|
No proporciona información sobre el producto que se está usando, desde cuándo se observa el problema ni ningún detalle de la configuración. |
La depuración falla y se muestra el siguiente error en Apigee hybrid versión 1.3 Error:
Detalles de la configuración de Apigee hybrid:
| La depuración falla en Apigee Hybrid. |
Artefactos útiles
Si nos proporciona artefactos relacionados con el problema, podremos resolverlo más rápido, ya que nos ayudará a entender el comportamiento exacto que está observando y a obtener más información al respecto.
En esta sección se describen algunos artefactos útiles para todos los productos de Apigee:
Artefactos comunes de todos los productos de Apigee
Los siguientes artefactos son útiles para todos los productos de Apigee: Apigee en Google Cloud y Apigee Hybrid:
Artefacto | Descripción |
---|---|
Resultados de la herramienta de depuración | El resultado de la herramienta de depuración contiene información detallada sobre las solicitudes de API que fluyen a través de los productos de Apigee. Esto resulta útil para cualquier error de tiempo de ejecución, como 4XX , 5XX y problemas de latencia. |
Capturas de pantalla | Las capturas de pantalla ayudan a transmitir el contexto del comportamiento o error que se observa. Es útil para detectar errores o problemas, como los que se producen en la interfaz de usuario o en Analytics. |
HAR (Http ARchive) | HAR es un archivo que capturan las herramientas de sesión HTTP para depurar cualquier problema relacionado con la interfaz de usuario. Esto se puede capturar con navegadores como Chrome, Firefox o Internet Explorer. |
tcpdumps |
La herramienta tcpdump captura los paquetes TCP/IP transferidos o recibidos a través de la red. Esto resulta útil para solucionar problemas relacionados con la red, como errores de handshake de TLS, errores 502 y problemas de latencia, entre otros. |
Artefactos adicionales para la configuración híbrida
En el caso de los híbridos, es posible que necesitemos algunos artefactos adicionales que faciliten el diagnóstico de los problemas.
Artefacto | Descripción |
---|---|
Plataforma Apigee Hybrid | Especifique cualquiera de las siguientes
plataformas híbridas admitidas que se utilicen:
|
Versiones de Apigee Hybrid y de los componentes dependientes |
|
Topología de red | El diagrama de topología de la instalación de Apigee que describe tu configuración híbrida, incluidos todos los centros de datos, clústeres de Kubernetes, espacios de nombres y pods. |
Archivo YAML de anulaciones | El archivo overrides.yaml que se usa en cada centro de datos para instalar el plano de ejecución de Apigee Hybrid.
|
Estado de la implementación de Apigee Hybrid |
El resultado de los siguientes comandos en cada centro de datos o clúster de Kubernetes:
|
Registros de componentes de Apigee Hybrid |
Proporciona enlaces a los registros de Cloud Operations (Stackdriver) de los componentes híbridos. Puede obtener los registros de los componentes de Apigee hybrid con los siguientes comandos en cada centro de datos o clúster de Kubernetes y compartirlos con nosotros:
|
Describir registros |
Información detallada sobre el pod. Esto es especialmente útil si observas problemas como que los pods se quedan atascados en el estado
|
Cloud Monitoring |
|
Recogida de información obligatoria de Apigee Hybrid
También puede ejecutar la secuencia de comandos Must-Gather en función de los comandos que se indican a continuación:
###--- "kubectl config" commands to get the config details of the whole Apigee Hybrid cluster ---#### kubectl config get-clusters 2>&1 | tee /tmp/k_config_get_clusters_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl config get-contexts 2>&1 | tee /tmp/k_config_get_contexts_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl config get-users 2>&1 | tee /tmp/k_config_get_users_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl config view 2>&1 | tee /tmp/k_config_view_$(date +%Y.%m.%d_%H.%M.%S).txt ### --- Collect all details of all nodes in the Kubernetes cluster.---### kubectl describe node 2>&1 | tee /tmp/k_describe_node_$(date +%Y.%m.%d_%H.%M.%S).txt ###--- "kubectl get -A " commands to get CRD details for the whole Apigee Hybrid setup ---#### kubectl get clusterissuers -A -o wide 2>&1 | tee /tmp/k_get_clusterissuers_all$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get certificate -A -o wide 2>&1 | tee /tmp/k_get_certificate_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get certificaterequest -A -o wide 2>&1 | tee /tmp/k_get_certificaterequest_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get crd -A -o yaml 2>&1 | tee /tmp/k_get_crd_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ConfigMap -A 2>&1 | tee /tmp/k_get_ConfigMap_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ClusterRole -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ClusterRoleBinding -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get Deployments -A -o wide >&1 | tee /tmp/k_get_deployments_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get events -A -o wide 2>&1 | tee /tmp/k_get_events_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get endpoints -A 2>&1 | tee /tmp/k_get_endpoints_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get issuers -A -o wide 2>&1 | tee /tmp/k_get_issuers_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get mutatingwebhookconfigurations 2>&1 | tee /tmp/k_get_mutatingwebhookconfigurations_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get nodes -o wide --show-labels 2>&1 | tee /tmp/k_get_nodes_labels_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ns 2>&1 | tee /tmp/k_get_namespace_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get PriorityClass -A -o wide 2>&1 | tee /tmp/k_get_PriorityClass_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get pv -A -o wide 2>&1 | tee /tmp/k_get_pv_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get pvc -A -o wide 2>&1 | tee /tmp/k_get_pvc_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get Role -A -o wide 2>&1 | tee /tmp/k_get_role_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get RoleBinding -A -o wide 2>&1 | tee /tmp/k_get_Role_Binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get replicaset -A -o wide 2>&1 | tee /tmp/k_get_replicaset_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get sa -A -o wide 2>&1 | tee /tmp/k_get_service_accounts_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get services -A -o wide 2>&1 | tee /tmp/k_get_services_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get svc -A 2>&1 | tee /tmp/k_get_svc_all$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get secrets -A 2>&1 | tee /tmp/k_get_secrets_all_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get validatingwebhookconfigurations -A 2>&1 | tee /tmp/k_get_validatingwebhookconfigurations_all$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get validatingwebhookconfigurations apigee-validating-webhook-configuration 2>&1 | tee /tmp/k_get_apigee-validating-webhook-configuration_$(date +%Y.%m.%d_%H.%M.%S).txt ### --- List top resource consuming nodes and pods ---#### kubectl top nodes 2>&1 | tee /tmp/k_top_nodes_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl top pod -A --containers 2>&1 | tee /tmp/k_top_pod_all_containers_$(date +%Y.%m.%d_%H.%M.%S).txt ###----- "kubectl get" commands to fetch list of all CRD for "apigee" namespace ----- ##### kubectl get all -n apigee -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ad -n apigee 2>&1 | tee /tmp/k_get_ad_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get apigeeorganization -n apigee 2>&1 | tee /tmp/k_get_apigeeorganization_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get apigeeenv -n apigee 2>&1 | tee /tmp/k_get_apigeeenv_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get apigeeds -n apigee 2>&1 | tee /tmp/k_get_apigeeds_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get apigeedatastore -n apigee 2>&1 | tee /tmp/k_get_apigeedatastore_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ApigeeDeployment -n apigee 2>&1 | tee /tmp/k_get_apigeedeployment_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ApigeeRedis -n apigee 2>&1 | tee /tmp/k_get_ApigeeRedis_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ApigeeRoute -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoute_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ApigeeRouteConfig -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoutesconfig_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get Apigeetelemetry -n apigee 2>&1 | tee /tmp/k_get_Apigeetelemetry_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get apigeeissues -n apigee 2>&1 | tee /tmp/k_get_apigeeissues_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get ControllerRevision -n apigee -o wide 2>&1 | tee /tmp/k_get_ControllerRevision_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get cronjob -n apigee -o wide 2>&1 | tee /tmp/k_get_cronjob_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get gateway -n apigee 2>&1 | tee /tmp/k_get_gateway_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get PodDisruptionBudget -n apigee -o wide 2>&1 | tee /tmp/k_get_PodDisruptionBudget_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get sc -n apigee -o wide 2>&1 | tee /tmp/k_get_storageclass_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get sr -n apigee -o wide 2>&1 | tee /tmp/k_get_sr_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get sts -n apigee 2>&1 | tee /tmp/k_get_sts_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get volumesnapshot -n apigee -o wide 2>&1 | tee /tmp/k_get_volumesnapshot_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt ###----- "kubectl describe" commands to fetch details of all CRD for "apigee" namespace ----- ##### for p in $(kubectl -n apigee get apigeeorganization --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeorganization ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeorganization_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get apigeeenv --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeenv ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeenv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get apigeeds --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeds ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeds_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get apigeedatastore --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeedatastore ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeedatastore_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get ApigeeDeployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeDeployment ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeDeployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get ApigeeRedis --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRedis ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRedis_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get ApigeeRoute --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRoute ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRoute_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get ApigeeRouteConfig --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRouteConfig ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRouteConfig_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get Apigeetelemetry --no-headers -o custom-columns=":metadata.name") ; do kubectl describe Apigeetelemetry ${p} -n apigee 2>&1 | tee /tmp/k_desc_Apigeetelemetry_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get apigeeissues --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeissues ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeissues_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get ControllerRevision --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe ControllerRevision ${p} 2>&1 | tee /tmp/k_desc_ControllerRevision_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee 2>&1 | tee /tmp/k_desc_certificate_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get cronjob --no-headers -o custom-columns=":metadata.name") ; do kubectl describe cronjob ${p} -n apigee 2>&1 | tee /tmp/k_desc_cronjob_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get daemonset --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe daemonset ${p} 2>&1 | tee /tmp/k_desc_daemonset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get deployments --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe deployments ${p} 2>&1 | tee /tmp/k_desc_deployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get hpa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe hpa ${p} -n apigee 2>&1 | tee /tmp/k_desc_hpa_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee 2>&1 | tee /tmp/k_desc_jobs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get PodDisruptionBudget --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe PodDisruptionBudget ${p} 2>&1 | tee /tmp/k_desc_PodDisruptionBudget_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get pv --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pv ${p} 2>&1 | tee /tmp/k_desc_pv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done for p in $(kubectl -n apigee get pvc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pvc ${p} 2>&1 | tee /tmp/k_desc_pvc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done for p in $(kubectl -n apigee get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get sc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe sc ${p} 2>&1 | tee /tmp/k_desc_storageclass_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done for p in $(kubectl -n apigee get sts --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sts ${p} -n apigee 2>&1 | tee /tmp/k_desc_sts_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe secrets ${p} 2>&1 | tee /tmp/k_desc_secrets_n_apigee${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done for p in $(kubectl -n apigee get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee 2>&1 | tee /tmp/k_desc_services_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee 2>&1 | tee /tmp/k_desc_service_account_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n apigee 2>&1 | tee /tmp/k_desc_svc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done ###----- "kubectl logs" command to fetch logs of all containers in the "apigee" namespace ----- ##### for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done ###----- "kubectl get" commands for "apigee-system" namespace ----- ##### kubectl get all -n apigee-system -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get jobs -o wide -n apigee-system 2>&1 | tee /tmp/k_get_jobs_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt ###----- "kubectl describe" commands for "apigee-system" namespace ----- ##### for p in $(kubectl -n apigee-system get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_certificate_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get deployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe deployment ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_deployment_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_jobs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get rolebinding --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rolebinding ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_rolebinding_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_services_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_serviceaccount_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n apigee-system get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_secrets_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done ###----- "kubectl logs" command for "apigee-system" namespace ----- ##### for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done ###----- "kubectl get" command for "cert-manager" namespace ----- ##### kubectl get all -n cert-manager -o wide 2>&1 | tee /tmp/k_get_all_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt kubectl get crd -n cert-manager 2>&1 | tee /tmp/k_get_crd_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt ###----- "kubectl describe" command for "cert-manager" namespace ----- ##### for p in $(kubectl -n cert-manager get deployment --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe deployment $(p) 2>&1 | tee /tmp/k_desc_deployment_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get endpoints --no-headers -o custom-columns=":metadata.name") ; do kubectl describe endpoints ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_endpoints_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe po ${p} 2>&1 | tee /tmp/k_desc_po_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_replicaset_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_serviceaccount_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_secrets_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_service_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done for p in $(kubectl -n cert-manager get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_svc_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done ###----- "kubectl logs" command for "cert-manager" namespace ----- ##### for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done
# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*
Si el tamaño del archivo tar es superior a 25 MB, puedes subirlo a Google Drive y compartir el enlace con nosotros. También puedes usar el comando split para dividir los archivos grandes en fragmentos de 25 MB que se puedan subir al portal de asistencia.
# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"
Recogida de información obligatoria de Cassandra de Apigee Hybrid
Recoger datos básicos
Introduce la información siguiente:
- Plataforma Apigee Hybrid (GKE, GKE On-Prem, AKS, EKS, etc.)
- Versión de Apigee Hybrid
- ID del proyecto de Google Cloud
- Organización de Apigee Hybrid
- Entorno de Apigee Hybrid
- ¿Se trata de un despliegue en una o varias regiones?
- El archivo
overrides.yaml
(uno por cada clúster) - ¿Cuántas organizaciones de Apigee Hybrid se instalan en un clúster?
- ¿Se ha hecho algún cambio recientemente?
Recoger información de depuración de Cassandra
Run the below script to capture Cassandra debugging information from an Apigee hybrid cluster: # Create a temporary directory to store the Cassandra debugging information. mkdir /tmp/apigee-cassandra-debug-info/ # Loop through all Cassandra pods for APIGEE_CASSANDRA_POD in $(kubectl -n apigee get pods -l app=apigee-cassandra --no-headers -o custom-columns=":metadata.name") ; do # Get Cassandra version kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD version' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_version_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra datacenter status kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_status_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra cluster information kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD describecluster' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_describecluster_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get current ring/token status across the datacenter kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD ring' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_ring_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get more information about heap usage, uptime, exceptions, etc kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD info' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_info_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get gossip info kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gossipinfo' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gossipinfo_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get Cassandra compaction details kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionhistory' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionhistory_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getcompactionthroughput' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getcompactionthroughput_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getconcurrentcompactors' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getconcurrentcompactors_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get status of current Cassandra operations kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tpstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tpstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD netstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_netstat_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gcstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gcstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt # Get proxy histograms (shows the full request latency recorded by the coordinator) kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD proxyhistograms' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_proxyhistograms_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt done # compress all collected data tar -czvf apigee-cassandra-debug-info-$(date +%Y.%m.%d_%H.%M.%S).tar.gz -C /tmp apigee-cassandra-debug-info
Plantillas de casos y casos de ejemplo
En esta sección se proporcionan plantillas y ejemplos de casos prácticos de diferentes productos basados en las prácticas recomendadas que se describen en este documento:
Apigee Cloud
Template
En esta sección se proporciona una plantilla de ejemplo para Apigee en Google Cloud.
Problema:
<Provide detailed description of the problem or the behaviour being observed at your end. Incluye el nombre y la versión del producto, si procede.>
Mensaje de error:
<Incluye el mensaje de error completo que has observado (si lo hay)>
Hora de inicio del problema (formato ISO 8601):
Hora de finalización del problema (formato ISO 8601):
Detalles de la configuración de Apigee:
Nombres de organizaciones:
Nombres de entornos:
Nombres de proxies de API:
Números de revisión:
Pasos para reproducirlo:
<Provide steps to reproduce the issue where possible>
Información de diagnóstico:
<List of files attached>
Caso de ejemplo
En esta sección se proporciona un caso práctico de Apigee en Google Cloud.
Problema:
Estamos detectando un gran número de errores 503 (Servicio no disponible) en nuestra organización de nube pública. ¿Podéis investigar el problema y resolverlo o indicarnos cómo hacerlo?
Mensaje de error:
{"fault":{"faultstring":"The Service is temporarily available", "detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}
Hora de inicio del problema (formato ISO 8601): 2020-10-04 06:30 IST
Hora de finalización del problema (formato ISO 8601): el problema sigue ocurriendo.
Detalles de la configuración de Apigee Cloud:
Nombres de organizaciones: myorg
Nombres de entornos: dev
Nombres de proxies de API: myproxy
Números de revisión: 3
Pasos para reproducirlo:
Ejecuta el siguiente comando curl
para reproducir el problema:
curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'
Información de diagnóstico:
Resultados de la herramienta de depuración (trace-503.xml
)
Híbrido
Template
En esta sección se proporciona una plantilla de ejemplo para Apigee hybrid.
Problema:
<Provide detailed description of the problem or the behaviour being observed at your end. Incluye el nombre y la versión del producto, si procede.>
Mensaje de error:
<Incluye el mensaje de error completo que has observado (si lo hay)>
Hora de inicio del problema (formato ISO 8601):
Hora de finalización del problema (formato ISO 8601):
Detalles de la configuración de Apigee hybrid:
- Plataforma Apigee Hybrid:
<Proporciona información sobre la plataforma en la que has instalado la versión híbrida y su versión.>
- Proyecto de Google Cloud, organización e entorno híbridos:
ID del proyecto de Google Cloud:
<Si usas Google Kubernetes Engine (GKE), asegúrate de proporcionar el ID del proyecto en el que se encuentran los clústeres. Si usas GKE on-premise, Azure Kubernetes Service o Amazon EKS, proporciona el ID del proyecto al que envías los registros.>
Organización híbrida de Apigee:
Entorno híbrido de Apigee: - Apigee Hybrid y otras versiones de la CLI:
Versión de la CLI de Apigee Hybrid (apigeectl
):
Versión de Kubectl: - Detalles del nombre del clúster de Kubernetes:
k8sCluster:
name:
region: - Topología de red:
<Adjunta la topología de red que describa la configuración de tu Apigee Hybrid, incluidos los centros de datos, los clústeres de Kubernetes, los espacios de nombres y los pods.> - Archivo YAML de anulaciones:
<Adjunta el archivo YAML de anulaciones.>
Pasos para reproducir el problema
<Provide steps to reproduce the issue where possible>
Información de diagnóstico:
<List of files attached>
Caso de ejemplo
En esta sección se proporciona un caso de ejemplo de Apigee hybrid.
Problema:
Recibimos errores al ejecutar APIs de gestión en Apigee hybrid versión 1.3.
Mensaje de error:
[ERROR] 400 Bad Request { "error": { "code": 400, "message": "Error processing MART request: INTERNAL_ERROR", "errors": [ { "message": "Error processing MART request: INTERNAL_ERROR", "domain": "global", "reason": "failedPrecondition" } ], "status": "FAILED_PRECONDITION" } }
Hora de inicio del problema (formato ISO 8601): desde 2020-10-24 10:30 PDT
Hora de finalización del problema (formato ISO 8601): seguimos observando el problema.
Detalles de la configuración de Apigee hybrid:
- Plataforma Apigee Hybrid
Versión 1.15.1 de GKE - Proyecto de Google Cloud, organización e entorno híbridos
ID de proyecto de Google Cloud:apigee-hybrid-123456
Nota: Este es el ID del proyecto en el que se encuentran los clústeres.
Organización de Apigee hybrid:apigee-hybrid-123456
Entorno de Apigee hybrid:dev
- Apigee hybrid y otras versiones de la CLI:
Versión de la CLI de Apigee hybrid (apigeectl
):
Versión:1.2.0
Commit:ac09109
ID de compilación:214
Hora de compilación:2020-03-30T20:23:36Z
Versión de Go:go1.12
Versión de kubectl:
Versión del cliente:version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:40:16Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"darwin/amd64"}
Versión del servidor:version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
- Detalles del nombre del clúster de Kubernetes:
k8sCluster:
name:user-cluster-1
region:us-east1
- Topología de red
Se ha adjuntado el archivonetwork-topology.png
- Archivo YAML de anulaciones
Archivooverrides.yaml
adjunto
Pasos para reproducirlo:
Ejecuta la siguiente API Management para observar el error:
curl -X GET --header "Authorization: Bearer <TOKEN>" "https://apigee.googleapis.com/v1/organizations/apigee-hybrid-123456/environments/dev/keyvaluemaps"
Información de diagnóstico:
Se han adjuntado los siguientes archivos:
network-topology.png
overrides.yaml file
- Registros de MART
- Registros del sincronizador