Prácticas recomendadas para casos de ayuda de Apigee de Google Cloud

Estás viendo la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

Proporcionar la información necesaria de forma detallada en el caso de ayuda permite que el equipo de asistencia al cliente de Google Cloud responda con rapidez y de forma eficiente. Si a tu caso de ayuda le faltan detalles fundamentales, tendremos que pedirte más información, lo que puede generar una cadena de interacción con muchas respuestas. Esto lleva más tiempo y puede generar demoras en la resolución de problemas. Esta guía de prácticas recomendadas te permite conocer la información que necesitamos para resolver tu caso de ayuda técnica con mayor rapidez.

Describe el problema

Un problema debe contener información que explique los detalles sobre lo que sucedió en relación con lo que se esperaba que sucediera, además de cuándo y cómo ocurrió. Un buen caso de ayuda de Apigee debe contener la siguiente información clave para cada uno de los productos de Apigee:

Key information Descripción Apigee en Google Cloud Apigee Hybrid
Producto Producto específico de Apigee en el que se observa el problema, incluye la información de la versión cuando corresponda.
  • Versión híbrida
Detalles del problema Descripción clara y detallada de la descripción del problema, incluido el mensaje de error completo, si corresponde.
  • Mensaje de error
  • Resultado de la herramienta de depuración
  • Pasos para reproducir un problema
  • Solicitud a la API/comando completos
  • Mensaje de error
  • Resultado de la herramienta de depuración
  • Pasos para reproducir un problema
  • Solicitud a la API/comando completos
  • Registros de diagnóstico de componentes
  • Métricas de Cloud Monitoring
Hora La marca de tiempo específica del momento en que comenzó el problema y su duración
  • Fecha, hora y zona horaria en que ocurrió el problema
  • Duración del problema
  • Fecha, hora y zona horaria en que ocurrió el problema
  • Duración del problema
Configuración Información detallada sobre el lugar en el que se observa el problema.
  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Revisión

Las siguientes secciones describen estos conceptos en mayor detalle.

Producto

Hay diferentes productos de Apigee, Apigee en Google Cloud y Apigee Hybrid, por lo que necesitamos información específica sobre qué producto en particular es el que tiene el problema

En la siguiente tabla, se proporcionan algunos ejemplos que muestran información completa en la columna CORRECTO, e información incompleta en la columna INCORRECTO:

CORRECTO INCORRECTO
La implementación del proxy de API OAuth2 falló en nuestra organización de Apigee en Google Cloud

No se pudo implementar el proxy de API.

(Debemos conocer el producto de Apigee en el que tiene el problema).

Se genera el siguiente error cuando accede a Cassandra con cqlsh en Versión híbrida de Apigee 1.3

No podemos acceder a Cassandra con cqlsh.

(Falta la información sobre la versión de Hybrid)

Detalles del problema

Proporciona la información precisa sobre el problema que se observa, incluido el mensaje de error (si corresponde), así como el comportamiento esperado y el real que se puede observar.

En la siguiente tabla, se proporcionan algunos ejemplos que muestran información completa en la columna CORRECTO, e información incompleta en la columna INCORRECTO:

CORRECTO INCORRECTO

El nuevo proxy edgemicro edgemicro_auth falla con el siguiente error:

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

El nuevo proxy edgemicro que se creó hoy no funciona

(No se conoce el nombre del proxy. No está claro si el proxy muestra un error o una respuesta inesperada).

Nuestros clientes reciben errores 500 con el siguiente mensaje de error mientras realizan solicitudes al proxy de 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"}}}

Nuestros clientes reciben errores 500 a la vez que realizan solicitudes al proxy de API.

(Si solo indicas el error 500, no proporcionas la información adecuada para que investiguemos el problema. Necesitamos conocer el mensaje de error real y el código de error que se está observando).

Tiempo

El tiempo es un dato fundamental. Es importante que el ingeniero de asistencia sepa cuándo se detectó por primera vez este problema, cuánto tiempo duró y si el problema continúa.

Es posible que el ingeniero de asistencia que resuelva el problema no esté en tu zona horaria, por lo que las declaraciones relativas sobre el tiempo hacen que el problema sea más difícil de diagnosticar. Por lo tanto, se recomienda usar el formato ISO 8601 para las marcas de fecha y hora a fin de proporcionar la información exacta sobre la fecha en la que se observó el problema.

En la siguiente tabla, se proporcionan algunos ejemplos precisos que muestran la hora y duración en las que se produjo el problema en la columna CORRECTO y la información ambigua o poco clara sobre cuándo ocurrió el problema en la columna INCORRECTO:

CORRECTO INCORRECTO
Una gran cantidad de 503s se detectó ayer entre el 2020-11-06 17:30 PDT y el 2020-11-06 17:35 PDT

Una gran cantidad de 503s se observó ayer a las 5:30 p.m. durante 5 minutos.

(Nos vemos obligados a usar la fecha implícita y no está claro en qué zona horaria se observó este problema).

Se observaron latencias altas en los siguientes proxies de API desde 2020-11-09 15:30 IST hasta 2020-11-09 18:10 IST

Se observaron latencias altas en algunos proxies de API la semana pasada.

(No está claro qué día ni por cuánto tiempo se observó este problema durante la última semana).

Configuración

Necesitamos conocer los detalles sobre el lugar exacto en el que detectaste el problema. Según el producto que uses, necesitamos la siguiente información:

  • Si usas Apigee Cloud, es posible que tengas más de una organización. Por lo tanto, necesitamos conocer la organización específica y otros detalles en los que observas el problema:
    • Nombres de organizaciones y entornos
    • Nombre del proxy de API y números de revisión (para los errores de solicitudes a la API)
  • Si usas un entorno híbrido, es posible que uses una de las diversas topologías de instalación y de plataformas híbridas compatibles. Por lo tanto, necesitamos saber qué plataforma híbrida y topología estás usando, incluidos los detalles, como la cantidad de centros de datos y de nodos.

En la siguiente tabla, se proporcionan algunos ejemplos que muestran información completa en la columna CORRECTO, e información incompleta en la columna INCORRECTO:

CORRECTO INCORRECTO

Los errores 401 aumentaron en Apigee en Google Cloud desde 2020-11-06 09:30 CST.

Detalles de configuración de Apigee:

Los detalles de la API con errores son los siguientes:
Nombres de la organización: myorg
Nombres de entornos: test
Nombres de proxy de API: myproxy
Números de revisión: 3

Error:

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

Los errores 401 aumentaron.

(No proporciona información sobre el producto que se usa, por el momento en que se observa el problema o cualquier detalle de configuración).

La depuración falla con el siguiente error en Apigee Hybrid versión 1.3

Error:

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}

Detalles de la configuración de Apigee Hybrid:

  • Plataforma de Apigee Hybrid:
    Anthos GKE On-Prem versión 1.4.0
  • Proyecto de Google Cloud, organización y entorno híbridos
    ID del proyecto de Google Cloud: apigee-hybrid-123456
    Organización de Apigee Hybrid: apigee-hybrid-123456
    Entorno de Apigee Hybrid: dev
  • Detalles del nombre de clúster de Kubernetes
    k8sCluster:
    nombre: user-cluster-1
    región: us-east1
  • Topología de red
    Adjunta el archivo network-topology.png.
La depuración falla en Apigee Hybrid.

Artefactos útiles

Si nos proporcionas artefactos relacionados con el problema, se acelerará la resolución, ya que nos ayudará a comprender el comportamiento exacto que estás observando y podrás obtener más estadísticas.

En esta sección, se describen algunos artefactos útiles que te serán de ayuda 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
Resultado de la herramienta de depuración El resultado de la herramienta de depuración contiene información detallada sobre las solicitudes a la API que fluyen a través de los productos de Apigee. Esto es útil para cualquier error de entorno 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 el error reales que se observan. Es útil para los errores o problemas observables, como en la IU o Analytics.
HAR (archivo Http) HAR es un archivo capturado por las herramientas de sesión HTTP para depurar cualquier problema relacionado con la IU. Puede capturarse con navegadores como Chrome, Firefox o Internet Explorer.
tcpdumps La herramienta de tcpdump captura paquetes TCP/IP transferidos o recibidos a través de la red. Esto es útil para cualquier problema relacionado con la red, como fallas del protocolo de enlace TLS, errores 502 y problemas de latencia, etcétera.

Artefactos adicionales para entornos híbridos

Para entornos híbridos, es posible que necesitemos algunos artefactos adicionales que faciliten el diagnóstico de los problemas.

Artefacto Descripción
Plataforma de Apigee Hybrid Especifica cualquiera de las siguientes plataformas híbridas compatibles que se usan:
  • GKE
  • GKE On‑Prem
  • AKS (Azure Kubernetes Service)
  • Amazon EKS
  • GKE en AWS
Versiones de componentes dependientes y de Apigee Hybrid
  • Versión de CLI de Apigee Hybrid:
    versión apigeectl
  • Versión del agente de Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versión de Apigee MART:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versión de Apigee Synchronizer:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Versión de Cassandra de Apigee:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Versión del entorno de ejecución de Apigee:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • CLI de Kubernetes y versiones del servidor:
    versión kubectl
  • CLI de Istio y versiones de servidor:
    versión istioctl
Topología de la red El diagrama de topología de instalación de Apigee en el que se describe tu configuración híbrida, incluidos todos los centros de datos, clústeres de Kubernetes, espacios de nombres y Pods.
Anula el archivo YAML El archivo overrides.yaml que se usa en cada centro de datos para instalar el plano de entorno 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/clúster de Kubernetes:

kubectl get pods -A
kubectl get services -A

Registros de componentes de Apigee Hybrid

Proporcione vínculos a registros de Stackdriver para los componentes híbridos, O BIEN

Puedes recuperar los registros de componentes de Apigee Hybrid mediante los siguientes comandos en cada centro de datos o clúster de Kubernetes y compartirlos con nosotros:

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

  • Registros del agente de Apigee Connect:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Registros de MART:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Registros del sincronizador:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Registros de Apigee Cassandra:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Registros del entorno de ejecución de Apigee/MP (de todos los pods apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Describe los registros

Información detallada sobre el Pod.

Esto es útil, en especial, si observas problemas, como Pods que se atascan en estado CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Vínculo al panel de métricas
  • Instantáneas de cualquier panel relacionado con las métricas de Cloud Monitoring

Datos obligatorios de Apigee Hybrid

También puedes ejecutar la secuencia de comandos Must-Gather según 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 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

Una vez que se generen los registros, comprime todo el archivo de salida en un solo archivo tar con el siguiente comando:

	# 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 vínculo con nosotros. También puedes usar el comando split para dividir los archivos grandes en fragmentos de 25 MB que se pueden subir al portal de asistencia.

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

Plantillas de casos y casos de muestra

Esta sección proporciona plantillas de casos y casos de muestra para diferentes productos según las prácticas recomendadas descritas en este documento:

Apigee Cloud

Plantilla

En esta sección, se proporciona una plantilla de muestra para Apigee en Google Cloud.

Problema:

<Proporcione una descripción detallada del problema o del comportamiento que se observa en su extremo. Incluya el nombre y la versión del producto cuando corresponda.>

Mensaje de error:

<Incluir el mensaje de error completo que se observa (si corresponde)>

Hora de inicio del problema (formato ISO 8601):

Hora de finalización del problema (formato ISO 8601):

Detalles de configuración de Apigee:
  Nombres de la organización:
  Nombres del entorno:
  Nombres de proxy de API:
  Números de revisión:

Pasos para reproducir:

<Proporciona los pasos necesarios para reproducir el problema cuando sea posible>

Información de diagnóstico:

<Lista de archivos adjuntos>

Caso de muestra

En esta sección, se brinda un caso de muestra para Apigee en Google Cloud.

Problema:

En nuestra organización de nube pública, vemos una gran cantidad de errores 503 de servicio no disponible. ¿Puedes revisar el problema y resolverlo o ayudarnos a solucionarlo?

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 configuración de la nube de Apigee Cloud:
  Nombres de la organización: myorg
  Nombres del entorno: dev
  Nombres de proxy de API: myproxy
  Números de revisión: 3

Pasos para reproducir:

Ejecuta el siguiente comando de curl para reproducir el problema:

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

Información de diagnóstico:

Resultado de la herramienta de depuración (trace-503.xml)

Híbrido

Plantilla

En esta sección, se proporciona una plantilla de muestra para Apigee Hybrid.

Problema:

<Proporcione una descripción detallada del problema o del comportamiento que se observa en su extremo. Incluya el nombre y la versión del producto cuando corresponda.>

Mensaje de error:

<Incluir el mensaje de error completo que se observa (si corresponde)>

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 de Apigee Hybrid:

    <Proporciona la información sobre la plataforma en la que instalaste la versión híbrida y su versión.>

  • Proyecto de Google Cloud, organización y entorno híbridos:
    ID del proyecto de Google Cloud:
     <Si usas Google Kubernetes Engine (GKE), asegúrate de proporcionar el ID del proyecto donde se encuentran los clústeres. Si usas GKE On-Prem, Azure Kubernetes Service o Amazon EKS, proporciona el ID del proyecto al que envías los registros.>
    Organización de Apigee Hybrid:
    Entorno de Apigee Hybrid:
  • Apigee Hybrid y otras versiones de la CLI:
    Versión de la CLI d Apigee Hybrid (apigeectl):
    Versión de Kubectl:
  • Detalles del nombre de clúster de Kubernetes:
    k8sCluster:
    nombre:
    región:
  • Topología de red:
    <Adjunta la topología de red que describe la configuración de tu Apigee Hybrid, incluidos los centros de datos, los clústeres de Kubernetes, los espacios de nombres y los pods.>
  • Anula el archivo YAML:
    <Adjuntar el archivo YAML de anulaciones.>

Pasos para reproducirlo

<Proporciona los pasos necesarios para reproducir el problema cuando sea posible>

Información de diagnóstico:

<Lista de archivos adjuntos>

Caso de muestra

En esta sección, se proporciona un caso de muestra para Apigee Hybrid.

Problema:

Se producen errores cuando se ejecutan las API de administració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): El problema continúa.

Detalles de la configuración de Apigee Hybrid:

  • Plataforma de Apigee Hybrid
    GKE versión 1.15.1
  • Proyecto de Google Cloud, organización y entorno híbridos
    ID del 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 CLI de Apigee Hybrid (apigeectl):
    Versión: 1.2.0
    Confirmación: ac09109
    ID de compilación: 214
    Tiempo 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 de clúster de Kubernetes:
    k8sCluster:
    nombre: user-cluster-1
    región: us-east1
  • Topología de red
    Adjunta el archivo network-topology.png
  • Anula el archivo YAML
    Adjunta el archivo overrides.yaml.

Pasos para reproducir:

Ejecuta la siguiente API de 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:

Adjunta los siguientes archivos:

  • network-topology.png
  • overrides.yaml file
  • Registros de MART
  • Registros del sincronizador