Best practice per le richieste di assistenza per Apigee di Google Cloud

Stai visualizzando la documentazione relativa a Apigee e Apigee ibrido.
Visualizza Documentazione di Apigee Edge.

Fornendo informazioni dettagliate e obbligatorie nella richiesta di assistenza, per il team di assistenza di Google Cloud può rispondere rapidamente ed efficiente. Se nella tua richiesta di assistenza mancano dettagli critici, richiedere maggiori informazioni, il che può comportare avanti e indietro più volte. Questa operazione richiede più tempo e può causare ritardi nella risoluzione diverse problematiche. Questa guida alle best practice ti consente di ottenere informazioni dobbiamo risolvere la tua richiesta di assistenza tecnica più velocemente.

Descrizione del problema

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

Informazioni chiave Descrizione Apigee su Google Cloud Apigee hybrid
Prodotto Il prodotto Apigee specifico in cui si verifica il problema, incluse le informazioni sulla versione, se applicabili.
  • Versione ibrida
Dettagli del problema Descrizione chiara e dettagliata che chiarisca il problema. incluso l'eventuale messaggio di errore completo.
  • Messaggio di errore
  • Output dello strumento di debug
  • Passaggi per riprodurre il problema
  • Richiesta/comando API completa
  • Messaggio di errore
  • Output dello strumento di debug
  • Passaggi per riprodurre il problema
  • Richiesta/comando API completa
  • Log della diagnostica dei componenti
  • Metriche di Cloud Monitoring
Ora Il timestamp specifico in cui è iniziato il problema e per quanto tempo è 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 in cui si verifica il problema.
  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Revisione

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

Prodotto

Esistono diversi prodotti Apigee, Apigee su Google Cloud e Apigee ibrido, quindi abbiamo bisogno di informazioni specifiche in merito il problema è causato da un determinato prodotto.

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

Cose da fare COSA NON FARE
Deployment del proxy API OAuth2 non riuscito sul nostro Organizzazione di Apigee su Google Cloud ...

Deployment del proxy API non riuscito

(Abbiamo bisogno di sapere il prodotto Apigee in cui riscontri il problema.)

Viene visualizzato il seguente errore durante l'accesso a Cassandra tramite cqlsh su Apigee versione ibrida 1.3 ...

Impossibile accedere a Cassandra utilizzando cqlsh.

(Informazioni sulla versione ibrida mancanti)

Dettagli del problema

Fornisci informazioni precise sul problema osservato, incluse le informazioni l'eventuale messaggio di errore e il comportamento previsto ed effettivo osservato.

La tabella seguente fornisce alcuni esempi di informazioni complete nella colonna DO e informazioni incomplete nella Colonna COSA NON FARE:

Cose da fare COSA NON FARE

Il nuovo proxy edgemicro edgemicro_auth è non ha avuto esito positivo con 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 sia restituire un errore o una risposta imprevista.)

I nostri clienti ricevono 500 errori per i seguenti problemi 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 500 errori durante l'invio delle richieste al proxy API.

(La sola trasmissione degli errori 500 non fornisce informazioni per consentirci di effettuare accertamenti in merito al problema. Dobbiamo conoscere messaggio di errore e codice di errore effettivi rilevati.

Ora

Il tempo è un'informazione molto importante. È importante che Tecnico dell'assistenza per sapere quando hai notato il problema per la prima volta e per quanto tempo e se il problema persiste.

Il tecnico del servizio di assistenza che risolve il problema potrebbe non essere nel tuo fuso orario, quindi affermazioni relative sul tempo rendono il problema più difficile da diagnosticare. Per questo motivo, consigliamo di utilizzare ISO 8601 per la data e l'ora per fornire le informazioni esatte sull'ora quando è stato osservato il problema.

La tabella seguente fornisce alcuni esempi che mostrano l'esattezza dell'ora e del durata per la quale si è verificato il problema nella colonna DOS; e informazioni ambigue o poco chiare su quando si è verificato il problema nella Colonna COSA NON FARE:

Cose da fare COSA NON FARE
Ieri sono stati osservati un numero elevato di 503s tra 06/11/2020 17:30 PDT e 06/11/2020 17:35 PDT...

È stato osservato un numero enorme di 503s ieri alle 17:30 per 5 min.

(Siamo costretti a utilizzare la data implicita, ma non è chiaro in il fuso orario in cui si è verificato il problema.

Sono state osservate alte latenze sui seguenti proxy API da Da 09/11/2020 15:30 IST a 09/11/2020 18:10 IST ...

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

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

Configurazione

Dobbiamo conoscere i dettagli del punto esatto in cui stai riscontrando il problema. A seconda del prodotto che utilizzi, abbiamo bisogno delle seguenti informazioni:

  • Se utilizzi Apigee su Google Cloud, potresti avere di un'organizzazione, per cui dobbiamo conoscere l'organizzazione specifica e le altre in cui riscontri il problema:
      .
    • Nomi di organizzazioni e ambienti
    • Nome e numeri di revisione del proxy API (per errori delle richieste API)
  • Se usi lo stile ibrido, è possibile che tu stia usando uno dei tanti supportati . su piattaforme ibride e su topologie di installazione. Dobbiamo quindi sapere la piattaforma ibrida e la topologia in uso, inclusi i dettagli come il numero di data center e nodi.

La seguente tabella fornisce alcuni esempi di informazioni complete nella colonna DO. e incomplete nella colonna COSA NON FARE:

Cose da fare COSA NON FARE

401 errori sono aumentati il giorno Apigee su Google Cloud dal 6/11/2020 09:30 CST.

Dettagli di configurazione Apigee:

I dettagli dell'API in errore sono i seguenti:
Nomi organizzazione: myorg
Nomi di ambiente: test
Nomi 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"}}}

401 Gli errori sono aumentati.

(Non fornisce alcuna informazione sul prodotto utilizzato, dal momento che il problema viene osservato o eventuali dettagli di configurazione).

Il debug non riesce a causa del seguente errore nella versione ibrida Apigee 1.3

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 ibrida Apigee:

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

Artefatti utili

Fornendoci gli artefatti relativi al problema accelererai risoluzione del problema, perché ci aiutano a capire l'esatto comportamento che state osservare e ottenere maggiori informazioni.

In questa sezione vengono descritti alcuni elementi utili per tutti 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 ibridi:

Artefatto Descrizione
Output dello strumento di debug L'output dello strumento di debug contiene informazioni dettagliate sulle richieste API che passano Prodotti Apigee. Ciò è utile per eventuali errori di runtime, ad esempio 4XX, 5XX e problemi di latenza.
Screenshot Gli screenshot aiutano a comunicare il contesto del comportamento effettivo o dell'errore 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 della sessione HTTP per il debug di eventuali problemi relativi all'interfaccia utente. L'acquisizione può essere eseguita utilizzando browser come Chrome, Firefox o Internet Explorer.
tcpdumps Lo strumento tcpdump acquisisce i pacchetti TCP/IP trasferiti o ricevuti tramite in ogni rete. Ciò è utile per eventuali problemi di rete, come errori di handshake TLS, 502 errori, problemi di latenza e così via.

Artefatti aggiuntivi per ambienti ibridi

Per il modello ibrido, potrebbero essere necessari alcuni elementi aggiuntivi che consentano una diagnosi più rapida dei problemi.

Artefatto Descrizione
Piattaforma ibrida Apigee Specifica una delle seguenti opzioni piattaforme ibride supportate che vengono usate:
    .
  • GKE
  • GKE On-Prem
  • AKS (servizio Azure Kubernetes)
  • Amazon EKS
  • GKE su AWS
Versioni dei componenti ibridi e dipendenti di Apigee
  • Versione interfaccia a riga di comando ibrida Apigee: Versione
    apigeectl
  • Versione agente Apigee Connect:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • Versione MART Apigee:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • Versione Apigee Sincronizzar:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • Versione Apigee Cassandra:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • Versione runtime Apigee:
    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 dell'interfaccia a riga di comando e del server di Istio: Versione
    istioctl
Topologia di rete Il diagramma della topologia di installazione di Apigee che descrive la tua configurazione ibrida, incluse tutte le data center, cluster Kubernetes, spazi dei nomi e pod.
Override del file YAML Il file overrides.yaml utilizzato in ogni data center per l'installazione del piano di runtime ibrido Apigee.
Stato del deployment ibrido Apigee

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

kubectl get pods -A
kubectl get services -A

Log dei componenti ibridi Apigee

Fornisci i link ai log di StackDriver per i componenti ibridi OPPURE

Puoi recuperare i log del componente ibrido Apigee utilizzando i seguenti comandi in ogni data center/cluster Kubernetes e condividili con noi:

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

  • Log di Apigee Connect Agent:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • Log 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 Apigee Cassandra:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • Log di runtime MP/Apigee (di tutti i pod di runtime 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 noti problemi come il blocco dei pod nella CrashLoopBackoff.

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • Link alla dashboard delle metriche
  • Snapshot di qualsiasi dashboard correlata alle metriche di Cloud Monitoring.

Imperdibile raccolta ibrida Apigee

Puoi anche eseguire lo script Must-collect 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 2>&1 | tee /tmp/k_get_crd_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ConfigMap -A 2>&1 | tee /tmp/k_get_ConfigMap_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRole -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRoleBinding -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Deployments -A -o wide >&1 | tee /tmp/k_get_deployments_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get events -A -o wide 2>&1 | tee /tmp/k_get_events_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get endpoints -A  2>&1 | tee /tmp/k_get_endpoints_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get issuers -A -o wide 2>&1 | tee /tmp/k_get_issuers_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get mutatingwebhookconfigurations  2>&1 | tee /tmp/k_get_mutatingwebhookconfigurations_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get nodes -o wide --show-labels 2>&1 | tee /tmp/k_get_nodes_labels_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ns 2>&1 | tee /tmp/k_get_namespace_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PriorityClass -A -o wide 2>&1 | tee /tmp/k_get_PriorityClass_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pv -A -o wide 2>&1 | tee /tmp/k_get_pv_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pvc -A -o wide 2>&1 | tee /tmp/k_get_pvc_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Role -A -o wide 2>&1 | tee /tmp/k_get_role_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get RoleBinding -A -o wide 2>&1 | tee /tmp/k_get_Role_Binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get replicaset -A -o wide 2>&1 | tee /tmp/k_get_replicaset_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sa -A -o wide 2>&1 | tee /tmp/k_get_service_accounts_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get services -A -o wide 2>&1 | tee /tmp/k_get_services_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get svc -A 2>&1 | tee /tmp/k_get_svc_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get secrets -A 2>&1 | tee /tmp/k_get_secrets_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations -A  2>&1  | tee /tmp/k_get_validatingwebhookconfigurations_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations apigee-validating-webhook-configuration 2>&1  | tee /tmp/k_get_apigee-validating-webhook-configuration_$(date +%Y.%m.%d_%H.%M.%S).txt

### --- List top resource consuming nodes and pods ---####

kubectl top nodes 2>&1 | tee /tmp/k_top_nodes_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl top pod -A --containers 2>&1 | tee /tmp/k_top_pod_all_containers_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl get" commands to fetch list of all CRD for "apigee" namespace ----- #####

kubectl get all -n apigee -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ad -n apigee 2>&1 | tee /tmp/k_get_ad_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeorganization -n apigee 2>&1 | tee /tmp/k_get_apigeeorganization_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeenv -n apigee  2>&1 | tee /tmp/k_get_apigeeenv_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeds -n apigee  2>&1 | tee /tmp/k_get_apigeeds_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeedatastore -n apigee 2>&1 | tee /tmp/k_get_apigeedatastore_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeDeployment -n apigee 2>&1 | tee /tmp/k_get_apigeedeployment_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRedis -n apigee 2>&1 | tee /tmp/k_get_ApigeeRedis_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRoute -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoute_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRouteConfig -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoutesconfig_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Apigeetelemetry -n apigee 2>&1 | tee /tmp/k_get_Apigeetelemetry_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeissues -n apigee 2>&1 | tee /tmp/k_get_apigeeissues_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ControllerRevision -n apigee -o wide 2>&1 | tee /tmp/k_get_ControllerRevision_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get cronjob -n apigee -o wide 2>&1 | tee /tmp/k_get_cronjob_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get gateway -n apigee 2>&1 | tee /tmp/k_get_gateway_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PodDisruptionBudget -n apigee -o wide 2>&1 | tee /tmp/k_get_PodDisruptionBudget_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sc -n apigee -o wide 2>&1 | tee /tmp/k_get_storageclass_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sts -n apigee 2>&1 | tee /tmp/k_get_sts_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get volumesnapshot -n apigee -o wide 2>&1 | tee /tmp/k_get_volumesnapshot_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands to fetch details of all CRD for "apigee" namespace ----- #####

for p in $(kubectl -n apigee get apigeeorganization --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeorganization ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeorganization_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeenv --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeenv ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeenv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeds --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeds ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeds_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeedatastore --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeedatastore ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeedatastore_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeDeployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeDeployment ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeDeployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRedis --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRedis ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRedis_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRoute --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRoute ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRoute_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRouteConfig --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRouteConfig ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRouteConfig_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get Apigeetelemetry --no-headers -o custom-columns=":metadata.name") ; do kubectl describe Apigeetelemetry ${p} -n apigee 2>&1 | tee /tmp/k_desc_Apigeetelemetry_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeissues --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeissues ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeissues_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ControllerRevision --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe ControllerRevision ${p} 2>&1 | tee /tmp/k_desc_ControllerRevision_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee 2>&1 | tee /tmp/k_desc_certificate_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get cronjob --no-headers -o custom-columns=":metadata.name") ; do kubectl describe cronjob ${p} -n apigee 2>&1 | tee /tmp/k_desc_cronjob_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get daemonset --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe daemonset ${p} 2>&1 | tee /tmp/k_desc_daemonset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get deployments --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe deployments ${p} 2>&1 | tee /tmp/k_desc_deployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get hpa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe hpa ${p} -n apigee 2>&1 | tee /tmp/k_desc_hpa_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee 2>&1 | tee /tmp/k_desc_jobs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get PodDisruptionBudget --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe PodDisruptionBudget ${p} 2>&1 | tee /tmp/k_desc_PodDisruptionBudget_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get pv --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pv ${p} 2>&1 | tee /tmp/k_desc_pv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get pvc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pvc ${p} 2>&1 | tee /tmp/k_desc_pvc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe sc ${p} 2>&1 | tee /tmp/k_desc_storageclass_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get sts --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sts ${p} -n apigee 2>&1 | tee /tmp/k_desc_sts_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe secrets ${p} 2>&1 | tee /tmp/k_desc_secrets_n_apigee${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee 2>&1 | tee /tmp/k_desc_services_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee 2>&1 | tee /tmp/k_desc_service_account_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n apigee 2>&1 | tee /tmp/k_desc_svc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command to fetch logs of all containers in the "apigee" namespace ----- #####

for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" commands for "apigee-system" namespace ----- #####

kubectl get all -n apigee-system -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get jobs -o wide -n apigee-system 2>&1 | tee /tmp/k_get_jobs_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_certificate_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get deployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe deployment ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_deployment_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_jobs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rolebinding --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rolebinding ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_rolebinding_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_services_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_serviceaccount_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_secrets_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" command for "cert-manager" namespace ----- #####

kubectl get all -n cert-manager -o wide 2>&1 | tee /tmp/k_get_all_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get crd -n cert-manager 2>&1 | tee /tmp/k_get_crd_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get deployment  --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe deployment $(p) 2>&1 | tee /tmp/k_desc_deployment_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get endpoints --no-headers -o custom-columns=":metadata.name") ; do kubectl describe endpoints ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_endpoints_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe po ${p} 2>&1 | tee /tmp/k_desc_po_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_replicaset_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_serviceaccount_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_secrets_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_service_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_svc_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

Una volta generati i log, comprimi tutto il file di output in un'unica sfera tar usando il comando seguente:


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

Nel caso in cui la dimensione del file tar sia superiore a 25 MB, puoi caricarlo su Google Drive e condividere il link con noi. In alternativa, puoi utilizzare il comando split per suddividere 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"

Modelli di richieste e casi di esempio

In questa sezione vengono forniti modelli e casi di esempio per diversi prodotti in base al 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 da parte tua. Ove applicabile, includi il nome e la versione del prodotto.>

Messaggio di errore:

<Includi l'eventuale messaggio di errore completo osservato>

Ora di inizio del problema (formato ISO 8601):

Ora di fine del problema (formato ISO 8601):

Dettagli di configurazione Apigee:
Nomi delle organizzazioni:
Nomi di ambiente:
Nomi dei proxy API:
Numeri di revisione:

Passaggi per la riproduzione:

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

Informazioni diagnostiche:

<Elenco dei file allegati>

Caso di esempio

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

Problema:

Stiamo riscontrando un numero elevato di errori 503 di servizio non disponibile nel nostro cloud pubblico . Puoi esaminare il problema e risolverlo o darci consigli su 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 è ancora in corso.

Dettagli della configurazione di Apigee Cloud:
Nomi organizzazione: myorg
Nomi di ambiente: dev
Nomi 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 diagnostiche:

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 da parte tua. Ove applicabile, includi il nome e la versione del prodotto.>

Messaggio di errore:

<Includi l'eventuale messaggio di errore completo osservato>

Ora di inizio del problema (formato ISO 8601):

Ora di fine del problema (formato ISO 8601):

Dettagli della configurazione ibrida Apigee:

  • Piattaforma ibrida Apigee:

    <Fornisci informazioni sulla piattaforma in cui hai installato il modello ibrido e sulla sua 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-prem, Azure Kubernetes Service o Amazon EKS, quindi fornisci l'ID progetto in cui stanno inviando i log.>
    Organizzazione ibrida Apigee:
    Ambiente ibrido Apigee:
  • Le versioni ibrida di Apigee e altre versioni dell'interfaccia a riga di comando:
    Versione dell'interfaccia a riga di comando ibrida Apigee (apigeectl):
    Versione Kubectl:
  • Dettagli del nome del cluster Kubernetes:
    k8sCluster: Nome di
    :
    regione:
  • Topologia di rete:
    <Allega la topologia di rete che descrive la configurazione di Apigee hybrid, tra cui data center, cluster Kubernetes, spazi dei nomi e pod.>
  • Sostituisce il file YAML:
    <Allega il file YAML degli override.>

Passaggi per la riproduzione

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

Informazioni diagnostiche:

<Elenco dei file allegati>

Caso di esempio

Questa sezione fornisce un caso di esempio per Apigee hybrid.

Problema:

Visualizziamo errori durante l'esecuzione di 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): dalle 24/10/2020 alle 10:30 PDT

Ora di fine del problema (formato ISO 8601): l'osservazione del problema continua.

Dettagli della configurazione ibrida Apigee:

  • Piattaforma ibrida Apigee
    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 ibrida Apigee: apigee-hybrid-123456
    Ambiente ibrido Apigee: dev
  • Le versioni ibrida di Apigee e altre versioni dell'interfaccia a riga di comando:
    Versione dell'interfaccia a riga di comando ibrida Apigee (apigeectl):
    Versione: 1.2.0
    Commit: ac09109
    ID build: 214
    Tempo di creazione: 2020-03-30T20:23:36Z
    Versione Go: go1.12

    Versione 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: Nome di
    : user-cluster-1
    regione: us-east1
  • Topologia di rete
    Hai allegato il file network-topology.png
  • Override del file YAML
    Hai allegato il file overrides.yaml

Passaggi per la riproduzione:

Esegui la seguente API di gestione per osservare l'errore:

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

Informazioni diagnostiche:

In allegato i seguenti file:

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