Como usar o Google Stackdriver Debug, Trace, Logging e Logpoints

Neste tutorial, você vai conhecer o Google Stackdriver, que permite fazer o seguinte com seus aplicativos do Google Cloud Platform:

  • Tire um Instantâneo da depuração nos aplicativos executados no App Engine, Compute Engine e Kubernetes Engine.
  • Veja os Registros de aplicativos.
  • Configure e monitore métricas e receba alertas.
  • Acompanhe suas chamadas de API e receba um detalhamento dos tempos de resposta e possíveis gargalos em seu código.
  • Adicione pontos de registro a um aplicativo em execução sem precisar implantar o app. Esse é um recurso realmente exclusivo (e esperamos que útil).

Neste tutorial, vamos fazer o seguinte do zero:

  1. Criar um projeto do Google Cloud Platform (especificamente do App Engine)
  2. Configurar o repositório de origem do projeto do Google Cloud Platform
  3. Use a fonte padrão do aplicativo Python Guestbook disponível no GitHub.
  4. Implantar o código
  5. Saiba como receber snapshots de depuração do aplicativo em execução
  6. Analise os rastreamentos de chamadas de aplicativos e de geração de registros
  7. Adicione logpoints ao aplicativo em execução. Esse recurso foi abordado inicialmente nesta postagem do blog : Adicionar registros ao aplicativo sem reinicializações (em inglês).

Vamos começar.

Este conteúdo foi criado inicialmente por Romin Irani e postado aqui.

Configuração de ambiente autoguiada

Se você ainda não tem uma Conta do Google (Gmail ou Google Apps), crie uma. Faça login no Console do Google Cloud Platform (console.cloud.google.com) e crie um projeto:

Captura de tela de 2016-02-10 12:45:26.png

Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID.

Em seguida, ative o faturamento no console do Cloud para usar os recursos do Google Cloud.

A execução por meio deste codelab terá um custo baixo, mas poderá ser mais se você decidir usar mais recursos ou se deixá-los em execução. Consulte a seção "limpeza" no final deste documento.

Novos usuários do Google Cloud Platform têm direito a uma avaliação sem custo financeiro de US$300.

Google Cloud Shell

Neste codelab, vamos usar o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

O Cloud Shell é uma máquina virtual com base em Debian que contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal permanente de 5 GB, além de ser executada no Google Cloud, o que aprimora o desempenho e a autenticação da rede. Isso significa que tudo que você precisa para este codelab é um navegador (sim, funciona em um Chromebook).

Para ativar o Google Cloud Shell, clique no botão no canto superior direito do console do desenvolvedor. Leva apenas alguns instantes para provisionar e se conectar ao ambiente:

activateCloudShell.png

Em seguida, aceite os Termos de Serviço e clique no link "Iniciar Cloud Shell":

x.png

Screen Shot 2017-06-14 às 10.13.43 PM.png

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto estará configurado com seu PROJECT_ID :

gcloud auth list

Resposta ao comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

Se, por algum motivo, o projeto não estiver definido, basta emitir o seguinte comando :

gcloud config set project <PROJECT_ID>

Quer encontrar seu PROJECT_ID? Veja qual ID você usou nas etapas de configuração ou procure-o no painel do console:

Project_ID.png

IMPORTANTE: por fim, defina a zona padrão e a configuração do projeto:

gcloud config set compute/zone us-central1-f

É possível escolher uma variedade de zonas diferentes. Saiba mais na documentação sobre Zonas e Regiões.

Confira as APIs do StackDriver ativadas

Vamos conferir as APIs que foram ativadas para seu projeto. Use a barra de pesquisa para encontrar o Painel de APIs, conforme mostrado abaixo.

Observe as APIs específicas que foram ativadas para seu projeto :

Todos os projetos do Google Cloud Platform oferecem hospedagem Git privada, mas primeiro precisamos criar um repositório padrão para trabalhar. Navegue até o Source Repositories usando a caixa de pesquisa do console :

Clique em "CRIAR REPOSITÓRIO" para criar um repositório de código chamado "default" :

Usando o Cloud Shell, vamos clonar esse diretório na nossa instância do Google Cloud Shell. Para isso, primeiro crie um diretório na instância do Google Cloud Shell e navegue até ele, conforme mostrado abaixo (exemplo de saída):

mkdir stackdriver-demo
cd stackdriver-demo/

Agora, podemos clonar o repositório padrão usando o comando gcloud, conforme mostrado abaixo:

gcloud source repos clone default

Esta é a saída do console que deverá aparecer :

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

Ótimo! Vamos analisar um pouco mais os remotos do Git que foram configurados. Isso não é necessário, mas é algo para você entender melhor o que aconteceu nos bastidores.

Acesse o diretório padrão criado e execute o comando git remote -v, conforme mostrado abaixo.

cd default
git remote -v

Esta é a saída do console que deverá aparecer:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

Isso aponta corretamente para o repositório Git associado ao nosso projeto do GCP.

Extrair o aplicativo Guestbook do GitHub

O aplicativo que vamos usar é um aplicativo padrão do App Engine chamado Guestbook e está disponível no repositório oficial do Google Cloud Platform no GitHub. Esse aplicativo também faz parte da documentação oficial para iniciantes. O projeto do GitHub está disponível em : https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Agora vamos extrair esse código para nossa instância do Cloud Shell. O comando e a saída dele são mostrados aqui :

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

Esta é a saída do console que deverá aparecer :

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

Agora temos todo o código presente localmente na nossa instância do Google Cloud Shell. Você pode conferir os vários arquivos que foram extraídos do projeto do GitHub.

Envie o código atual usando o Cloud Shell para o repositório Git do projeto

Agora vamos enviar esse código para o repositório Git do projeto do GCP para que possamos definir pontos de interrupção, pontos de registro e muito mais para nosso código. Essa etapa não é obrigatória, já que você pode fazer a integração diretamente com o GitHub, sua máquina local e outras formas de vincular o código-fonte.

Mas, para nossa finalidade aqui, vamos enviar esse código para o repositório Git do projeto do GCP. Isso é feito com o comando git push padrão, conforme mostrado abaixo:

git push origin master

Esta é a saída do console que deverá aparecer :

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

Agora, volte ao console do Cloud do GCP, especificamente à seção "Desenvolvimento". Clique em "Código-fonte". No repositório padrão, você poderá ver todos os arquivos do projeto. Confira abaixo um exemplo da saída:

Agora está tudo pronto para implantar o aplicativo Guestbook do App Engine. Para implantar o app, verifique se você está no Google Cloud Shell e no diretório padrão, como fizemos até agora. Use o comando gcloud app deploy conforme mostrado abaixo:

gcloud app deploy --version 1

Quando for solicitado a escolher uma região, selecione [1] us-east1.

Esta é a saída do console que deverá aparecer :

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

Observe que fornecemos um parâmetro de versão ao comando de implantação do app. Atribuímos a ele o valor "1".

Como o aplicativo Guestbook usa o Google Cloud Datastore para persistência, precisamos atualizar os índices do Datastore. Os índices são especificados no arquivo index.yaml. Basta usar o comando gcloud datastore create-indexes, conforme mostrado abaixo:

gcloud datastore create-indexes index.yaml

Esta é a saída do console que deverá aparecer :

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

Os índices do Datastore podem levar algum tempo para serem atualizados. Para verificar o status, pesquise "Índices do Datastore" e clique em "Índices". Enquanto os índices são criados, você vai ver um status com o valor "Indexando", conforme mostrado abaixo:

Para verificar se o app com a versão 1 está implantado e disponível, acesse Compute → App Engine e clique em "Versões", conforme mostrado abaixo:

Agora tudo deve estar certo. Para conferir seu projeto, acesse https://<PROJECT_ID>.appspot.com. Pode levar alguns minutos para que os índices do datastore fiquem prontos. Se o aplicativo mostrar um erro (por exemplo, "Erro interno do servidor"), tente de novo depois de alguns minutos.

Agora, vamos usar o aplicativo fazendo login e criando algumas entradas no livro de visitas, como mostrado abaixo:

Ótimo! Agora estamos prontos para conhecer os recursos do Stackdriver.

Primeiro, vamos ver como tirar snapshots do nosso aplicativo em execução. Os snapshots são úteis se você quiser depurar um trecho de código específico, inspecionar as variáveis e muito mais. Tudo isso acontece enquanto seu aplicativo ainda está sendo veiculado. Isso é muito útil caso você receba relatórios de um problema com seu aplicativo e queira depurar e ver o que está acontecendo com ele, inspecionar várias variáveis, fazer o snapshot condicionalmente e muito mais.

Vamos fazer isso agora para o aplicativo Guestbook. Vamos pedir um resumo se alguém solicitar a página inicial e, especificamente, queremos que ele recupere a lista de saudações que estão atualmente no Datastore.

O código para isso está presente no arquivo guestbook.py. Especificamente, queremos começar a inspecionar o código no tempo de execução assim que ele recuperar a lista de saudações do repositório de dados. Isso é feito na linha 72. Então, basta colocar um ponto de interrupção na linha 74 para saber que #72 teria sido executado.

Para fazer isso, clique em "Depurar" na visualização da versão do App Engine ou acesse Stackdriver → Depurar . A tela mostrada abaixo vai aparecer. Selecione o arquivo (guestbook.py) à esquerda e clique no número da linha, conforme mostrado.

Isso vai mostrar uma mensagem destacada na caixa vermelha acima, indicando que está aguardando um resumo ser acionado. Agora, tudo o que precisamos fazer é acessar nossa página em

https://<PROJECT_ID>.appspot.com.

Depois disso, o snapshot será ativado, e as seções "Variáveis" e "Pilha de chamadas" serão preenchidas, conforme mostrado abaixo. Observe como as variáveis são mostradas e expanda-as para verificar os valores. Isso é muito útil.

Por exemplo, se você abrir a variável "saudações", vai notar que ela tem os registros correspondentes ao número de entradas no livro de visitas que você criou.

Um recurso muito útil é refazer um snapshot a qualquer momento. Basta clicar no ícone da câmera a qualquer momento para que ele aguarde o snapshot, conforme mostrado abaixo:

Use o campo "Expressões", conforme mostrado abaixo, para rastrear variáveis específicas. Por exemplo, sabemos que temos uma variável "greetings" e queremos inspecionar o valor dela no momento em que um instantâneo é atingido. Podemos inserir a variável de saudações, como mostrado na captura de tela abaixo. Quando o snapshot for atingido, ele será preenchido com os valores mostrados.

Se você quiser que o snapshot seja ativado apenas em uma determinada condição, use o campo "Condição", conforme mostrado abaixo. Aqui, estamos dizendo que o snapshot só deve ocorrer se o número de saudações for maior que 1. Teste isso, se quiser.

É muito importante verificar se o desempenho do aplicativo da Web atende aos requisitos definidos. O Stackdriver Trace é uma ferramenta essencial que ajuda a entender a latência nos seus aplicativos.

Ele é ativado por padrão para todos os aplicativos do App Engine e fornece detalhes de performance muito úteis para todos os nossos endpoints, além de uma análise detalhada de várias chamadas.

No nosso caso, acessamos a página inicial ("/") e visualizamos / adicionamos as entradas do livro de visitas. Isso é suficiente para que o rastreamento nos diga mais sobre a latência. Basta navegar até a visão geral do Stackdriver Traces para ver uma captura de tela como a mostrada abaixo. Observe os traces recentes e as latências deles.

Se clicarmos em um dos traces, ou seja, no link do URI, o trace detalhado será mostrado, conforme abaixo:

Observe como ele consegue nos dar uma análise da latência e quais chamadas estão demorando mais. Na visualização acima, é possível notar que a consulta do datastore está demorando. Uma opção para analisar seria armazenar os dados em cache e reduzir esse gargalo. Tudo isso depende do seu aplicativo e pode ser muito útil para determinar quais áreas no rastreamento de chamadas podem precisar de refatoração.

É possível acessar os registros do aplicativo a qualquer momento navegando até o Stackdriver Logging, conforme mostrado abaixo. Há vários filtros disponíveis, começando por vários serviços do GCP → Tipos de registro → Nível de registro → Data e muito mais.

A captura de tela abaixo mostra os registros do nosso aplicativo do App Engine e a versão padrão 1.

logging.png

Por fim, vamos analisar um recurso que vai deixar você animado com as possibilidades que ele oferece. Normalmente, como desenvolvedores, fazemos o possível para colocar instruções de registro em nosso código, implantar o código e esperar que o registro nos diga tudo o que queremos saber.

Mas sabemos que isso não é suficiente, e só na depuração percebemos que talvez deveríamos ter colocado mais algumas instruções de registro aqui e ali. O fluxo de trabalho normal é modificar o código, inserir a instrução de registro adicional, reimplantar e monitorar.

Isso é bom, mas e se você pudesse adicionar essas instruções de registro (vamos chamá-las de pontos de registro agora) ao seu aplicativo em execução? Isso significa que não precisamos passar pelo processo de parar o aplicativo, mudar o código e fazer uma nova implantação. Em vez disso, podemos gerenciar nossa lista de pontos de registro fora do aplicativo usando o suporte a pontos de registro.

Ainda no Cloud Shell, vamos verificar a lista atual de pontos de registro configurados (que obviamente deve ser 0). Isso é feito com o comando gcloud, como mostrado abaixo:

gcloud debug logpoints list

Esta é a saída do console que deverá aparecer :

Debug target not specified. Using default target: default-1
Listed 0 items.

Agora, vamos adicionar um logpoint ao aplicativo em execução. Para adicionar um ponto de registro, faça o seguinte:

  • Identifique o arquivo de código-fonte e o número da linha em que você quer adicionar o logpoint.
  • identificar a mensagem de registro. Essa mensagem de registro pode ser fixada no código ou até uma expressão.

No nosso caso, vamos adicionar um logpoint ao arquivo guestbook.py na linha 74 usando o comando "logpoints create", conforme mostrado abaixo:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

Esta é a saída do console que deverá aparecer :

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

Fornecemos o filename:linenumber e a mensagem de registro acima. A mensagem de registro também contém uma expressão que vai imprimir o número de saudações recuperadas do repositório de dados.

O comando retorna com a mensagem de que o ponto de registro foi adicionado. Confira abaixo uma captura de tela do Cloud Shell:

Agora, se você disparar o comando da lista de pontos de registro, verá a seguinte saída:

gcloud debug logpoints list

Esta é a saída do console que deverá aparecer :

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

Para ver isso em ação, acesse a página inicial em https://<PROJECT_ID>.appspot.com. Isso vai invocar o código e, por sua vez, nosso logpoint. Por padrão, isso será registrado nos registros de aplicativos. Então, basta acessar o Stackdriver Logging mais uma vez, como mostrado abaixo:

Clique na solicitação específica. Pronto! Nos detalhes, você vai ver o logpoint sendo acionado e a mensagem de registro sendo mostrada.

Esperamos que você tenha gostado deste tutorial. Ele aborda apenas alguns dos recursos que a plataforma Stackdriver oferece. Há muito mais para descobrir. Confira o blog de Romin Irani (o autor original deste codelab) em https://rominirani.com/ para mais tutoriais do Google Cloud Platform.

Confira também este outro codelab chamado "Como usar o monitoramento e a criação de registros do Stackdriver para melhorar a visibilidade da integridade do seu aplicativo".

Se você tiver feedback ou quiser informar problemas com este codelab, use o link "Encontrar um bug" na parte inferior esquerda desta página.