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

1. Introdução

Neste codelab, você vai aprender a aproveitar as ferramentas de geração de registros e monitoramento disponíveis para todos os desenvolvedores que trabalham com o Cloud Functions. As ferramentas são fornecidas com todas as funções do Cloud implantadas em todas as linguagens com suporte e devem permitir que você seja mais produtivo 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 foi abordado também se aplica a outras linguagens e ao Cloud Functions acionado 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 dele possam ser usados remotamente no 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 um "Hello, World" função do Cloud. No menu à esquerda do console do Google Cloud, clique em Cloud Functions e, depois, em Criar função.

3c13aa20af602aa7.png

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

fa6816c96d6d5b94.png

Mantenha todos os padrões do código-fonte. No entanto, você pode escolher um idioma/ambiente de execução diferente, se quiser.

7aadf164450484e.png

Por fim, clique em Criar.

dc74cd21000d6c91.png

Você verá a função do Cloud listada 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, teste-a na linha de comando.

Primeiro, usando o Cloud Shell, emita o seguinte comando:

$ gcloud functions describe hello-monitor

Isso 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 tem a seguinte aparência: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Acionar a função do Cloud agora será 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, no Cloud Shell, basta digitar o seguinte comando :

$ 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 levará você à seção "Stackdriver Logging" do projeto, que mostra apenas os registros da função do Cloud.

5a36fa75d2fb0165.png

Todas as solicitações para a função do Cloud retornarão um código de status 200.

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

  • filtrar por nível de registro (no seu caso, todos os registros são de nível debug);
  • Selecione um período específico (relativo ou absoluto).
  • Ative o streaming de registros (com Reproduzir 751a4600016f34a7.pngna parte superior da tela).
  • Copie um link para a entrada de registro (para compartilhar com os membros da equipe).
  • Mostra uma entrada de registro no contexto do recurso.
  • Fixe uma entrada de registro (como uma sugestão visual).
  • Exporte os registros para o BigQuery, Cloud Storage ou Pub/Sub (ou faça o download deles como arquivos JSON ou CSV).

6. Atualizar a função

No console do Cloud, acesse 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

O Stackdriver Trace é outra ferramenta mais detalhada para observar a latência e as chamadas RPC, mas, antes de usá-lo, você precisa fazer algumas alterações 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 de emoji de nó e introduzir um pouco de 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 ao pacote node-emoji.

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

Edite a função real 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 após uma pausa de 300 milissegundos.

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

9205bd277b76aa21.png

Clique em Salvar.

Volte ao Cloud Shell e recupere o comando para gerar 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 está tudo pronto para você observar a lista de traces produzidos sem outros requisitos de configuração nem com bibliotecas de rastreamento específicas no código.

7. Rastrear a função do Cloud atualizada

Usando o menu à esquerda, navegue até Lista de traces (em Stackdriver Trace).

576373f38cad6f8.png

Você verá algo semelhante à captura de tela abaixo:

44a36b758b49f88f.png

Isso deve deixar bem claro que a latência introduzida no Cloud Functions é de fato medida em 300 milissegundos.

Cada ponto no gráfico é uma solicitação com informações detalhadas, como carimbo de data/hora, método e status HTTP, os 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, basta clicar e arrastar 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, mas é possível filtrar os traces por método HTTP (GET, POST, DELETE) pelo 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, é possível encontrar traces recentes e outros insights.

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Esse relatório personalizado pode ser usado para descobrir quando um problema de desempenho foi introduzido e rastrear um indicador de nível de serviço (SLI), como a latência das solicitações 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. Basta selecionar hello-monitor em Visão geral, em Cloud Functions, e clicar em Excluir.

aceb633cf70a4a27.png

9. A seguir

Aqui está uma leitura complementar:

/