Prácticas recomendadas para los casos de asistencia de Apigee en Google Cloud

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.
  • Versión híbrida
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.
  • Mensaje de error
  • Resultados de la herramienta de depuración
  • Pasos para reproducir el problema
  • Solicitud o comando de API completo
  • Mensaje de error
  • Resultados de la herramienta de depuración
  • Pasos para reproducir el problema
  • Solicitud o comando de API completo
  • Registros de diagnóstico de componentes
  • Métricas de Cloud Monitoring
Hora La marca de tiempo específica en la que empezó el problema y cuánto duró.
  • Fecha, hora y zona horaria en las que se produjo el problema
  • Duración del problema
  • Fecha, hora y zona horaria en las que se produjo el problema
  • Duración del problema
Configuración Información detallada sobre dónde se observa el problema.
  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Revisión

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 cqlsh.

(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 edgemicro edgemicro_auth falla y muestra el siguiente error:

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

El nuevo proxy de edgemicro creado hoy no funciona

(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 500 con el siguiente mensaje de error al hacer 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 al hacer solicitudes al proxy de la API.

(Si solo nos indicas que hay 500 errores, no nos proporcionas suficiente información para investigar el problema. Necesitamos saber el mensaje de error y el código de error que se observan.)

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 503s durante 5 minutos.

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

401 Los errores han aumentado en Apigee en Google Cloud desde el 6 de noviembre del 2020 a las 09:30 (CST).

Detalles de la configuración de Apigee:

Los detalles de la API que falla son los siguientes:
  Nombres de organizaciones: myorg
  Nombres de entornos: test
  Nombres de proxies 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"}}}

401 Los errores han aumentado.

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:

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 Apigee Hybrid:
      Anthos GKE On-Prem versión 1.4.0
  • Proyecto de Google Cloud, organización híbrida y entorno
      ID de proyecto de Google Cloud: apigee-hybrid-123456
      Organización híbrida de Apigee: apigee-hybrid-123456
      Entorno híbrido de Apigee: dev
  • Detalles del nombre del clúster de Kubernetes
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • Topología de red
    Se ha adjuntado el archivo network-topology.png.
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:
  • GKE
  • GKE On‑Prem
  • AKS (Azure Kubernetes Service)
  • Amazon EKS
  • GKE en AWS
Versiones de Apigee Hybrid y de los componentes dependientes
  • Versión de la CLI de Apigee hybrid: versión
    apigeectl
  • Versión del agente de conexión de Apigee:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versión de MART de Apigee:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versión del sincronizador de Apigee:
    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 de Apigee Runtime:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • Versiones de la CLI y del servidor de Kubernetes: versión
    kubectl
  • Versiones de la CLI y del servidor de Istio: versión
    istioctl
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:

kubectl get pods -A
kubectl get services -A

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:

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

  • Registros del agente de conexión de Apigee:
    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 Cassandra de Apigee:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Registros de tiempo de ejecución de MP/Apigee (de todos los pods de apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
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 CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Enlace a tu panel de control de métricas
  • Capturas de pantalla de los paneles de control relacionados con las métricas de 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

Una vez que se hayan generado los registros, comprime todos los archivos de salida en un único 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 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 archivo network-topology.png
  • Archivo YAML de anulaciones
    Archivo overrides.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