Esta é a documentação da Apigee e da Apigee híbrida.
Veja a documentação da Apigee
Edge.
O fornecimento de informações detalhadas e necessárias no caso de suporte facilita o trabalho mais rápido e eficiente da equipe de suporte do Google Cloud. Quando seu caso de suporte não tem detalhes importantes, precisamos solicitar mais informações, o que pode envolver várias etapas. Isso leva mais tempo e pode causar atrasos na resolução dos problemas. Neste guia de práticas recomendadas, você conhecerá as informações necessárias para resolver seu caso de suporte técnico mais rapidamente.
Como descrever o problema
Um problema precisa conter informações sobre o que aconteceu em comparação com o que era esperado, quando e como isso aconteceu. Um bom caso de suporte precisa conter as seguintes informações importantes sobre cada um dos produtos da Apigee:
Key information | Descrição | Apigee no Google Cloud | Apigee híbrido |
---|---|---|---|
Produto | Produto específico da Apigee em que o problema está sendo observado, incluindo informações de versão, quando aplicável. |
|
|
Detalhes do problema | Descrição clara e detalhada do problema, incluindo a mensagem de erro completa, se houver. |
|
|
Tempo | Carimbo de data/hora específico em que o problema começou e por quanto tempo ele durou. |
|
|
Configuração | Informações detalhadas em que o problema está sendo observado. |
|
|
As seções a seguir descrevem esses conceitos em mais detalhes.
Produto
Há diferentes produtos da Apigee, Apigee no Google Cloud e Apigee híbrida. Portanto, precisamos de informações específicas sobre qual produto específico está com o problema.
A tabela a seguir mostra alguns exemplos que mostram informações completas na coluna O que fazer e informações incompletas na coluna O que evitar:
O que fazer | O que evitar |
---|---|
Falha na implantação do proxy de API OAuth2 na nossa organização da Apigee no Google Cloud... |
Falha na implantação do proxy da API É necessário saber o produto da Apigee em que você está enfrentando o problema. |
Estamos recebendo o seguinte erro ao acessar o Cassandra usando cqlsh na versão híbrida 1.3 da Apigee... |
Não foi possível acessar o Cassandra usando Faltam informações de versão híbridas |
Detalhes do problema
Forneça informações precisas sobre o problema que está sendo observado, incluindo a mensagem de erro (se houver) e o comportamento esperado e real observado.
A tabela a seguir mostra alguns exemplos que mostram informações completas na coluna O que fazer e informações incompletas na coluna O que evitar:
O que fazer | O que evitar |
---|---|
O novo proxy
|
O novo proxy O nome do proxy é desconhecido. Não está claro se o proxy está retornando um erro ou uma resposta inesperada. |
Nossos clientes estão recebendo erros
|
Nossos clientes estão recebendo erros
Apenas transmitir erros |
Tempo
O tempo é uma informação muito importante. É importante que o engenheiro de suporte saiba quando você percebeu esse problema pela primeira vez, por quanto tempo ele durou e se o problema ainda está acontecendo.
O engenheiro de suporte que resolver o problema talvez não esteja no seu fuso horário, então frases genéricas sobre o tempo dificultam o diagnóstico. Portanto, é recomendável usar o formato ISO 8601 para o carimbo de data e hora para fornecer a informação exata da hora em que o problema foi observado.
A tabela a seguir fornece alguns exemplos que mostram o horário e a duração precisa em que o problema ocorreu na coluna O que fazer e informações ambíguas ou pouco claras sobre quando o problema ocorreu na coluna O que evitar:
O que fazer | O que evitar |
---|---|
Um enorme número de 503s foi observado ontem entre 06/11/2020 17h30 PDT e 06/11/2020 17h35 PDT... |
Um enorme número de Somos forçados a usar a data implícita e não é claro em qual fuso horário esse problema foi observado. |
Latências altas foram observadas nos proxies de API a seguir entre 09/11/2020 15h30 IST e 09/11/2020 18h10 IST... |
As latências altas foram observadas em alguns proxies de API na semana passada. Não está claro em qual dia e em que duração esse problema foi observado na última semana. |
Instalação
Precisamos saber os detalhes de onde o problema está ocorrendo. Dependendo do produto que você está usando, precisamos das seguintes informações:
- Se você estiver usando a Apigee no Google Cloud, poderá ter mais de uma organização. Por isso, precisamos saber exatamente qual é a organização que está apresentando o problema, além de outros detalhes:
- Nomes de organização e ambiente
- Nome do proxy da API e números de revisão (para falhas de solicitação de API)
- Se você estiver usando a híbrida, talvez esteja usando uma das muitas plataformas híbridas e topologias de instalação compatíveis. Então, precisamos saber qual plataforma híbrida e topologia você está usando, incluindo detalhes como número de data centers e nós.
A tabela a seguir mostra alguns exemplos que mostram informações completas na coluna O que fazer e informações incompletas na coluna O que evitar:
O que fazer | O que evitar |
---|---|
Os erros Detalhes de configuração da Apigee:
Os detalhes da API com falha são os seguintes:
Erro:
|
Ela não fornece informações sobre o produto que está sendo usado, desde que o problema está sendo observado ou quaisquer detalhes da configuração. |
A depuração está apresentando falha com o seguinte erro na versão híbrida 1.3 da Apigee Erro:
Detalhes da configuração híbrida da Apigee:
| Falha de depuração no Apigee híbrido. |
Elementos úteis
Informar quais artefatos estão relacionados ao problema agilizará a resolução, já que isso nos ajuda a entender o comportamento exato que você está observando e ver mais insights sobre isso.
Esta seção descreve alguns artefatos úteis para todos os produtos da Apigee:
Artefatos comuns a todos os produtos da Apigee
Os seguintes artefatos são úteis para todos os produtos da Apigee: Apigee no Google Cloud e Apigee híbrida:
Artefato | Descrição |
---|---|
Saída da ferramenta de depuração | A saída da ferramenta de depuração contém informações detalhadas sobre as solicitações de API que passam pelos
produtos da Apigee. Isso é útil para qualquer erro de ambiente de execução, como 4XX , 5XX e problemas de latência. |
Capturas de tela | Capturas de tela ajudam a retransmitir o contexto do comportamento ou erro real sendo observado. Ela é útil para quaisquer erros ou problemas observados, como na interface do usuário ou no Google Analytics. |
HAR (Http ARchive) | HAR é um arquivo capturado por ferramentas de sessão HTTP para depurar problemas relacionados à IU. Isso pode ser capturado usando navegadores como Chrome, Firefox ou Internet Explorer. |
tcpdumps |
A ferramenta tcpdump captura pacotes TCP/IP transferidos ou recebidos pela rede. Isso é útil para qualquer problema relacionado à rede, como falhas de handshake de TLS, erros de 502 , problemas de latência etc. |
Outros artefatos para ambientes híbridos
Para a híbrida, talvez sejam necessários artefatos adicionais que facilitem o diagnóstico de problemas.
Artefato | Descrição |
---|---|
Plataforma híbrida da Apigee | Especifique uma das
plataformas híbridas compatíveis que são usadas:
|
Versões de componentes híbridos e dependentes da Apigee |
|
Topologia de rede | O diagrama de topologia de instalação da Apigee que descreve a configuração híbrida, incluindo todos os data centers, clusters do Kubernetes, namespaces e pods. |
Modifica o arquivo YAML | O arquivo overrides.yaml usado em cada data center para instalar o plano de ambiente de execução híbrido da Apigee.
|
Status da implantação híbrida da Apigee |
A saída dos seguintes comandos em cada cluster de data center/Kubernetes:
|
Registros de componentes híbridos da Apigee |
Fornecer links para os registros do StackDriver para os componentes híbridos OU É possível buscar os registros do componente híbrido da Apigee usando os seguintes comandos em cada cluster de data center/cluster do Kubernetes e compartilhá-los conosco:
|
Descrever registros |
Informações detalhadas sobre o pod. Isso é útil especialmente se você estiver observando problemas como os pods ficarem presos no estado
|
Cloud Monitoring |
|
Necessidade da Apigee híbrida
Também é possível executar o script Must-Gather com base nos comandos listados 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 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 ; doneDepois que os registros forem gerados, compacte todos os arquivos de saída em um único arquivo tar com o comando abaixo.
# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*
Se o tamanho do arquivo tar for maior que 25 MB, faça o upload dele no Google Drive e compartilhe o link conosco. Também é possível usar o comando "split" para dividir os arquivos grandes em blocos de 25 MB que podem ser enviados ao portal de suporte.
# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"
Modelos de casos e casos de amostra
Nesta seção, são fornecidos modelos de casos e exemplos de produtos diferentes com base nas práticas recomendadas descritas neste documento:
Apigee Cloud
Modelo
Nesta seção, apresentamos um modelo de exemplo da Apigee no Google Cloud.
Problema:
<Forneça uma descrição detalhada do problema ou o comportamento observado por você. Inclua o nome e a versão do produto quando aplicável.>
Mensagem de erro:
<Inclua a mensagem de erro completa observada (se houver)>
Horário de início do problema (formato ISO 8601):
Horário de término do problema (formato ISO 8601):
Detalhes da configuração da Apigee:
Nomes das organizações:
Nomes dos ambientes:
Nomes do proxy da API:
Números das revisões:
Etapas para reproduzir o problema:
<Forneça etapas para reproduzir o problema sempre que possível>
Informações de diagnóstico:
<Lista de arquivos anexados>
Exemplo de caso
Nesta seção, apresentamos um caso de exemplo da Apigee no Google Cloud.
Problema:
Estamos vendo um grande número de erros 503 Service Unavailable em nossa organização de Nuvem pública. Você pode analisar o problema e resolvê-lo ou nos informar como resolvê-lo?
Mensagem de erro:
{"fault":{"faultstring":"The Service is temporarily available", "detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}
Horário de início do problema (formato ISO 8601): 2020-10-04 06:30 IST
Horário de término do problema (formato ISO 8601): o problema ainda está acontecendo.
Detalhes da configuração da Apigee:
Nomes das organizações: myorg
Nomes dos ambientes: dev
Nomes de proxy da API: myproxy
Números das revisões: 3
Etapas para reproduzir o problema:
Execute o seguinte comando curl
para reproduzir o problema:
curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'
Informações de diagnóstico:
Saída da ferramenta de depuração (trace-503.xml
)
Híbrido
Modelo
Nesta seção, apresentamos um modelo de amostra do Apigee híbrido.
Problema:
<Forneça uma descrição detalhada do problema ou o comportamento observado por você. Inclua o nome e a versão do produto quando aplicável.>
Mensagem de erro:
<Inclua a mensagem de erro completa observada (se houver)>
Horário de início do problema (formato ISO 8601):
Horário de término do problema (formato ISO 8601):
Detalhes da configuração híbrida da Apigee:
- Plataforma híbrida da Apigee:
<Forneça as informações sobre a Plataforma em que você instalou o híbrido e a respectiva versão.>
- Projeto do Google Cloud, organização híbrida e ambiente:
ID do projeto do Google Cloud:
<Se você estiver usando o Google Kubernetes Engine (GKE), forneça o ID do projeto em que os clusters estão localizados. Se você estiver usando o GKE On-Prem, o Azure Kubernetes Service ou o Amazon EKS, forneça o ID do projeto para onde enviar os registros.>
Organização híbrida da Apigee:
Ambiente híbrido da Apigee: - Apigee híbrida e outras versões da CLI:
CLI da Apigee híbrida (apigeectl
): versão
do Kubectl: - Detalhes do nome do cluster do Kubernetes:
k8sCluster:
nome:
região: - Topologia de rede:
<Anexe a topologia de rede, que descreve a configuração da Apigee híbrida, incluindo data centers, clusters, namespaces e pods do Apigee.> - Substitui o arquivo YAML:
<Anexa o arquivo YAML substituto.>
etapas para reproduzir o problema
<Forneça etapas para reproduzir o problema sempre que possível>
Informações de diagnóstico:
<Lista de arquivos anexados>
Exemplo de caso
Nesta seção, apresentamos um exemplo de caso da Apigee híbrida.
Problema:
Estamos recebendo erros ao executar APIs de gerenciamento na Apigee híbrida versão 1.3.
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" } }
Horário de início do problema (formato ISO 8601): desde 2020-10-24 10:30 PDT
Horário de término do problema (formato ISO 8601): continuando observando o problema.
Detalhes da configuração híbrida da Apigee:
- Plataforma híbrida da Apigee
GKE versão 1.15.1 - Projeto do Google Cloud, organização híbrida e ambiente
ID do projeto do Google Cloud:apigee-hybrid-123456
Observação: este é o ID do projeto em que os clusters estão localizados.
Organização híbrida da Apigee:apigee-hybrid-123456
Ambiente híbrido da Apigee:dev
- Apigee híbrida e outras versões da CLI:
Versão CLI híbrida da Apigee (apigeectl
):
Versão:1.2.0
Compromisso:ac09109
ID da versão:214
Horário da versão:2020-03-30T20:23:36Z
Versão do 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:
nome:user-cluster-1
região:us-east1
- Topologia de rede
Anexou o arquivonetwork-topology.png
- Substitui o arquivo YAML
O arquivooverrides.yaml
foi anexado
Etapas para reproduzir o problema:
Execute a seguinte API de gerenciamento 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:
Os seguintes arquivos foram anexados:
network-topology.png
overrides.yaml file
- Registros MART
- Registros do sincronizador