Appstat per Python 2

L'SDK Python 2 include la libreria Appstats utilizzata per la profilazione delle prestazioni RPC (Remote Procedure Call) dell'applicazione. Una RPC di App Engine è una chiamata di rete andata e ritorno tra la tua applicazione e un'API App Engine Service. Ad esempio, tutte queste chiamate API sono chiamate RPC:

  • Chiamate Datastore come ndb.get_multi(), ndb.put_multi() o ndb.gql().
  • Chiamate Memcache come memcache.get() o memcache.get_multi().
  • Chiamate di recupero URL come urlfetch.fetch().
  • Chiamate Mail come mail.send().

L'ottimizzazione o il debug di un'applicazione scalabile può essere una sfida perché numerosi problemi possono causare prestazioni scadenti o costi imprevisti. Questi problemi sono molto difficili da eseguire il debug con le solite fonti di informazioni, come i log o le statistiche sui tempi di richiesta. La maggior parte delle richieste delle applicazioni trascorre la maggior parte del tempo in attesa del completamento delle chiamate di rete per soddisfare la richiesta.

Per mantenere la tua applicazione veloce, devi sapere:

  • La tua applicazione effettua chiamate RPC non necessarie?
  • Deve memorizzare i dati nella cache invece di effettuare chiamate RPC ripetute per ottenere gli stessi dati?
  • Il rendimento della tua applicazione migliorerà se più richieste vengono eseguite in parallelo anziché in serie?

La libreria Appstats ti aiuta a rispondere a queste domande e a verificare che la tua applicazione utilizzi le chiamate RPC nel modo più efficiente, consentendoti di profilare le chiamate RPC. Appstats consente di tenere traccia di tutte le chiamate RPC per una determinata richiesta e di generare report sulle tempistiche e sul costo di ogni chiamata.

Anche l'ottimizzazione dell'utilizzo RPC dell'applicazione può ridurre le fatture. Vedi Gestire le risorse dell'app.

Guarda una dimostrazione video.

Configurazione

Non è necessario scaricare o installare nulla per iniziare a utilizzare Appstats. Devi solo configurare l'applicazione, rieseguire il deployment e accedere alla console Appstats come descritto nei passaggi seguenti. La libreria Appstats si occupa del resto.

1. Installare il registratore di eventi

Per registrare le statistiche sulle richieste web, ogni gestore di richieste per la tua applicazione deve richiamare Appstats. A seconda del framework utilizzato dalla tua applicazione, scegli una delle seguenti opzioni:

  • Gestori di richieste WSGI

    Per utilizzare Appstat con i gestori di richieste WSGI, inclusi i framework WSGI come webapp2, devi eseguire il wrapping della tua applicazione WSGI con il middleware appstats. Il modo più semplice per raggiungere questo obiettivo è definire un middleware WSGI per il wrapping di ogni applicazione WSGI utilizzando appengine_config.py.

    Se non esiste già, crea un file denominato appengine_config.py nella directory principale dell'applicazione. Aggiungi la seguente funzione al file:

    def webapp_add_wsgi_middleware(app):
        from google.appengine.ext.appstats import recording
        app = recording.appstats_wsgi_middleware(app)
        return app

    Prima di richiamare l'applicazione WSGI, il runtime importa questo file e chiamerà la funzione webapp_add_wsgi_middleware, se trovata.

    Consulta la sezione Configurazione facoltativa di seguito per maggiori informazioni su appengine_config.py.

  • Framework Django

    Per installare il middleware Appstats in un'applicazione Django, modifica il file settings.py e aggiungi la seguente riga come primo elemento in MIDDLEWARE_CLASSES:

        MIDDLEWARE_CLASSES = (
      'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
    
      # ...
    )

    Il middleware Appstat deve essere il primo elemento, quindi il profiler può includere altri middleware nelle sue statistiche.

    Il middleware Django chiama Appstats per registrare gli eventi, a seconda dei casi. Non è necessario modificare altro codice dell'applicazione.

2. Imposta il percorso della console

Per accedere alla console Appstats, visita l'URL della tua applicazione in un browser web. Devi impostare il percorso dell'URL in uno dei due modi seguenti:

  • URL predefinito

    Per mappare Appstats alla directory predefinita (/_ah/stats/), aggiungi il comando integrato appstats al file app.yaml:

    runtime: python27
    api_version: 1
    threadsafe: yes
    
    builtins:
    - appstats: on
    
    handlers:
    - url: .*
      script: main.app
    
  • URL personalizzato

    Se devi mappare Appstats a una directory diversa da quella predefinita, puoi utilizzare la direttiva url in app.yaml:

      - url: /stats.*
      script: google.appengine.ext.appstats.ui.app
      

3. Configurazione facoltativa

Puoi configurare il comportamento di Appstat aggiungendo contenuti al file appengine_config.py nella directory principale dell'applicazione. Per un esempio completo delle opzioni di configurazione, esamina il file google/appengine/ext/appstats/sample_appengine_config.py nell'SDK.

Ecco alcuni aspetti da conoscere in merito a appengine_config.py:

  • Se i tuoi gestori delle richieste modificano sys.path, devi apportare le stesse modifiche a sys.path in appengine_config.py in modo che l'interfaccia web di Appstats possa visualizzare tutti i file.

Visualizzazione del costo

AppStats può tenere traccia del costo RPC e del tempo. Se la tua applicazione è abbastanza veloce ma più costosa del previsto, cerca operazioni che costano più di quanto ti aspetti. Per attivare il monitoraggio dei costi, imposta appstats_CALC_RPC_COSTS = True nel file appengine_config.py.

4. Testare Appstat dal server di sviluppo

Puoi testare la configurazione di Appstats con il server di sviluppo. Se hai configurato il percorso della console in modo che utilizzi l'URL predefinito indicato sopra, puoi accedere alla console all'indirizzo http://localhost:8080/_ah/stats/.

5. Esegui il deployment

Quando la configurazione di Appstats ti soddisfa, esegui il deployment dell'applicazione. Se hai configurato il percorso della console in modo da utilizzare l'URL predefinito riportato sopra, puoi accedere alla console all'indirizzo http://your_app_id.appspot.com/_ah/stats.

Tour della console Appstats

La console di Appstats fornisce informazioni di alto livello su chiamate RPC effettuate, percorsi degli URL richiesti, una cronologia delle richieste recenti e dettagli delle singole richieste:

  • La tabella RPC Statistiche mostra le statistiche per ogni tipo di RPC prodotto dalla tua applicazione. Se fai clic su un pulsante Più, la voce si espande per mostrare una suddivisione per richiesta di percorso per l'RPC:

    screenshot

  • La tabella Statistiche percorso mostra le statistiche per ciascuna richiesta di percorso inviata alla tua applicazione. Se fai clic su un pulsante Più, la voce si espande per mostrare una suddivisione per RPC della richiesta di percorso:

    screenshot

    Se hai attivato la funzionalità di monitoraggio dei costi delle API, verranno visualizzati anche i costi.

  • La tabella Cronologia delle richieste mostra i dati relativi alle singole richieste. Se fai clic su un pulsante Più, la voce si espande per mostrare una suddivisione per RPC. Se fai clic sul link di una richiesta, viene visualizzata una cronologia della richiesta, incluse le singole tempistiche RPC:

    screenshot

  • Il grafico Sequenza temporale RPC mostra quando sono state effettuate chiamate RPC specifiche e il tempo necessario per l'elaborazione delle richieste. La barra Totale RPC mostra il tempo totale di attesa per le chiamate RPC, mentre la barra Totale generale mostra il tempo totale di elaborazione della richiesta. Come puoi vedere dalla sequenza temporale riportata di seguito, la maggior parte del tempo è stata spesa per le chiamate RPC. Spesso questo è il caso. Le altre schede mostrano informazioni aggiuntive sulla richiesta. Comprendere l'impatto delle chiamate RPC sul tempo di risposta dell'applicazione è fondamentale per analizzarne il rendimento.

    screenshot

  • Playground interattivo consente agli sviluppatori di inserire codice Python arbitrario in un modulo web ed eseguirlo all'interno dell'ambiente della loro app.

    Dopo aver effettuato l'accesso ad Appstats, fai clic sul link per l'Interactive Playground. Viene visualizzato un modulo con un'unica area di testo. Inserisci un codice Python arbitrario nell'area di testo, quindi invia il modulo per eseguirlo. I risultati stampati nell'output standard vengono visualizzati accanto all'area di testo e viene visualizzata un'analisi Sequenza temporale delle chiamate RPC generate dal codice.

    Il Playground interattivo può essere attivato o disattivato. Nell'SDK è abilitato per impostazione predefinita; in produzione è disabilitata per impostazione predefinita. Per attivarla, aggiungi la seguente riga al file appengine_config.py:

    <pre suppresswarning="yes" class="prettyprint">
    appstats_SHELL_OK = True
    </pre>
    

Come funziona

Appstats utilizza gli hook API per aggiungersi al framework di chiamata di procedura remota che è alla base delle API del servizio App Engine. Registra le statistiche per tutte le chiamate API effettuate durante il gestore delle richieste, quindi memorizza i dati in memcache utilizzando uno spazio dei nomi __appstats__. Appstats conserva le statistiche relative alle 1000 richieste più recenti. I dati includono record di riepilogo, circa 200 byte ciascuno e record di dettagli, che possono essere fino a 100 kB ciascuno. Puoi controllare la quantità di dettagli archiviati nei record dei dettagli. (vedi Configurazione facoltativa e il file di configurazione di esempio).

Gli hook dell'API aumentano l'overhead per i gestori delle richieste. Appstats aggiunge un messaggio ai log a livello di "info" per segnalare la quantità di risorse consumate dalla libreria Appstats stessa. La riga del log ha un aspetto simile a questo:

<pre suppresswarning="yes" class="prettyprint">
INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.[REGION_ID].r.appspot.com/stats/detail?time=1234567890123
</pre>

Questa riga riporta la chiave memcache aggiornata, le dimensioni dei record di riepilogo (part) e di dettaglio (full) e il tempo (in secondi) impiegato per registrare queste informazioni. La riga del log include il link all'interfaccia di amministrazione di Appstats in cui vengono visualizzati i dati relativi a questo evento.