Codelab do Cloud Functions para geração de registros e rastreamento

O objetivo deste codelab é ajudar você a entender como aproveitar as ferramentas de geração de registros e monitoramento oferecidas a todos os desenvolvedores do Cloud Functions. Essas ferramentas vêm com todas as funções do Cloud implantadas em todas as linguagens compatíveis e devem permitir que você seja mais produtivo ao escrever e operar seu código sem servidor.

Usaremos uma função acionada por HTTP aqui, mas tudo o que abordarmos também se aplica a outras linguagens e funções acionadas por outros eventos (bucket de armazenamento, pub/sub etc.)

Configuração de ambiente personalizada

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 novo projeto:

Captura de tela de 10/02/2016 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, você precisará ativar 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 estão qualificados para um teste sem custo financeiro de US$ 300.

Google Cloud Shell

Embora o Google Cloud Functions e os recursos de geração de registros e monitoramento possam ser usados remotamente no laptop, neste codelab, usaremos 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, no console do desenvolvedor, clique no botão no canto superior direito (só leva alguns instantes para provisionar e se conectar ao ambiente):

activateCloudShell.png

Clique no botão "Iniciar o Cloud Shell":

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

Depois que você se conectar ao Cloud Shell, sua autenticação já terá sido feita, e o projeto estará definido com o 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>

O Cloud Shell também define algumas variáveis de ambiente por padrão, que podem ser úteis à medida que você executa comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resposta ao comando

<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? Confira o ID usado nas etapas de configuração ou procure no painel do console:

ID do projeto.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 "Regiões e zonas".

Para ter algo para monitorar, vamos criar uma Função do Cloud, Hello World. No menu à esquerda do Console, clique em Cloud Functions, depois "Create function" :

Nomeie sua nova função "hello-monitor" :

e manter todos os padrões do código-fonte, mas você pode escolher um idioma/ambiente de execução diferente se desejar:

Por fim, crie a função usando o botão "Create" :

Depois de um breve momento, você verá sua função listada como pronta para ser invocada (como indicado pela marca de seleção verde) :

Agora que a Função do Cloud foi implantada, vamos testá-la na linha de comando.

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

$ gcloud functions describe hello-monitor

Isso retornará uma descrição da função, incluindo um URL para httpsTrigger, que é o endpoint HTTP(S) para invocar a função. Ele precisa estar neste formato: https://<region>-<project-id>.cloudfunctions.net/hello-monitor

O acionamento da função deve ser simples, como curl'ing this url :

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

Agora usaremos o Vegeta, uma ferramenta simples de teste de carga HTTP. Para instalá-lo, digite este comando no Cloud Shell :

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

Para enviar tráfego à sua Função do Cloud (cinco solicitações por segundo por alguns minutos), use este comando :

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

Na visualização de detalhes da função, clique no menu à direita "Ver registros" :

Isso levará você à seção do Stackdriver Logging do projeto, mostrando apenas os registros da função do Cloud :

Esperamos que todas as solicitações para sua função retornem um código de status 200.

Com esse visualizador de registros, é possível fazer o seguinte :

  • filtrar por nível de registro. Neste caso, todos os registros são do nível Debug.
  • selecione um período específico (relativo ou absoluto)
  • ativar streaming de registros (botão "quot;play" na parte superior da tela)
  • copiar um link para a entrada de registro (para compartilhar com os membros da equipe)
  • mostrar uma entrada de registro no contexto do recurso
  • fixar uma entrada de registro (como uma dica visual);
  • exportar registros para o BigQuery, Cloud Storage ou Cloud Pub/Sub ou fazer o download deles no formato JSON ou CSV;

O seletor no canto superior esquerdo pode filtrar os registros por função. Você também pode pesquisar marcadores ou uma pesquisa de texto completo na barra de pesquisa, na parte superior da janela. Em nosso caso, os rótulos são hello-monitor (o nome da função), bem como um identificador de execução para cada solicitação.

Os filtros também podem ser copiados para serem compartilhados (confira o menu suspenso na caixa de pesquisa) :

No Console, navegue até a visualização "Detalhes da função" e observe o pico que criamos com nosso testador de carga, tanto em termos de número de invocações por segundo quanto no tempo de execução :

Outra ferramenta mais detalhada para observar a latência e chamadas de RPC é o recurso Stackdriver Trace. Antes de usar esse recurso, precisamos fazer algumas alterações nas nossas funções, ou seja:

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

Na página "Detalhes da função", clique em "Editar" para modificar a função :

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 alterando 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
  
};

Um emoji aleatório será adicionado à mensagem retornada pela função depois de 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:

Não se esqueça de clicar em "Salvar".

Volte ao Cloud Shell e lembre-se de executar o comando para gerar uma carga na função recém-implantada :

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

Agora estamos prontos para observar a lista de traces produzidos sem outros requisitos de configuração e sem uma biblioteca de rastreamento específica no seu código.

Usando o menu à esquerda, navegue até a lista do Trace (em Stackdriver Trace) :

Você verá algo semelhante a esta captura de tela :

Isso deixa muito claro que a latência introduzida na função é de fato medida a 300 ms.

Cada ponto nesse gráfico é uma solicitação que mostra informações detalhadas, como carimbo de data/hora, status e método HTTP, os identificadores dele, um link para a entrada de registro correspondente e qualquer chamada de RPC subsequente que a função faça :

Se quiser 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 no botão "Desfazer zoom" na parte superior da página.

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

Navegue até a seção "Traces "visão geral" no menu à esquerda :

Nessa página de visão geral, é possível encontrar traces recentes e outros insights.

... bem como a capacidade de 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. Ela permite até mesmo comparar os valores gerados com um valor de referência de tempo :

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

Ele pode ser usado para identificar quando um problema de desempenho foi introduzido e acompanhar um indicador de nível de serviço (SLI), como latência de solicitação de usuário final.

Isso conclui nosso codelab que aborda a implantação de uma nova Função do Cloud, navegando pelos registros e observando os traces de solicitação.

As ferramentas do Cloud Functions e do Stackdriver são plataformas sem servidor que não geram custos quando não estão em uso. No entanto, para ser um bom usuário da nuvem, vamos excluir nossa função.

Basta selecionar a função hello-monitor na página de visão geral do Cloud Functions e clicar em "quot;delete".

Isso conclui este codelab simples de primeiros passos com geração de registros e traces do Cloud Functions.

Segue uma leitura de acompanhamento :

/