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 di posta come mail.send().

L'ottimizzazione o il debug di un'applicazione scalabile può essere complicato perché numerosi problemi possono causare prestazioni scadenti o costi imprevisti. È molto difficile eseguire il debug di questi problemi con le fonti di informazioni consueti, come i log o le statistiche sul tempo delle richieste. 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 veloce la tua applicazione, 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?
  • La tua applicazione avrà un rendimento migliore 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 Gestione delle risorse delle app.

Guarda un video dimostrativo.

Configurazione

Non c'è nulla da scaricare o installare 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 di tutto il 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 dall'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 root dell'applicazione. Aggiungi la funzione seguente 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 Appstat per registrare gli eventi, a seconda dei casi. Non è necessario modificare nessun altro codice dell'applicazione.

2. Imposta il percorso della console

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

  • URL predefinito

    Per mappare Appstat alla directory predefinita (/_ah/stats/), aggiungi la appstats integrata al tuo file app.yaml:

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

    Se devi mappare Appstat a una directory diversa da quella predefinita, puoi utilizzare l'istruzione 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.

Alcune cose da sapere su 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 dei costi

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 Appstat 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 che utilizzi l'URL predefinito indicato 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 sulle chiamate RPC effettuate, i percorsi degli URL richiesti, una cronologia delle richieste recenti e i 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 viene espansa in modo da mostrare una richiesta di suddivisione in base al percorso per la 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 in modo da mostrare una suddivisione in base a RPC per la 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 in modo da mostrare un'analisi 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 quanto tempo hanno richiesto 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 trascorso per l'elaborazione della richiesta. Come puoi vedere dalla sequenza temporale riportata di seguito, la maggior parte del tempo è stata dedicata alle chiamate RPC. Spesso questo è il caso. Le altre schede mostrano informazioni aggiuntive sulla richiesta. Comprendere l'impatto delle chiamate RPC sul tempo di risposta delle applicazioni è inestimabile quando si analizzano le prestazioni.

    screenshot

  • L'Interactive Playground consente agli sviluppatori di inserire codice Python arbitrario in un modulo web e di eseguirlo nell'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 nell'area di testo qualsiasi codice Python arbitrario, 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.

    L'Interactive Playground può essere attivato o disattivato. Nell'SDK è abilitato per impostazione predefinita; in produzione è disabilitata per impostazione predefinita. Per abilitarlo, aggiungi la seguente riga al tuo 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 archivia i dati in memcache utilizzando uno spazio dei nomi di __appstats__. Appstat 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 nella sezione "Informazioni" 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 indica la chiave memcache aggiornata, le dimensioni dei record di riepilogo (part) e dei dettagli (full) e il tempo (in secondi) dedicato alla registrazione di 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.