O SDK Python 2 inclui a biblioteca Appstats usada para criar perfis do desempenho de RPC (Remote Procedure Call) da sua aplicação. Um RPC do App Engine é uma chamada de rede de ida e volta entre a sua aplicação e uma API de serviços do App Engine. Por exemplo, todas estas chamadas API são chamadas RPC:
- Chamadas Datastore, como
ndb.get_multi()
,ndb.put_multi()
oundb.gql()
. - Chamadas Memcache, como
memcache.get()
oumemcache.get_multi()
. - Chamadas URL Fetch, como
urlfetch.fetch()
. - Correio, como
mail.send()
.
A otimização ou a depuração de uma aplicação escalável pode ser um desafio, uma vez que vários problemas podem causar um desempenho fraco ou custos inesperados. Estes problemas são muito difíceis de depurar com as origens de informações habituais, como registos ou estatísticas de tempo de pedido. A maioria dos pedidos de aplicações passa a maior parte do tempo a aguardar a conclusão das chamadas de rede como parte da satisfação do pedido.
Para manter a sua aplicação rápida, tem de saber:
- A sua aplicação está a fazer chamadas RPC desnecessárias?
- Deve colocar os dados em cache em vez de fazer chamadas RPC repetidas para obter os mesmos dados?
- A sua aplicação tem um melhor desempenho se forem executados vários pedidos em paralelo em vez de em série?
A biblioteca Appstats ajuda a responder a estas perguntas e a verificar se a sua aplicação está a usar chamadas RPC da forma mais eficiente, permitindo-lhe criar perfis das suas chamadas RPC. O Appstats permite-lhe rastrear todas as chamadas RPC para um determinado pedido e gera relatórios sobre a hora e o custo de cada chamada.
A otimização da utilização de RPCs da sua aplicação também pode reduzir a fatura. Consulte o artigo Gerir recursos de apps.
Veja uma demonstração em vídeo.
Configuração
Não tem de transferir nem instalar nada para começar a usar o Appstats. Só tem de configurar a sua aplicação, voltar a implementá-la e aceder à consola do Appstats, conforme descrito nos passos abaixo. A biblioteca Appstats trata do resto.
1. Instale o gravador de eventos
Para registar estatísticas sobre pedidos Web, cada controlador de pedidos da sua aplicação tem de invocar o Appstats. Consoante a framework usada pela sua aplicação, escolha uma das seguintes opções:
Controladores de pedidos WSGI
Para usar o Appstats com controladores de pedidos WSGI, incluindo frameworks WSGI, como o webapp2, tem de envolver a sua aplicação WSGI com o middleware appstats. A forma mais simples de o fazer é definir um middleware WSGI para envolver todas as aplicações WSGI com
appengine_config.py
.Se ainda não existir, crie um ficheiro com o nome
appengine_config.py
no diretório raiz da sua aplicação. Adicione a seguinte função ao ficheiro:Antes de invocar a sua aplicação WSGI, o tempo de execução importa este ficheiro e chama a função
webapp_add_wsgi_middleware
, se for encontrada.Consulte a configuração opcional abaixo para mais informações sobre
appengine_config.py
.Framework Django
Para instalar o middleware Appstats numa aplicação Django, edite o ficheiro
settings.py
e adicione a seguinte linha para ser o primeiro item emMIDDLEWARE_CLASSES
:MIDDLEWARE_CLASSES = ( 'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware', # ... )
O middleware Appstats tem de ser o primeiro item para que o criador de perfis possa incluir outro middleware nas respetivas estatísticas.
O middleware do Django chama o Appstats para registar eventos, conforme adequado. Não tem de alterar mais nenhum código da aplicação.
2. Defina o caminho da consola
A consola Appstats é acedida através de um URL da sua aplicação num navegador de Internet. Tem de definir o caminho do URL de uma das seguintes formas:
URL predefinido
Para mapear o Appstats para o diretório predefinido (
/_ah/stats/
), adicione oappstats
incorporado ao seu ficheiroapp.yaml
:URL personalizado
Se precisar de mapear o Appstats para um diretório que não seja o predefinido, pode usar a diretiva
url
emapp.yaml
:- url: /stats.* script: google.appengine.ext.appstats.ui.app
3. Configuração opcional
Pode configurar o comportamento do Appstats adicionando conteúdo ao ficheiro appengine_config.py no diretório raiz da sua aplicação. Para ver um exemplo completo das opções de configuração, consulte o ficheiro google/appengine/ext/appstats/sample_appengine_config.py
no SDK.
Alguns aspetos a ter em mente acerca do appengine_config.py
:
- Se os processadores de pedidos modificarem
sys.path
, tem de fazer as mesmas modificações asys.path
emappengine_config.py
para que a interface Web do Appstats possa ver todos os ficheiros.
A apresentar o custo
O AppStats pode acompanhar o custo de RPC, bem como o tempo. Se a sua aplicação for suficientemente rápida, mas mais cara do que o esperado, procure operações que custem mais do que o esperado. Para ativar o acompanhamento de custos, defina appstats_CALC_RPC_COSTS = True
no ficheiro appengine_config.py
.
4. Teste o Appstats a partir do servidor de programação
Pode testar a configuração do Appstats com o servidor de desenvolvimento. Se configurou o caminho da consola para usar o URL predefinido acima, pode aceder à consola em http://localhost:8080/_ah/stats/.
5. Implementação
Quando estiver satisfeito com a configuração do Appstats, implemente a sua aplicação. Se configurou o caminho da consola para usar o URL predefinido acima, pode aceder à consola em http://your_app_id.appspot.com/_ah/stats
.
Uma visita guiada à consola Appstats
A Appstats Console fornece informações de alto nível sobre as chamadas RPC feitas, os caminhos de URL pedidos, um histórico de pedidos recentes e detalhes de pedidos individuais:
A tabela Estatísticas de RPC mostra estatísticas para cada tipo de RPC feita pela sua aplicação. Se clicar num botão de mais, a entrada é expandida para mostrar uma discriminação por pedido de caminho para o RPC:
A tabela Estatísticas do caminho mostra estatísticas para cada pedido de caminho enviado para a sua aplicação. Se clicar num botão de mais, a entrada é expandida para mostrar uma discriminação por RPC do pedido de caminho:
Se ativou a funcionalidade de acompanhamento de custos da API, também são apresentados os custos.
A tabela Histórico de pedidos mostra dados relativos a pedidos individuais. Clicar num botão de mais expande a entrada para mostrar uma discriminação por RPC. Clicar num link de pedido mostra uma cronologia do pedido, incluindo a sincronização individual do RPC:
O gráfico Linha cronológica da RPC mostra quando foram feitas chamadas RPC específicas e quanto tempo demorou o processamento dos pedidos. A barra Total de RPCs mostra o tempo total gasto à espera de chamadas RPC e a barra Total geral mostra o tempo total gasto no processamento do pedido. Como pode ver na cronologia abaixo, a maioria do tempo foi gasto em chamadas RPC. Isto acontece frequentemente. Os outros separadores mostram informações adicionais sobre a solicitação. Compreender o impacto das chamadas RPC no tempo de resposta da sua aplicação é inestimável ao analisar o respetivo desempenho.
O Interactive Playground permite que os programadores introduzam código Python arbitrário num formulário Web e o executem no ambiente da respetiva app.
Depois de navegar para Appstats, clique no link para o Interactive Playground. É apresentado um formulário com uma única área de texto. Introduza qualquer código Python arbitrário que quiser na área de texto e, em seguida, envie o formulário para o executar. Todos os resultados que foram impressos na saída padrão são apresentados junto à área de texto, e é apresentada uma análise da Linha cronológica das chamadas RPC geradas pelo seu código.
O Interactive Playground pode ser ativado ou desativado. No SDK, está ativada por predefinição. Em produção, está desativada por predefinição. Para a ativar, adicione a seguinte linha ao ficheiro
appengine_config.py
:<pre suppresswarning="yes" class="prettyprint"> appstats_SHELL_OK = True </pre>
Como funciona
O Appstats usa hooks de API para se adicionar à framework de chamadas de procedimentos remotos que está na base das APIs de serviços do App Engine. Regista estatísticas para todas as chamadas API feitas durante o controlador de pedidos e, em seguida, armazena os dados na memcache, usando um espaço de nomes de __appstats__
. O Appstats retém estatísticas para os 1000 pedidos mais recentes. Os dados incluem registos de resumo, com cerca de 200 bytes cada, e registos detalhados, que podem ter até 100 KB cada. Pode controlar a quantidade de detalhes armazenados nos registos detalhados. (Consulte a Configuração opcional e o ficheiro de configuração de exemplo.)
Os hooks da API adicionam alguma sobrecarga aos controladores de pedidos. O Appstats adiciona uma mensagem aos registos ao nível "info" para comunicar a quantidade de recursos consumidos pela própria biblioteca Appstats. A linha do registo tem um aspeto semelhante a este:
<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>
Esta linha indica a chave de memcache que foi atualizada, o tamanho dos registos de resumo (part
) e detalhe (full
) e o tempo (em segundos) gasto a registar estas informações. A linha de registo inclui o link para a interface administrativa do Appstats que apresenta os dados deste evento.