Best practice per le richieste di assistenza Apigee di Google Cloud

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

Fornire informazioni dettagliate e richieste nella richiesta di assistenza consente al team di assistenza Google Cloud di risponderti in modo rapido ed efficiente. Quando nella richiesta di assistenza mancano dettagli fondamentali, dobbiamo chiedere ulteriori informazioni, il che potrebbe comportare diversi scambi di messaggi. Questa operazione richiede più tempo e può comportare ritardi nella risoluzione dei problemi. Questa guida alle best practice ti indica le informazioni di cui abbiamo bisogno per risolvere più rapidamente la tua richiesta di assistenza tecnica.

Descrizione del problema

Un problema deve contenere informazioni che spieghino i dettagli di ciò che è successo rispetto a ciò che ci si aspettava, nonché quando e come è successo. Una richiesta di assistenza valida deve contenere le seguenti informazioni chiave per ciascuno dei prodotti Apigee:

Informazioni chiave Descrizione Apigee su Google Cloud Apigee hybrid
Prodotto Prodotto Apigee specifico in cui viene osservato il problema, incluse le informazioni sulla versione, se applicabile.
  • Versione ibrida
Dettagli del problema Descrizione chiara e dettagliata del problema che ne illustri la natura, incluso il messaggio di errore completo, se presente.
  • Messaggio di errore
  • Output dello strumento di debug
  • Passaggi per riprodurre il problema
  • Richiesta/comando API completo
  • Messaggio di errore
  • Output dello strumento di debug
  • Passaggi per riprodurre il problema
  • Richiesta/comando API completo
  • Log di diagnostica dei componenti
  • Metriche di Cloud Monitoring
Ora il timestamp specifico in cui è iniziato il problema e la sua durata.
  • Data, ora e fuso orario in cui si è verificato il problema
  • Durata del problema
  • Data, ora e fuso orario in cui si è verificato il problema
  • Durata del problema
Configurazione Informazioni dettagliate su dove viene osservato il problema.
  • Nome dell'organizzazione
  • Nome ambiente
  • Nome del proxy API
  • Revisione

Le sezioni seguenti descrivono questi concetti in modo più dettagliato.

Prodotto

Esistono diversi prodotti Apigee, Apigee su Google Cloud e Apigee Hybrid, quindi abbiamo bisogno di informazioni specifiche sul prodotto particolare che presenta il problema.

La tabella seguente fornisce alcuni esempi che mostrano informazioni complete nella colonna COSA FARE e informazioni incomplete nella colonna COSA NON FARE:

Azioni consigliate Azioni da evitare
Il deployment del proxy API OAuth2 non è riuscito nella nostra organizzazione Apigee su Google Cloud

Il deployment del proxy API non è riuscito

(Dobbiamo sapere in quale prodotto Apigee si verifica il problema.)

Si è verificato il seguente errore durante l'accesso a Cassandra utilizzando cqlsh su Apigee hybrid versione 1.3 ...

Non riusciamo ad accedere a Cassandra utilizzando cqlsh.

(Mancano le informazioni sulla versione ibrida)

Dettagli del problema

Fornisci informazioni precise sul problema osservato, incluso il messaggio di errore (se presente) e il comportamento previsto e effettivo osservato.

La tabella seguente fornisce alcuni esempi che mostrano informazioni complete nella colonna COSA FARE e informazioni incomplete nella colonna COSA NON FARE:

Azioni consigliate Azioni da evitare

Il nuovo proxy edgemicro edgemicro_auth non funziona e restituisce il seguente errore:

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

Il nuovo proxy edgemicro creato oggi non funziona

Il nome del proxy è sconosciuto. Non è chiaro se il proxy restituisce un errore o una risposta imprevista.)

I nostri clienti ricevono errori 500 con il seguente messaggio di errore durante l'invio di richieste al proxy 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"}}}

I nostri clienti ricevono errori 500 durante l'invio di richieste al proxy API.

(La semplice comunicazione di 500 errori non fornisce informazioni adeguate per consentirci di analizzare il problema. Dobbiamo conoscere il messaggio di errore e il codice di errore effettivi che vengono osservati.)

Ora

Il tempo è un'informazione molto importante. È importante che l'ingegnere dell'assistenza sappia quando hai notato per la prima volta questo problema, per quanto tempo è durato e se il problema persiste ancora.

Il tecnico dell'assistenza che si occupa del problema potrebbe non trovarsi nel tuo fuso orario, per cui affermazioni relative all'ora rendono più difficile la diagnosi del problema. Pertanto, è consigliabile utilizzare il formato ISO 8601 per il timestamp di data e ora per fornire informazioni precise sull'ora in cui è stato osservato il problema.

La tabella seguente fornisce alcuni esempi che mostrano l'ora e la durata esatte in cui si è verificato il problema nella colonna COSA FARE e informazioni ambigue o poco chiare su quando si è verificato il problema nella colonna COSA NON FARE:

Azioni consigliate Azioni da evitare
Ieri è stato osservato un numero elevato di 503s tra le ore 2020-11-06 17:30 PDT e le ore 2020-11-06 17:35 PDT...

Ieri alle 17:30 è stato osservato un numero elevatissimo di 503s per 5 minuti.

(Siamo costretti a utilizzare la data implicita e non è chiaro in quale fuso orario è stato osservato questo problema.)

Sono state osservate latenze elevate sui seguenti proxy API a partire dal giorno 2020-11-09 15:30 IST fino al giorno 2020-11-09 18:10 IST ...

La settimana scorsa sono state osservate latenze elevate su alcuni proxy API.

(Non è chiaro in quale giorno e per quale durata è stato osservato questo problema nell'ultima settimana.)

Configurazione

Abbiamo bisogno di conoscere i dettagli su dove esattamente stai riscontrando il problema. A seconda del prodotto che utilizzi, abbiamo bisogno delle seguenti informazioni:

  • Se utilizzi Apigee su Google Cloud, potresti avere più di un'organizzazione, quindi abbiamo bisogno di conoscere l'organizzazione specifica e altri dettagli in cui si verifica il problema:
    • Nomi dell'organizzazione e dell'ambiente
    • Nome del proxy API e numeri di revisione (per gli errori di richiesta API)
  • Se utilizzi ibrido, potresti utilizzare una delle numerose piattaforme ibride e topologie di installazione supportate. Quindi dobbiamo sapere quale piattaforma e topologia ibrida utilizzi, inclusi i dettagli come il numero di data center e nodi.

La tabella seguente fornisce alcuni esempi che mostrano informazioni complete nella colonna Cosa fare e informazioni incomplete nella colonna Cosa non fare:

Azioni consigliate Azioni da evitare

401 Gli errori sono aumentati su Apigee su Google Cloud a partire dal giorno 2020-11-06 09:30 CST.

Dettagli della configurazione di Apigee:

I dettagli dell'API non riuscita sono i seguenti:
  Nomi delle organizzazioni: myorg
  Nomi degli ambienti: test
  Nomi dei proxy API: myproxy
  Numeri di revisione: 3

Errore:

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

Gli errori 401 sono aumentati.

Non fornisce informazioni sul prodotto in uso, su quando è stato osservato il problema o su eventuali dettagli di configurazione.

Il debug non riesce e viene visualizzato il seguente errore nella versione 1.3 di Apigee hybrid

Errore:

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}

Dettagli della configurazione di Apigee Hybrid:

  • Piattaforma Apigee hybrid:
      Anthos GKE On-Prem versione 1.4.0
  • Progetto, organizzazione e ambiente ibridi Google Cloud
      ID progetto Google Cloud: apigee-hybrid-123456
      Organizzazione ibrida Apigee: apigee-hybrid-123456
      Ambiente ibrido Apigee: dev
  • Dettagli del nome del cluster Kubernetes
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • Topologia di rete
    Ho allegato il file network-topology.png.
Il debug non riesce su Apigee hybrid.

Artefatti utili

Fornendo artefatti correlati al problema, puoi velocizzare la risoluzione, in quanto ci aiutano a comprendere il comportamento esatto che stai osservando e a ottenere maggiori informazioni al riguardo.

Questa sezione descrive alcuni artefatti utili per tutti i prodotti Apigee:

Artefatti comuni per tutti i prodotti Apigee

I seguenti artefatti sono utili per tutti i prodotti Apigee: Apigee su Google Cloud e Apigee hybrid:

Artefatto Descrizione
Output dello strumento di debug L'output dello strumento di debug contiene informazioni dettagliate sulle richieste API che scorrono attraverso i prodotti Apigee. Ciò è utile per eventuali errori di runtime come 4XX, 5XX e problemi di latenza.
Screenshot Gli screenshot aiutano a trasmettere il contesto del comportamento o dell'errore effettivo osservato. È utile per eventuali errori o problemi osservati, ad esempio nell'interfaccia utente o in Analytics.
HAR (Http ARchive) HAR è un file acquisito dagli strumenti di sessione HTTP per il debug di eventuali problemi relativi all'interfaccia utente. Può essere acquisito utilizzando browser come Chrome, Firefox o Internet Explorer.
tcpdumps Lo strumento tcpdump acquisisce i pacchetti TCP/IP trasferiti o ricevuti tramite la rete. Ciò è utile per qualsiasi problema correlato alla rete, ad esempio errori di handshake TLS, errori 502 e problemi di latenza e così via.

Artefatti aggiuntivi per l'ibrido

Per l'ibrido, potremmo aver bisogno di alcuni artefatti aggiuntivi che faciliteranno una diagnosi più rapida dei problemi.

Artefatto Descrizione
Piattaforma Apigee hybrid Specifica una delle seguenti piattaforme ibride supportate utilizzate:
  • GKE
  • GKE On-Prem
  • AKS (Azure Kubernetes Service)
  • Amazon EKS
  • GKE su AWS
Versioni di Apigee hybrid e dei componenti dipendenti
  • Versione della CLI Apigee hybrid: Versione
    apigeectl
  • Versione dell'agente Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versione di Apigee MART:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versione di Apigee Synchronizer:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Versione di Apigee Cassandra:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Versione di Apigee Runtime:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • Versioni dell'interfaccia a riga di comando e del server Kubernetes: versione
    kubectl
  • Versioni della CLI e del server Istio: versione
    istioctl
Topologia di rete Il diagramma della topologia di installazione di Apigee che descrive la configurazione ibrida, inclusi tutti i data center, i cluster Kubernetes, gli spazi dei nomi e i pod.
File YAML di override Il file overrides.yaml utilizzato in ogni data center per l'installazione del piano di runtime Apigee hybrid.
Stato del deployment di Apigee hybrid

L'output dei seguenti comandi in ogni data center/cluster Kubernetes:

kubectl get pods -A
kubectl get services -A

Log dei componenti di Apigee hybrid

Fornisci link ai log di Suite operativa di Google Cloud (Stackdriver) per i componenti ibridi OPPURE

Puoi recuperare i log dei componenti di Apigee hybrid utilizzando i seguenti comandi in ogni data center/cluster Kubernetes e condividerli con noi:

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

  • Log dell'agente Apigee Connect:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Log di MART:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • Log del sincronizzatore:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • Log di Apigee Cassandra:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Log MP/Apigee Runtime (di tutti i pod apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
Descrivi i log

Informazioni dettagliate sul pod.

Ciò è utile soprattutto se osservi problemi come il blocco dei pod nello stato CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Link alla dashboard delle metriche
  • Snapshot di tutte le dashboard correlate alle metriche di Cloud Monitoring.

Apigee hybrid must-gather

Puoi anche eseguire lo script Must-Gather in base ai comandi elencati di seguito:

###--- "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 volta generati i log, comprimi tutti i file di output in un unico file tar utilizzando il comando riportato di seguito:

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

Se le dimensioni del file tar sono superiori a 25 MB, puoi caricarlo su Google Drive e condividere il link con noi. In alternativa, puoi utilizzare il comando split per dividere i file di grandi dimensioni in blocchi da 25 MB che possono essere caricati sul portale di assistenza.

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

Apigee hybrid Cassandra must-gather

Raccogliere dati di base

Fornisci le seguenti informazioni:

  • Piattaforma Apigee hybrid (GKE, GKE On-Prem, AKS, EKS e così via)
  • Versione di Apigee hybrid
  • ID progetto Google Cloud
  • Organizzazione Apigee hybrid
  • Ambiente Apigee hybrid
  • Si tratta di un deployment in una o più regioni?
  • Il file overrides.yaml (uno per ogni cluster)
  • Quante organizzazioni Apigee Hybrid sono installate su un cluster?
  • Sono state apportate modifiche recenti?

Raccogliere informazioni di debug di 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

Modelli di richieste e richieste di esempio

Questa sezione fornisce modelli di casi e casi di esempio per diversi prodotti in base alle best practice descritte in questo documento:

Apigee Cloud

Modello

Questa sezione fornisce un modello di esempio per Apigee su Google Cloud.

Problema:

<Fornisci una descrizione dettagliata del problema o del comportamento osservato. Includi il nome e la versione del prodotto, se applicabile.>

Messaggio di errore:

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

Ora di inizio del problema (formato ISO 8601):

Ora di fine del problema (formato ISO 8601):

Dettagli della configurazione di Apigee:
  Nomi delle organizzazioni:
  Nomi degli ambienti:
  Nomi dei proxy API:
  Numeri di revisione:

Passaggi per la riproduzione:

<Fornisci i passaggi per riprodurre il problema, se possibile>

Informazioni di diagnostica:

<List of files attached>

Caso di esempio

Questa sezione fornisce un caso di esempio per Apigee su Google Cloud.

Problema:

Stiamo riscontrando un numero elevato di errori 503 Service Unavailable nella nostra organizzazione Public Cloud. Potete esaminare il problema e risolverlo o consigliarci come risolverlo?

Messaggio di errore:

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

Ora di inizio del problema (formato ISO 8601): 2020-10-04 06:30 IST

Ora di fine del problema (formato ISO 8601): il problema persiste.

Dettagli della configurazione di Apigee Cloud:
  Nomi delle organizzazioni: myorg
  Nomi degli ambienti: dev
  Nomi dei proxy API: myproxy
  Numeri di revisione: 3

Passaggi per la riproduzione:

Esegui questo comando curl per riprodurre il problema:

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

Informazioni di diagnostica:

Output dello strumento di debug (trace-503.xml)

Ibrido

Modello

Questa sezione fornisce un modello di esempio per Apigee hybrid.

Problema:

<Fornisci una descrizione dettagliata del problema o del comportamento osservato. Includi il nome e la versione del prodotto, se applicabile.>

Messaggio di errore:

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

Ora di inizio del problema (formato ISO 8601):

Ora di fine del problema (formato ISO 8601):

Dettagli della configurazione di Apigee Hybrid:

  • Piattaforma Apigee hybrid:

    <Fornisci le informazioni sulla piattaforma in cui hai installato Hybrid e sulla relativa versione.>

  • Progetto Google Cloud, organizzazione e ambiente ibridi:
      ID progetto Google Cloud:
      <Se utilizzi Google Kubernetes Engine (GKE), assicurati di fornire l'ID progetto in cui si trovano i cluster. Se utilizzi GKE on-premise, Azure Kubernetes Service o Amazon EKS, fornisci l'ID progetto in cui invii i log.>
      Organizzazione Apigee Hybrid:
      Ambiente Apigee Hybrid:
  • Apigee hybrid e altre versioni della CLI:
      Versione della CLI Apigee hybrid (apigeectl):
      Versione di Kubectl:
  • Dettagli del nome del cluster Kubernetes:
      k8sCluster:
      name:
      region:
  • Topologia di rete:
    <Allega la topologia di rete che descrive la configurazione di Apigee Hybrid, inclusi data center, cluster Kubernetes, spazi dei nomi e pod.>
  • File YAML di override:
    <Allega il file YAML di override.>

Passaggi per la riproduzione del problema

<Fornisci i passaggi per riprodurre il problema, se possibile>

Informazioni di diagnostica:

<List of files attached>

Caso di esempio

Questa sezione fornisce un caso di esempio per Apigee hybrid.

Problema:

Riceviamo errori durante l'esecuzione delle API di gestione su Apigee hybrid versione 1.3.

Messaggio di errore:

[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"
}
}

Ora di inizio del problema (formato ISO 8601): dal giorno 2020-10-24 10:30 PDT

Ora di fine del problema (formato ISO 8601): il problema continua a essere osservato.

Dettagli della configurazione di Apigee Hybrid:

  • Piattaforma Apigee hybrid
    GKE versione 1.15.1
  • Progetto Google Cloud, organizzazione e ambiente ibridi
      ID progetto Google Cloud: apigee-hybrid-123456
      Nota:questo è l'ID progetto in cui si trovano i cluster.
      Organizzazione Apigee hybrid: apigee-hybrid-123456
      Ambiente Apigee hybrid: dev
  • Apigee Hybrid e altre versioni della CLI:
      Versione della CLI Apigee Hybrid (apigeectl):
        Versione: 1.2.0
        Commit: ac09109
        ID build: 214
        Ora di build: 2020-03-30T20:23:36Z
        Versione Go: go1.12

      Versione di Kubectl:
        Versione client:
    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"}

        Versione server:
    version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
  • Dettagli del nome del cluster Kubernetes:
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • Network Topology
    Allegato il file network-topology.png
  • File YAML di override
    File overrides.yaml allegato

Passaggi per la riproduzione:

Esegui la seguente API Management per osservare l'errore:

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

Informazioni di diagnostica:

Allegati i seguenti file:

  • network-topology.png
  • overrides.yaml file
  • Log di MART
  • Log del sincronizzatore