Se você precisa de rastreamento distribuído para seus serviços Go, o Managed Service for OpenTelemetry coleta dados de trace por meio do cliente Jaeger. Instrumente sua aplicação Go uma única vez, escolha um método de reporte e os traces estarão disponíveis no console para análise.
Dois métodos de reporte estão disponíveis:
|
Método |
Transporte |
Mais indicado para |
|
Jaeger SDK (recomendado) |
HTTP direto para o endpoint |
Implantações simples em que cada serviço gerencia seu próprio reporte, sem necessidade de instalar componentes adicionais. |
|
Agente Jaeger |
UDP para um agente local, que encaminha os dados ao endpoint |
Ambientes de produção onde se deseja desacoplar o transporte de traces da aplicação ou quando vários serviços compartilham um único agente. |
Os diagramas a seguir ilustram o fluxo de dados de cada método.
Reporte direto sem o agente Jaeger:

Reporte por meio do agente Jaeger:

Obter um endpoint do Jaeger
Antes de instrumentar sua aplicação, obtenha o endpoint para o qual o cliente Jaeger enviará os traces.
Faça login no console do Managed Service for OpenTelemetry.
No painel de navegação à esquerda, clique em Cluster Configurations. Em seguida, clique na aba Access point information.
Na barra de navegação superior, selecione uma região. Na seção Cluster Information, ative Show Token.
Na seção Client, clique em Jaeger ou Zipkin.
Copie o endpoint na coluna Related Information.

Use um endpoint de Virtual Private Cloud (VPC) se sua aplicação estiver em execução em um ambiente de produção da Alibaba Cloud. Para todos os demais ambientes, use um endpoint público. No caso do Zipkin, prefira o endpoint v2, a menos que haja um motivo específico para usar a versão v1.
Instalar a biblioteca cliente do Jaeger
Ambos os métodos de reporte usam a mesma biblioteca cliente Go. Instale-a usando módulos Go:
go get github.com/uber/jaeger-client-go
Inicializar o tracer
Escolha uma das opções abaixo conforme o método de reporte selecionado.
Opção A: Reporte direto com o Jaeger SDK
Crie um tracer que envia spans via HTTP diretamente para o endpoint do Managed Service for OpenTelemetry:
import (
"io"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/transport"
)
func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) {
sender := transport.NewHTTPTransport(
// Replace with the endpoint from the Access point information tab.
// Use a VPC endpoint for production; use a public endpoint otherwise.
"<endpoint>",
)
tracer, closer := jaeger.NewTracer(
service,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(sender),
)
return tracer, closer
}
Substitua o placeholder abaixo pelo valor correspondente:
|
Placeholder |
Descrição |
Exemplo |
|
|
Endpoint do Jaeger obtido na aba Access point information |
|
Opção B: Reporte por meio do agente Jaeger
Antes de criar o tracer, instale e inicie o agente Jaeger. Consulte Instalar o agente Jaeger.
Em seguida, crie um tracer que envia spans via UDP para o agente local:
import (
"io"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
)
func NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) {
sender, _ := jaeger.NewUDPTransport("", 0)
tracer, closer := jaeger.NewTracer(
serviceName,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(sender),
)
return tracer, closer
}
Criar spans e propagar contexto
Após inicializar o tracer, crie spans para capturar operações na sua aplicação.
Iniciar um span raiz
Use este padrão no ponto de entrada de uma requisição recebida, quando não houver um span pai existente:
// Start a new root span for the operation.
span := tracer.StartSpan("myspan")
// Always call Finish() to flush the span to the reporter when the function returns.
defer span.Finish()
// Attach metadata to the span for filtering and analysis in the console.
clientSpan.SetTag("mytag", "123")
// Inject the trace context into outgoing HTTP headers
// so downstream services can continue the trace.
tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
Continuar um trace a partir de uma requisição recebida
Aplique este padrão ao processar uma requisição proveniente de um serviço upstream já instrumentado:
// Extract the trace context from the incoming HTTP or RPC request headers.
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
// Create a child span linked to the extracted parent context.
span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
defer span.Finish()
Para a referência completa da API, consulte Jaeger Bindings for Go OpenTracing API.
Executar a demonstração
Uma aplicação de demonstração pré-compilada abrange ambos os métodos de reporte. Baixe e configure o projeto para validar sua configuração.
-
Baixe e extraia a demonstração:
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip -
Abra o arquivo
examples/settings.goe configure a demonstração conforme o método de reporte escolhido: Para reporte direto via SDK, definaTracingAnalysisEndpointcom o endpoint obtido em Obter um endpoint do Jaeger. Para reporte via agente Jaeger, inicie primeiro o agente Jaeger (consulte Instalar o agente Jaeger) e depois definaAgentSwitchcomotrue.

-
Instale as dependências e execute a demonstração:
go mod tidy go run tracingdemo
Perguntas frequentes
**Por que recebo um erro 403 ao reportar dados?**
2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403
O endpoint é inválido. Para resolver esse problema:
Faça login no console do Managed Service for OpenTelemetry.
Acesse Cluster Configurations > Access point information.
Ative Show Token e copie novamente a string completa do endpoint.
Atualize o endpoint na configuração da sua aplicação e reinicie-a.