499 Connessione client chiusa

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Sintomo

L'applicazione client riceve un errore di timeout per le richieste API o la richiesta viene terminata bruscamente mentre la richiesta API è ancora in esecuzione su Apigee.

Potrai osservare il codice di stato 499 per queste richieste API in API Monitoring e nei log degli accessi NGINX. A volte, vedrai codici di stato diversi in Analisi delle API perché mostra il codice di stato restituito dal processore di messaggi.

Messaggio di errore

Le applicazioni client potrebbero visualizzare errori quali:

curl: (28) Operation timed out after 6001 milliseconds with 0 out of -1 bytes received

Quali sono le cause dei timeout del client?

Il percorso tipico per una richiesta API sulla piattaforma Edge è Cliente > Router > Processore di messaggi > Server di backend, come mostrato nella figura seguente:

I router e i processori di messaggi all'interno della piattaforma Apigee Edge sono configurati con valori di timeout predefiniti adatti per garantire che il completamento delle richieste API non richieda troppo tempo.

Timeout sul client

Le applicazioni client possono essere configurate con un valore di timeout appropriato in base alle proprie esigenze.

Client come browser web e app mobile hanno timeout definiti dal sistema operativo.

Timeout sul router

Il timeout predefinito configurato sui router è di 57 secondi. Si tratta del tempo massimo di esecuzione di un proxy API dal momento in cui la richiesta API viene ricevuta su Edge fino al reinvio della risposta, inclusi la risposta del backend e tutti i criteri eseguiti. Il timeout predefinito può essere ignorato sui router e sugli host virtuali, come spiegato in Configurare il timeout di I/O sui router.

Timeout sui processori di messaggi

Il timeout predefinito configurato sui processori di messaggi è di 55 secondi. Si tratta del tempo massimo che il server di backend può impiegare per elaborare la richiesta e rispondere al processore di messaggi. Il timeout predefinito può essere ignorato sui processori di messaggi o all'interno del proxy API, come spiegato in Configurare il timeout di I/O sui processori di messaggi.

Se il client chiude la connessione con il router prima del timeout del proxy API, osserverai l'errore di timeout per la richiesta API specifica. Per queste richieste, il codice di stato 499 Client Closed Connection viene registrato nel router, che può essere osservato nei log di API Monitoring e NGINX Access.

Possibili cause

In Edge, le cause tipiche dell'errore 499 Client Closed Connection sono:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Il client ha chiuso improvvisamente la connessione Questo accade quando il client chiude la connessione perché l'utente finale annulla la richiesta prima che venga completata. Utenti di cloud pubblici e privati
Timeout applicazione client Questo accade quando l'applicazione client scade prima che il proxy API abbia il tempo di elaborare e inviare la risposta. In genere questo accade quando il timeout del client è inferiore al timeout del router. Utenti di cloud pubblici e privati

Passaggi di diagnosi più comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

  • Monitoraggio delle API
  • Log degli accessi NGINX

Monitoraggio delle API

Per diagnosticare l'errore utilizzando il monitoraggio delle API:

  1. Vai alla pagina Analizza > Monitoraggio API > Esamina.
  2. Filtra per 4xx errori e seleziona il periodo di tempo.
  3. Traccia Codice di stato in base a Ora.
  4. Seleziona una cella che contiene 499 errori, come mostrato di seguito:

  5. Nel riquadro di destra verranno visualizzate le informazioni relative all'errore 499, come mostrato di seguito:

  6. Nel riquadro a destra, fai clic su Visualizza log.

    Nella finestra Log di traffico, tieni presente i seguenti dettagli relativi ad alcuni errori 499:

    • Request:fornisce il metodo di richiesta e l'URI utilizzati per effettuare le chiamate.
    • Tempo di risposta:fornisce il tempo totale trascorso per la richiesta.

    Puoi ottenere tutti i log anche utilizzando l'API GET logs di API Monitoring. Ad esempio, eseguendo una query sui log per org, env, timeRange e status, potrai scaricare tutti i log per le transazioni in cui il client è scaduto.

    Poiché API Monitoring imposta il proxy su - per gli errori HTTP 499, puoi utilizzare l'API (API Logs) per ottenere il proxy associato per l'host virtuale e il percorso.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https://VIRTUAL_HOST/BASEBATH" -H "Authorization: Bearer $TOKEN"
    
  7. Controlla il tempo di risposta per verificare la presenza di ulteriori errori 499 e verifica se il tempo di risposta è coerente (ad esempio 30 secondi) per tutti gli errori di 499.

Log degli accessi NGINX

Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave sugli errori HTTP 499.
  2. Controlla i log degli accessi di NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  3. Cerca per vedere se si sono verificati errori 499 durante una durata specifica (se il problema si è verificato in passato) o se ci sono ancora richieste che continuano a non riuscire a utilizzare 499.
  4. Prendi nota delle seguenti informazioni per alcuni degli errori 499:
    • Tempo di risposta totale
    • URI della richiesta
    • User agent

    Esempio di errore 499 dal log degli accessi di NGINX:

    2019-08-23T06:50:07+00:00       rrt-03f69eb1091c4a886-c-sy      50.112.119.65:47756
    10.10.53.154:8443       10.001  -       -       499     -       422     0
       GET /v1/products HTTP/1.1        -       okhttp/3.9.1    api.acme.org
    rrt-03f69eb1091c4a886-c-sy-13001-6496714-1
        50.112.119.65   -       -       -       -       -       -       -       -1      -       -       dc-1  router-pod-1
    rt-214-190301-0020137-latest-7d
    36       TLSv1.2 gateway-1     dc-1  acme    prod  https   -
    

    Per questo esempio, vediamo le seguenti informazioni:

    • Tempo totale di risposta: 10.001 secondi. Indica che il client è scaduto dopo 10,001 secondi
    • Richiesta: GET /v1/products
    • Host:api.acme.org
    • User agent:okhttp/3.9.1
  5. Verifica se il Tempo di risposta totale e lo User agent sono coerenti per tutti gli errori 499.

Causa: il client ha chiuso improvvisamente la connessione

Diagnostica

  1. Quando un'API viene chiamata da un'app a pagina singola in esecuzione in un browser o in un'applicazione mobile, il browser interrompe la richiesta se l'utente finale chiude improvvisamente il browser, passa a un'altra pagina web nella stessa scheda o interrompe il caricamento della pagina toccando o facendo clic su interrompi caricamento.
  2. In questo caso, in genere le transazioni con stato HTTP 499 variano in base al tempo di elaborazione delle richieste (Tempo di risposta) per ciascuna richiesta.
  3. Puoi determinare se questa è la causa confrontando il tempo di risposta e verificando se è diverso per ciascuno degli errori 499 utilizzando i log di monitoraggio delle API o di accesso NGINX, come spiegato nella sezione Passaggi comuni di diagnosi.

Risoluzione

  1. Questo è normale e di solito non è un motivo di preoccupazione se gli errori HTTP 499 si verificano in quantità ridotte.
  2. Se accade spesso per lo stesso percorso dell'URL, è possibile che il proxy associato a quel percorso sia molto lento e gli utenti non siano disposti ad attendere.

    Una volta scoperto quale proxy potrebbe essere interessato, utilizza la dashboard di analisi della latenza per esaminare ulteriormente la causa della latenza del proxy.

    1. In questo caso, determina il proxy interessato utilizzando la procedura descritta in Passaggi di diagnostica comuni.
    2. Utilizza la dashboard dell'analisi della latenza per esaminare ulteriormente la causa della latenza proxy e risolvere il problema.
    3. Se ritieni che la latenza sia prevista per un proxy specifico, potresti dover comunicare agli utenti che il proxy impiegherà del tempo per rispondere.

Causa: timeout dell'applicazione client

Questo può accadere in diversi casi.

  1. Prevediamo che il completamento della richiesta richieda un certo tempo (ad esempio 10 secondi) in condizioni operative normali. Tuttavia, l'applicazione client è impostata con un valore di timeout errato (ad esempio 5 secondi) che causa il timeout dell'applicazione client prima che la richiesta API venga completata, il che genera 499. In questo caso, dobbiamo impostare il timeout del client su un valore appropriato.
  2. Un server di destinazione o un callout sta richiedendo più tempo del previsto. In questo caso, devi correggere il componente appropriato e regolare i valori di timeout in modo appropriato.
  3. Il client non aveva più bisogno della risposta e quindi l'ha interrotta. Questo può accadere per le API ad alta frequenza, come il completamento automatico o il polling breve.

Diagnostica

Log degli accessi di API Monitoring o NGINX

Per diagnosticare l'errore, utilizza i log degli accessi di API Monitoring o NGINX:

  1. Verifica le transazioni HTTP 499 nei log di monitoraggio delle API o negli accessi di NGINX, come spiegato nella sezione Passaggi comuni di diagnosi.
  2. Determina se il tempo di risposta è coerente per tutti gli errori 499.
  3. Se sì, potrebbe essere che una determinata applicazione client abbia configurato un timeout fisso. Se un proxy API o un server di destinazione risponde lentamente, si verifica il timeout del client prima del timeout del proxy, causando grandi quantità di 499s HTTP per lo stesso percorso URI. In questo caso, determina lo user agent dai log degli accessi NGINX che possono aiutarti a determinare l'applicazione client specifica.
  4. Potrebbe anche essere possibile che ci sia un bilanciatore del carico davanti ad Apigee, come Akamai, F5, AWS ELB e così via. Se Apigee viene eseguito dietro un bilanciatore del carico personalizzato, il timeout della richiesta del bilanciatore del carico deve essere configurato in modo da essere superiore al timeout dell'API Apigee. Per impostazione predefinita, il timeout del router Apigee dopo 57 secondi è consigliabile, pertanto è opportuno configurare un timeout della richiesta di 60 secondi sul bilanciatore del carico.

Traccia

Diagnosi dell'errore utilizzando Trace

Se il problema è ancora attivo (gli errori 499 persistono), svolgi i seguenti passaggi:

  1. Abilita la sessione di traccia per l'API interessata nella UI Edge.
  2. Attendi che si verifichi l'errore oppure, se hai la chiamata API, effettua alcune chiamate API e riproduci l'errore.
  3. Controlla il tempo trascorso in ogni fase e prendi nota della fase in cui viene dedicata la maggior parte del tempo.
  4. Se noti l'errore con il tempo trascorso più lungo subito dopo una delle seguenti fasi, significa che il server di backend è lento o impiega molto tempo per elaborare la richiesta:
    • Richiesta inviata al server di destinazione
    • Norme sui callout di servizio

    Ecco una traccia UI di esempio che mostra un Timeout del gateway dopo l'invio della Richiesta al server di destinazione:

Risoluzione

  1. Consulta le Best practice per la configurazione del timeout I/O per capire quali valori di timeout devono essere impostati sui diversi componenti coinvolti nel flusso di richieste API attraverso Apigee Edge.
  2. Assicurati di impostare un valore di timeout appropriato per l'applicazione client in base alle best practice.

Se il problema persiste, consulta la pagina Devi raccogliere dati diagnostici .

Devi raccogliere dati diagnostici

Se il problema persiste, raccogli le seguenti informazioni diagnostiche e contatta l'assistenza Apigee Edge.

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome dell'organizzazione.
  • Nome ambiente
  • Nome proxy API
  • Comando curl completo utilizzato per riprodurre l'errore di timeout
  • File di traccia per le richieste API per le quali vengono visualizzati errori di timeout del client

Se sei un utente Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle del proxy API
  • File di traccia per le richieste API per le quali vengono visualizzati errori di timeout del client
  • Log degli accessi NGINX (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  • Log di sistema del processore di messaggi (/opt/apigee/var/log/edge-message-processor/logs/system.log)