Usar o Stackdriver Logging e o Stackdriver Trace para o Cloud Functions

1. Introdução

Neste codelab, você vai aprender a usar as ferramentas de geração de registros e monitoramento disponíveis para todos os desenvolvedores que trabalham com o Cloud Functions. As ferramentas vêm com todas as funções do Cloud que você implanta em todas as linguagens compatíveis e ajudam a aumentar a produtividade ao escrever e operar seu código sem servidor.

5815064fec87444b.png

Você vai usar uma função do Cloud acionada por HTTP, mas tudo o que você aprender também se aplica a outras linguagens e a funções do Cloud acionadas por outros eventos.

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma se você ainda não tiver uma conta do Gmail ou do G Suite.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.

A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Cloud Shell

Embora o Cloud Functions e os recursos de geração de registros e monitoramento possam ser usados remotamente em seu laptop, você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google 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 persistente de 5 GB, além de ser executada no Google Cloud. Isso 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).

  1. Para ativar o Cloud Shell no Console do Cloud, basta clicar em Ativar o Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q. Leva apenas alguns instantes para provisionar e se conectar ao ambiente.

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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 do Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

O Cloud Shell também define algumas variáveis de ambiente por padrão, o que pode ser útil ao executar comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resposta ao comando

<PROJECT_ID>
  1. 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. Para mais informações, consulte Regiões e zonas.

3. Implantar uma função simples do Cloud

Para ter algo para monitorar, crie uma função do Cloud "Hello, World". No menu à esquerda do console do Google Cloud, clique em Cloud Functions e depois em Criar função.

3c13aa20af602aa7.png

Insira "hello-monitor" como o nome da nova função do Cloud Functions.

fa6816c96d6d5b94.png

Mantenha todos os padrões do código-fonte. No entanto, você pode escolher outra linguagem/outro tempo de execução, se quiser.

7aadf164450484e.png

Por fim, clique em Criar.

dc74cd21000d6c91.png

Sua função do Cloud vai aparecer com uma marca de seleção verde ao lado, o que significa que ela está pronta para ser invocada.

5363a34eb001d5ed.png

4. Testar a função do Cloud e enviar tráfego usando um gerador de carga

Agora que a Função do Cloud foi implantada com sucesso, teste-a na linha de comando.

Primeiro, use o Cloud Shell para emitir o seguinte comando:

$ gcloud functions describe hello-monitor

Isso vai retornar uma descrição da função do Cloud, incluindo um URL para httpsTrigger, que é o endpoint HTTP(S) para invocar a função do Cloud. Ele vai ficar assim: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Agora, acionar a função do Cloud é tão simples quanto usar o comando curl nesse URL.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

Agora use o Vegeta, uma ferramenta simples de teste de carga HTTP. Para instalar, basta digitar o seguinte comando no Cloud Shell :

$ go get -u github.com/tsenart/vegeta

Para enviar algum tráfego para sua função do Cloud (cinco solicitações por segundo por alguns minutos), use o seguinte comando:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. Navegar pelos registros

Na visualização de detalhes da função do Cloud, clique em Ver registros.

b24157fd3376e6a8.png

Isso vai levar você à seção do Stackdriver Logging do seu projeto, mostrando apenas os registros do Cloud Functions.

5a36fa75d2fb0165.png

Todas as solicitações à sua função do Cloud Functions precisam retornar um código de status 200.

Ao visualizar os registros, é possível fazer o seguinte:

  • Filtre por nível de registro. No seu caso, todos os registros estão no nível debug.
  • Selecione um período específico (relativo ou absoluto).
  • Ative o streaming de registros (com Play 751a4600016f34a7.png na parte de cima da tela).
  • Copie um link para a entrada de registro (para compartilhar com membros da equipe).
  • Mostra uma entrada de registro no contexto do recurso.
  • Fixar uma entrada de registro (como uma dica visual).
  • Exporte registros para o BigQuery, Cloud Storage ou Pub/Sub ou simplesmente faça o download deles como arquivos JSON ou CSV.

6. Atualizar a função

No console do Cloud, navegue até a visualização Detalhes da função e observe o pico que você criou com o testador de carga no número de invocações por segundo e no tempo de execução.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Outra ferramenta mais detalhada para observar a latência e as chamadas RPC é o Stackdriver Trace, mas antes de usá-lo, você precisa fazer algumas mudanças no Cloud Functions. Faça o seguinte:

  1. Adicione o pacote node-emoji, que salva vidas, como uma dependência.
  2. Atualize o código da função para usar o módulo node-emoji e introduza alguma latência.
  3. Adicione uma variável de ambiente para ativar o Stackdriver Trace para o Cloud Functions.

Em Detalhes da função, clique em Editar para modificar a função.

39b0f8f98b18a6c0.png

Edite o arquivo package.json para adicionar uma dependência do pacote node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Edite a função mudando o conteúdo de index.js para o seguinte:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

Isso adiciona um emoji aleatório à mensagem retornada pela função do Cloud depois de uma pausa de 300 milissegundos.

Por fim, adicione uma variável de ambiente do Cloud Functions chamada GOOGLE_CLOUD_TRACE_ENABLED e defina como true da seguinte maneira:

9205bd277b76aa21.png

Clique em Salvar.

Volte ao Cloud Shell e execute o comando para gerar alguma carga na função do Cloud recém-implantada:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Agora você pode observar a lista de rastreamentos produzidos sem outros requisitos de configuração e sem uma biblioteca de rastreamento específica no seu código.

7. Rastrear a função do Cloud atualizada

No menu à esquerda, navegue até Lista de rastreamento (em Stackdriver Trace).

576373f38cad6f8.png

Você vai ver algo parecido com a seguinte captura de tela:

44a36b758b49f88f.png

Isso deve deixar bem claro que a latência introduzida na sua função do Cloud é medida em 300 milissegundos.

Cada ponto no gráfico é uma solicitação para a qual você pode ver informações detalhadas, como carimbo de data/hora, método e status HTTP, rótulos, um link para a entrada de registro correspondente e qualquer chamada RPC subsequente feita pela função do Cloud.

5815064fec87444b.png

Para aumentar o zoom, clique e arraste no gráfico. Como selecionar um intervalo de tempo personalizado no gráfico do trace

Para diminuir o zoom, clique em Desfazer zoom na parte de cima da página.

Como você implantou uma única função do Cloud, o gráfico mostra apenas solicitações GET no URI hello-monitor. No entanto, é possível filtrar rastreamentos por método HTTP (GET, POST, DELETE), status HTTP (2XX, 3XX) ou usando o filtro de solicitação.

Acesse Visão geral no menu à esquerda:

e920cfca2a50899e.png

Nessa página de visão geral, você encontra rastreamentos recentes e outros insights.

ef5a45647967d275.png

Também é possível criar relatórios personalizados com base em uma combinação de um filtro de solicitação de URI, um método HTTP, um status HTTP e um período. Ele ainda permite comparar os valores gerados com um período de referência.

5bd34e9d13b47fb6.png

Se você conseguir configurar os períodos corretos com pontos de dados suficientes, poderá gerar um relatório que mostre a mudança importante de latência entre a função inicial do Cloud Functions e a nova.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Esse relatório personalizado pode ser usado para descobrir quando um problema de desempenho foi introduzido e para rastrear um indicador de nível de serviço (SLI), como a latência de solicitação do usuário final.

8. Hora de limpar os recursos

Isso conclui o codelab.

Embora o Cloud Functions e as ferramentas do Stackdriver sejam plataformas sem servidor que não geram custos quando não estão em uso, seja um bom cidadão da nuvem e exclua sua função do Cloud Functions. Basta selecionar hello-monitor em Visão geral em Cloud Functions e clicar em Excluir.

aceb633cf70a4a27.png

9. A seguir

Confira mais informações:

/