Neste documento, mostramos como implantar a arquitetura de referência descrita em Usar rastreamento distribuído para observar a latência do microsserviço. A implantação ilustrada neste documento captura informações de trace em aplicativos de microsserviço usando o OpenTelemetry e o Cloud Trace.
O aplicativo de amostra nesta implantação é composto por dois microsserviços escritos em Go.
Ele pressupõe que você esteja familiarizado com os seguintes produtos:
- A linguagem de programação Go
- Google Kubernetes Engine (GKE)
Objetivos
- Criar um cluster do GKE e implante um aplicativo de amostra.
- Revise o código de instrumentação do OpenTelemetry.
- Revisar os traces e registros gerados pela instrumentação.
Arquitetura
O diagrama a seguir mostra a arquitetura implantada.
Use o Cloud Build, uma plataforma de integração contínua, entrega e implantação totalmente gerenciada, para criar imagens de contêiner a partir do código de amostra e armazená-las no Artifact Registry. Os clusters do GKE extraem as imagens do Container Registry no momento da implantação.
O serviço de front-end aceita solicitações HTTP no URL /
e chama o serviço de back-end. O endereço do serviço de back-end é definido pela variável de ambiente .
O serviço de back-end aceita solicitações HTTP no URL /
e faz uma chamada de saída para um URL externo, conforme definido na variável de ambiente . Após a conclusão da chamada externa, o serviço de back-end retorna a chamada de status HTTP (por exemplo, 200
) ao autor da chamada.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Trace, Cloud Build, Cloud Storage, and Artifact Registry APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Trace, Cloud Build, Cloud Storage, and Artifact Registry APIs.
Configure seu ambiente
Nesta seção, você configurará seu ambiente com as ferramentas usadas em toda a implantação. Todos os comandos de terminal neste tutorial são executados pelo Cloud Shell.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Defina uma variável de ambiente como o ID do seu projeto do Google Cloud:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
- Faça o download dos arquivos necessários para esta implantação clonando o repositório Git associado:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples/observability/distributed-tracing WORKDIR=$(pwd)
Você torna a pasta do repositório no diretório de trabalho (
$WORKDIR
) em que estão todas as tarefas relacionadas a essa implantação. Dessa forma, se não quiser manter os recursos, exclua a pasta quando terminar a implantação.
Instalar ferramentas
No Cloud Shell, instale
kubectx
ekubens
.git clone https://github.com/ahmetb/kubectx $WORKDIR/kubectx export PATH=$PATH:$WORKDIR/kubectx
Use essas ferramentas para trabalhar com vários clusters, contextos e namespaces do Kubernetes.
No Cloud Shell, instale o Apache Database, uma ferramenta de geração de carga de código aberto:
sudo apt-get install apache2-utils
Crie um repositório do Docker
Crie um repositório do Docker para armazenar a imagem de amostra deste guia de início rápido.
Console
No Console do Google Cloud, abra a página Repositórios.
Clique em Criar repositório.
Especifique
distributed-tracing-docker-repo
como o nome do repositório.Escolha Docker como o formato e Standard como o modo.
Em Tipo de local, selecione Região e escolha o local
us-west1
.Clique em Criar.
O repositório é adicionado à lista de repositórios.
gcloud
No Cloud Shell, crie um novo repositório do Docker chamado
distributed-tracing-docker-repo
no localus-west1
com a descriçãodocker repository
:gcloud artifacts repositories create distributed-tracing-docker-repo --repository-format=docker \ --location=us-west1 --description="Docker repository for distributed tracing deployment"
Verifique se o repositório foi criado:
gcloud artifacts repositories list
Criar clusters do GKE
Nesta seção, você criará dois clusters do GKE em que implantará o aplicativo de amostra. Por padrão, os clusters do GKE são criados com acesso somente gravação à API Cloud Trace. Portanto, não é necessário definir o acesso ao criar os clusters.
No Cloud Shell, crie os clusters:
gcloud container clusters create backend-cluster \ --zone=us-west1-a \ --verbosity=none --async gcloud container clusters create frontend-cluster \ --zone=us-west1-a \ --verbosity=none
Neste tutorial, os clusters estão na zona
us-west1-a
. Para mais informações, consulte Geografia e regiões.Consiga as credenciais do cluster e armazene-as localmente:
gcloud container clusters get-credentials backend-cluster --zone=us-west1-a gcloud container clusters get-credentials frontend-cluster --zone=us-west1-a
Renomeie os contextos dos clusters para facilitar o acesso a eles posteriormente na implantação:
kubectx backend=gke_${PROJECT_ID}_us-west1-a_backend-cluster kubectx frontend=gke_${PROJECT_ID}_us-west1-a_frontend-cluster
Revisar a instrumentação do OpenTelemetry
Nas seções a seguir, analise o código do arquivo main.go
no aplicativo de amostra. Isso ajuda você a aprender como usar a propagação de contexto para permitir que períodos de várias solicitações sejam anexados a um único trace pai.
Analisar as importações no código do aplicativo
Observe o seguinte sobre as importações:
- O pacote
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
contém o plug-inotelhttp
, que pode instrumentar um servidor HTTP ou cliente HTTP. A instrumentação do servidor recupera o contexto de período da solicitação HTTP e registra um span para o processamento da solicitação pelo servidor. A instrumentação do cliente injeta o contexto do período na solicitação HTTP de saída e registra um período pelo tempo gasto na espera por uma resposta. - O pacote
go.opentelemetry.io/contrib/propagators/autoprop
fornece uma implementação da interfaceTextMapPropagator
do OpenTelemetry, que é usada pelootelhttp
para processar a propagação. Os propagadores determinam o formato e as chaves usados para armazenar o contexto de rastreamento em transportes como HTTP. Especificamente,otelhttp
transmite cabeçalhos HTTP para o propagador. O propagador extrai um contexto de período em um contexto do Go dos cabeçalhos ou codifica e injeta um contexto de período no contexto do Go em cabeçalhos (dependendo se é cliente ou servidor). Por padrão, o pacoteautoprop
injeta e extrai o contexto do período usando o formato de propagação contexto de rastreamento W3C. - A importação
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace
exporta traces para o Trace. - A importação
github.com/gorilla/mux
é a biblioteca que o app de amostra usa para processar solicitações. - A importação
go.opentelemetry.io/contrib/detectors/gcp
adiciona atributos a períodos, comocloud.availability_zone
, que identificam onde o aplicativo está sendo executado no Google Cloud. - As importações
go.opentelemetry.io/otel
,go.opentelemetry.io/otel/sdk/trace
ego.opentelemetry.io/otel/sdk/resource
usadas para configurar o OpenTelemetry.
Revise a função main
A função main
configura a exportação de trace para o Cloud Trace
e usa um
roteador mux
para processar solicitações feitas ao URL /
.
Observe o seguinte sobre esse código:
- Você configura um TracerProvider do OpenTelemetry, que detecta atributos quando é executado no Google Cloud e exporta traces para o Cloud Trace.
- Use as funções
otel.SetTracerProvider
eotel.SetTextMapPropagators
para definir as configurações globais deTracerProvider
ePropagator
. Por padrão, bibliotecas de instrumentação comootelhttp
usam oTracerProvider
registrado globalmente para criar períodos ePropagator
para propagar o contexto. - Una o servidor HTTP com
otelhttp.NewHandler
para instrumentar o servidor HTTP.
Revise a função mainHandler
Para capturar a latência das solicitações de saída feitas para o destino, use o plug-in otelhttp
para fazer uma solicitação HTTP. Use também a função r.Context
para vincular a solicitação recebida à solicitação de saída, conforme mostrado na listagem a seguir:
// Use otelhttp to record a span for the outgoing call, and propagate
// context to the destination.
resp, err := otelhttp.Get(r.Context(), destination)
Implantar o aplicativo
Nesta seção, você usará o Cloud Build para criar imagens de contêiner para os serviços de back-end e front-end e implantá-los nos clusters do GKE.
Criar o contêiner do Docker
No Cloud Shell, envie a versão pelo diretório de trabalho:
cd $WORKDIR gcloud builds submit . --tag us-west1-docker.pkg.dev/$PROJECT_ID/distributed-tracing-docker-repo/backend:latest
Confirme se a imagem do contêiner foi criada e está disponível no Container Registry:
gcloud artifacts docker images list us-west1-docker.pkg.dev/$PROJECT_ID/distributed-tracing-docker-repo
A imagem do contêiner foi criada com sucesso quando a saída é semelhante à seguinte, em que
PROJECT_ID
é o ID do projeto do Google Cloud:NAME us-west1-docker.pkg.dev/PROJECT_ID/distributed-tracing-docker-repo/backend
Implantar o serviço de back-end
No Cloud Shell, defina o contexto
kubectx
para o clusterbackend
:kubectx backend
Crie o arquivo YAML para a implantação
backend
:export PROJECT_ID=$(gcloud info --format='value(config.project)') envsubst < backend-deployment.yaml | kubectl apply -f -
Confirme se os pods estão em execução:
kubectl get pods
A saída exibe um valor
Status
deRunning
:NAME READY STATUS RESTARTS AGE backend-645859d95b-7mx95 1/1 Running 0 52s backend-645859d95b-qfdnc 1/1 Running 0 52s backend-645859d95b-zsj5m 1/1 Running 0 52s
Exponha a implantação
backend
usando um balanceador de carga:kubectl expose deployment backend --type=LoadBalancer
Consiga o endereço IP do serviço
backend
:kubectl get services backend
O resultado será assim:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE backend LoadBalancer 10.11.247.58 34.83.88.143 8080:30714/TCP 70s
Se o valor do campo
EXTERNAL-IP
for<pending>
, repita o comando até que o valor seja um endereço IP.Capture o endereço IP da etapa anterior como uma variável:
export BACKEND_IP=$(kubectl get svc backend -ojson | jq -r '.status.loadBalancer.ingress[].ip')
Implantar o serviço de front-end
No Cloud Shell, defina o contexto
kubectx
como o cluster de back-end:kubectx frontend
Crie o arquivo YAML para a implantação
frontend
:export PROJECT_ID=$(gcloud info --format='value(config.project)') envsubst < frontend-deployment.yaml | kubectl apply -f -
Confirme se os pods estão em execução:
kubectl get pods
A saída exibe um valor
Status
deRunning
:NAME READY STATUS RESTARTS AGE frontend-747b445499-v7x2w 1/1 Running 0 57s frontend-747b445499-vwtmg 1/1 Running 0 57s frontend-747b445499-w47pf 1/1 Running 0 57s
Exponha a implantação
frontend
usando um balanceador de carga:kubectl expose deployment frontend --type=LoadBalancer
Consiga o endereço IP do serviço
frontend
:kubectl get services frontend
O resultado será assim:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.27.241.93 34.83.111.232 8081:31382/TCP 70s
Se o valor do campo
EXTERNAL-IP
for<pending>
, repita o comando até que o valor seja um endereço IP.Capture o endereço IP da etapa anterior como uma variável:
export FRONTEND_IP=$(kubectl get svc frontend -ojson | jq -r '.status.loadBalancer.ingress[].ip')
Carregar o aplicativo e analisar traces
Nesta seção, você usa o utilitário Apache Bench para criar solicitações para o aplicativo. Em seguida, analise os traces resultantes no Cloud Trace.
No Cloud Shell, use o Apache Bench para gerar 1.000 solicitações usando três linhas de execução simultâneas:
ab -c 3 -n 1000 http://${FRONTEND_IP}:8081/
No console do Google Cloud, acesse a página Lista de traces.
Para revisar a linha do tempo, clique em um dos URIs rotulados como
server
.Esse trace contém quatro períodos com os seguintes nomes:
- O primeiro período
server
captura a latência de ponta a ponta ao processar a solicitação HTTP no servidor de front-end. - O primeiro período
HTTP GET
captura a latência da chamada GET feita pelo cliente do front-end para o back-end. - O segundo período
server
captura a latência de ponta a ponta do processamento da solicitação HTTP no servidor de back-end. - O segundo período
HTTP GET
captura a latência da chamada GET feita pelo cliente do back-end para google.com.
- O primeiro período
Limpar
A maneira mais fácil de eliminar o faturamento é excluir o projeto do Google Cloud que você criou para a implantação. A outra opção é excluir os recursos individuais.
Excluir o projeto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Excluir recursos individuais
Para excluir recursos individuais em vez de excluir o projeto inteiro, execute os seguintes comandos no Cloud Shell:
gcloud container clusters delete frontend-cluster --zone=us-west1-a
gcloud container clusters delete backend-cluster --zone=us-west1-a
gcloud artifacts repositories delete distributed-tracing-docker-repo --location us-west1
A seguir
- Saiba mais sobre o OpenTelemetry.
- Para mais arquiteturas de referência, diagramas e práticas recomendadas, confira a Central de arquitetura do Cloud.