Práticas recomendadas para registos de apoio técnico do Google Cloud Apigee

Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do Apigee Edge.

O fornecimento de informações detalhadas e necessárias no registo de apoio técnico facilita a resposta rápida e eficiente da equipa de apoio técnico do Google Cloud. Quando o seu registo de apoio técnico não tem detalhes críticos, temos de pedir mais informações, o que pode envolver várias interações. Isto demora mais tempo e pode levar a atrasos na resolução de problemas. Este guia de práticas recomendadas indica as informações que precisamos para resolver o seu registo de apoio técnico mais rapidamente.

Descrever o problema

Um problema deve conter informações que expliquem os detalhes sobre o que aconteceu em comparação com o que era esperado, bem como quando e como aconteceu. Um bom registo de apoio técnico deve conter as seguintes informações importantes para cada um dos produtos Apigee:

Informações importantes Descrição Apigee no Google Cloud Apigee Hybrid
Produto Produto Apigee específico no qual o problema está a ser observado, incluindo informações da versão, quando aplicável.
  • Versão híbrida
Detalhes do problema Descrição clara e detalhada do problema que descreve o problema, incluindo a mensagem de erro completa, se aplicável.
  • Mensagem de erro
  • Resultado da ferramenta de depuração
  • Passos para reproduzir o problema
  • Pedido/comando de API completo
  • Mensagem de erro
  • Resultado da ferramenta de depuração
  • Passos para reproduzir o problema
  • Pedido/comando de API completo
  • Registos de diagnóstico de componentes
  • Métricas do Cloud Monitoring
Hora A data/hora específica em que o problema começou e a duração do mesmo.
  • Data, hora e fuso horário da ocorrência do problema
  • Duração do problema
  • Data, hora e fuso horário da ocorrência do problema
  • Duração do problema
Configuração Informações detalhadas sobre onde o problema está a ser observado.
  • Nome da organização
  • Nome do ambiente
  • Nome do proxy de API
  • Revisão

As secções seguintes descrevem estes conceitos mais detalhadamente.

Produto

Existem diferentes produtos Apigee, o Apigee no Google Cloud e o Apigee hybrid, pelo que precisamos de informações específicas sobre o produto em particular que está a ter o problema.

A tabela seguinte apresenta alguns exemplos que mostram informações completas na coluna DOs e informações incompletas na coluna DON'Ts:

O QUE FAZER O QUE NÃO DEVE FAZER
A implementação do proxy de API OAuth2 falhou na nossa organização do Apigee no Google Cloud

Falha na implementação do proxy de API

(Precisamos de saber em que produto Apigee está a ver o problema.)

Estamos a receber o seguinte erro ao aceder ao Cassandra através de cqlsh na versão 1.3 do Apigee Hybrid

Não conseguimos aceder ao Cassandra através de cqlsh.

(As informações da versão híbrida estão em falta)

Detalhes do problema

Forneça as informações precisas sobre o problema que está a observar, incluindo a mensagem de erro (se existir) e o comportamento esperado e real observado.

A tabela seguinte apresenta alguns exemplos com informações completas na coluna DOs e informações incompletas na coluna DON'Ts:

O QUE FAZER O QUE NÃO DEVE FAZER

O novo proxy edgemicro edgemicro_auth está a falhar com o seguinte erro:

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

O novo proxy edgemicro criado hoje não está a funcionar

(O nome do proxy é desconhecido. Não é claro se o proxy está a devolver um erro ou uma resposta inesperada.)

Os nossos clientes estão a receber erros 500 com a seguinte mensagem de erro ao fazer pedidos ao proxy da 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"}}}

Os nossos clientes estão a receber erros 500 ao fazer pedidos ao proxy da API.

(Apenas transmitir erros 500 não nos dá informações adequadas para investigarmos o problema. Precisamos de saber a mensagem de erro e o código de erro reais que estão a ser observados.)

Hora

A hora é uma informação muito importante. É importante que o engenheiro de apoio técnico saiba quando reparou neste problema pela primeira vez, quanto tempo durou e se o problema ainda está a ocorrer.

O técnico de apoio técnico que resolve o problema pode não estar no seu fuso horário. Por isso, as declarações relativas sobre a hora dificultam o diagnóstico do problema. Por isso, é recomendável usar o formato ISO 8601 para a data/hora, de modo a fornecer as informações de hora exatas em que o problema foi observado.

A tabela seguinte apresenta alguns exemplos que mostram a hora e a duração exatas em que o problema ocorreu na coluna DOs e informações ambíguas ou pouco claras sobre quando o problema ocorreu na coluna DON'Ts:

O QUE FAZER O QUE NÃO DEVE FAZER
Foi observado um número elevado de 503s ontem entre 2020-11-06 17:30 PDT e 2020-11-06 17:35 PDT...

Ontem, às 17:30, observou-se um grande número de 503s durante 5 minutos.

(Somos obrigados a usar a data implícita e também não é claro em que fuso horário este problema foi observado.)

Foram observadas latências elevadas nos seguintes proxies de API de 09/11/2020 às 15:30 IST até 09/11/2020 às 18:10 IST ...

Foram observadas latências elevadas em alguns proxies de API na semana passada.

(Não é claro em que dia e durante quanto tempo este problema foi observado na semana passada.)

Configuração

Precisamos de saber os detalhes sobre onde exatamente está a ver o problema. Consoante o produto que está a usar, precisamos das seguintes informações:

  • Se estiver a usar o Apigee no Google Cloud, pode ter mais do que uma organização. Por isso, precisamos de saber a organização específica e outros detalhes onde está a observar o problema:
    • Nomes da organização e do ambiente
    • Nome do proxy da API e números de revisão (para falhas de pedidos de API)
  • Se estiver a usar o híbrido, pode estar a usar uma das muitas plataformas híbridas e topologias de instalação suportadas. Por isso, precisamos de saber que plataforma e topologia híbridas está a usar, incluindo detalhes como o número de centros de dados e nós.

A tabela seguinte apresenta alguns exemplos que mostram informações completas na coluna O QUE FAZER e informações incompletas na coluna O QUE NÃO FAZER:

O QUE FAZER O QUE NÃO DEVE FAZER

401 Os erros aumentaram no Apigee no Google Cloud desde 2020-11-06 09:30 CST.

Detalhes da configuração do Apigee:

Seguem-se os detalhes da API com falhas:
  Nomes das organizações: myorg
  Nomes dos ambientes: test
  Nomes dos proxies de API: myproxy
  Números de revisão: 3

Erro:

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

401 Os erros aumentaram.

(Não dá informações sobre o produto que está a ser usado, desde quando o problema está a ser observado nem detalhes de configuração.)

A depuração está a falhar com o seguinte erro na versão híbrida 1.3 do Apigee

Erro:

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}

Detalhes da configuração do Apigee Hybrid:

  • Plataforma híbrida do Apigee:
      Anthos GKE On-Prem versão 1.4.0
  • Projeto do Google Cloud, organização e ambiente híbridos
      ID do projeto do Google Cloud: apigee-hybrid-123456
      Organização híbrida do Apigee: apigee-hybrid-123456
      Ambiente híbrido do Apigee: dev
  • Detalhes do nome do cluster do Kubernetes
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • Topologia de rede
    Ficheiro network-topology.png anexado.
A depuração está a falhar no Apigee Hybrid.

Artefactos úteis

O envio de artefactos relacionados com o problema acelera a resolução, uma vez que nos ajuda a compreender o comportamento exato que está a observar e a obter mais estatísticas sobre o mesmo.

Esta secção descreve alguns artefactos úteis que são úteis para todos os produtos Apigee:

Artefactos comuns a todos os produtos Apigee

Os seguintes artefactos são úteis para todos os produtos Apigee: Apigee no Google Cloud e Apigee Hybrid:

Artefacto Descrição
Resultado da ferramenta de depuração O resultado da ferramenta de depuração contém informações detalhadas sobre os pedidos da API que fluem através dos produtos Apigee. Isto é útil para quaisquer erros de tempo de execução, como 4XX, 5XX e problemas de latência.
Capturas de ecrã As capturas de ecrã ajudam a transmitir o contexto do comportamento ou erro real que está a ser observado. É útil para quaisquer erros ou problemas observados, como na IU ou no Analytics.
HAR (Http ARchive) O HAR é um ficheiro capturado por ferramentas de sessão HTTP para depurar problemas relacionados com a IU. Pode capturar esta informação através de navegadores como o Chrome, o Firefox ou o Internet Explorer.
tcpdumps A ferramenta tcpdump captura pacotes TCP/IP transferidos ou recebidos através da rede. Isto é útil para quaisquer problemas relacionados com a rede, como falhas de handshake do TLS, erros 502 e problemas de latência, etc.

Artefactos adicionais para híbrido

Para a configuração híbrida, podemos precisar de alguns artefactos adicionais que facilitem um diagnóstico mais rápido dos problemas.

Artefacto Descrição
Plataforma Apigee Hybrid Especifique qualquer uma das seguintes plataformas híbridas suportadas que são usadas:
  • GKE
  • GKE On-Prem
  • AKS (Serviço Azure Kubernetes)
  • Amazon EKS
  • GKE no AWS
Versões do Apigee Hybrid e dos componentes dependentes
  • Versão da CLI do Apigee Hybrid: Versão
    apigeectl
  • Versão do agente do Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versão do MART do Apigee:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versão do sincronizador do Apigee:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Versão do Cassandra do Apigee:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Versão do Apigee Runtime:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • Versões do servidor e da CLI do Kubernetes: Versão
    kubectl
  • Versões da CLI e do servidor do Istio: Versão
    istioctl
Topologia de rede O diagrama da topologia de instalação do Apigee que descreve a sua configuração híbrida, incluindo todos os centros de dados, clusters do Kubernetes, espaços de nomes e pods.
Substitui o ficheiro YAML O ficheiro overrides.yaml usado em cada centro de dados para instalar o plano de tempo de execução híbrido do Apigee.
Estado da implementação do Apigee Hybrid

O resultado dos seguintes comandos em cada centro de dados/cluster do Kubernetes:

kubectl get pods -A
kubectl get services -A

Registos de componentes do Apigee Hybrid

Forneça links para os registos do Cloud Operations (StackDriver) dos componentes híbridos OU

Pode obter os registos de componentes do Apigee hybrid através dos seguintes comandos em cada data center/cluster do Kubernetes e partilhá-los connosco:

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

  • Registos do agente do Apigee Connect:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Registos MART:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Registos do sincronizador:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Registos do Apigee Cassandra:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Registos de MP/Apigee Runtime (de todos os pods apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Descrever registos

Informações detalhadas sobre o agrupamento.

Isto é útil, especialmente, se estiver a observar problemas como a ocorrência de bloqueios de pods no estado CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Associe ao painel de controlo de métricas
  • Capturas de ecrã de quaisquer painéis de controlo relacionados com as métricas do Cloud Monitoring.

Must-gather do Apigee Hybrid

Também pode executar o script Must-Gather com base nos comandos indicados abaixo;

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

Assim que os registos forem gerados, comprima todos os ficheiros de saída num único ficheiro tar usando o comando abaixo:

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

Caso o tamanho do ficheiro TAR seja superior a 25 MB, pode carregá-lo para o Google Drive e partilhar o link connosco. Em alternativa, pode usar o comando split para dividir os ficheiros grandes em partes de 25 MB que podem ser carregadas para o portal de apoio técnico.

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

Apigee Hybrid Cassandra must-gather

Recolha dados básicos

Forneça as seguintes informações:

  • Plataforma híbrida do Apigee (GKE, GKE On-Prem, AKS, EKS, etc.)
  • Versão híbrida do Apigee
  • ID do projeto do Google Cloud
  • Organização do Apigee Hybrid
  • Ambiente híbrido do Apigee
  • É uma implementação de região única ou múltipla?
  • O ficheiro overrides.yaml (um para cada cluster)
  • Quantas organizações do Apigee Hybrid estão instaladas num cluster?
  • Houve alterações recentes?

Recolha informações de depuração do 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

Modelos de registos e registos de amostra

Esta secção fornece modelos de registos e registos de exemplo para diferentes produtos com base nas práticas recomendadas descritas neste documento:

Apigee Cloud

Modelo

Esta secção fornece um modelo de exemplo para o Apigee na Google Cloud.

Problema:

<Provide detailed description of the problem or the behaviour being observed at your end. Inclua o nome e a versão do produto, quando aplicável.>

Mensagem de erro:

<Include the complete error message observed (if any)>

Hora de início do problema (formato ISO 8601):

Hora de fim do problema (formato ISO 8601):

Detalhes da configuração do Apigee:
  Nomes das organizações:
  Nomes dos ambientes:
  Nomes dos proxies de API:
  Números de revisão:

Passos para reproduzir:

<Indique os passos para reproduzir o problema, sempre que possível>

Informações de diagnóstico:

<List of files attached>

Exemplo de registo

Esta secção fornece um exemplo de registo para o Apigee no Google Cloud.

Problema:

Estamos a registar um número elevado de erros 503 Service Unavailable na nossa organização do Public Cloud. Pode analisar o problema e resolvê-lo ou indicar-nos como o resolver?

Mensagem de erro:

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

Hora de início do problema (formato ISO 8601): 2020-10-04 06:30 IST

Hora de fim do problema (formato ISO 8601): o problema ainda está a acontecer.

Detalhes da configuração do Apigee Cloud:
  Nomes das organizações: myorg
  Nomes dos ambientes: dev
  Nomes dos proxies de API: myproxy
  Números de revisão: 3

Passos para reproduzir:

Execute o seguinte comando curl para reproduzir o problema:

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

Informações de diagnóstico:

Resultado da ferramenta de depuração (trace-503.xml)

Híbrido

Modelo

Esta secção fornece um modelo de exemplo para o Apigee Hybrid.

Problema:

<Provide detailed description of the problem or the behaviour being observed at your end. Inclua o nome e a versão do produto, quando aplicável.>

Mensagem de erro:

<Include the complete error message observed (if any)>

Hora de início do problema (formato ISO 8601):

Hora de fim do problema (formato ISO 8601):

Detalhes da configuração do Apigee Hybrid:

  • Plataforma híbrida do Apigee:

    <Provide the information about the Platform where you have installed hybrid and its version.>

  • Projeto do Google Cloud, organização e ambiente híbridos:
      ID do projeto do Google Cloud:
      <Se estiver a usar o Google Kubernetes Engine (GKE), certifique-se de que indica o ID do projeto onde os clusters estão localizados. Se estiver a usar o GKE on-prem, o Azure Kubernetes Service ou o Amazon EKS, indique o ID do projeto para o qual está a enviar os registos.>
      Organização do Apigee Hybrid:
      Ambiente do Apigee Hybrid:
  • Apigee Hybrid e outras versões da CLI:
      Versão da CLI do Apigee Hybrid (apigeectl):
      Versão do Kubectl:
  • Detalhes do nome do cluster do Kubernetes:
      k8sCluster:
      name:
      region:
  • Topologia de rede:
    <Anexe a topologia de rede que descreve a configuração do Apigee Hybrid, incluindo data centers, clusters Kubernetes, espaços de nomes e pods.>
  • Ficheiro YAML de substituições:
    <Anexe o ficheiro YAML de substituições.>

Passos para reproduzir

<Indique os passos para reproduzir o problema, sempre que possível>

Informações de diagnóstico:

<List of files attached>

Exemplo de registo

Esta secção apresenta um exemplo de caso para o Apigee Hybrid.

Problema:

Estamos a receber erros ao executar APIs de gestão na versão 1.3 híbrida do Apigee.

Mensagem de erro:

[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 início do problema (formato ISO 8601): desde 2020-10-24 10:30 PDT

Hora de fim do problema (formato ISO 8601): o problema continua a ser observado.

Detalhes da configuração do Apigee Hybrid:

  • Plataforma Apigee Hybrid
    Versão do GKE 1.15.1
  • Projeto do Google Cloud, organização e ambiente híbridos
      ID do projeto do Google Cloud: apigee-hybrid-123456
      Nota: este é o ID do projeto onde os clusters estão localizados.
      Organização do Apigee Hybrid: apigee-hybrid-123456
      Ambiente do Apigee Hybrid: dev
  • Apigee Hybrid e outras versões da CLI:
      Versão da CLI do Apigee Hybrid (apigeectl):
        Versão: 1.2.0
        Commit: ac09109
        ID da compilação: 214
        Hora da compilação: 2020-03-30T20:23:36Z
        Versão Go: go1.12

      Versão do Kubectl:
        Versão do 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"}

        Versão do servidor:
    version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
  • Detalhes do nome do cluster do Kubernetes:
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • Topologia de rede
    Anexou o ficheiro network-topology.png
  • Substitui o ficheiro YAML
    Anexou o ficheiro overrides.yaml

Passos para reproduzir:

Execute a seguinte API de gestão para observar o erro:

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

Informações de diagnóstico:

Anexou os seguintes ficheiros:

  • network-topology.png
  • overrides.yaml file
  • Registos MART
  • Registos do sincronizador