Instrumente sua aplicação Go com o Jaeger e relate traces para o Managed Service for OpenTelemetry. Após o relato dos traces, o Managed Service for OpenTelemetry passa a monitorar sua aplicação. Visualize diversos dados de monitoramento, como topologia da aplicação, pilhas de chamadas, transações anômalas, transações lentas e análise de SQL. Este tópico descreve como usar o SDK do Jaeger e o Jaeger Agent para instrumentar e relatar dados de aplicações Go.
Para obter recursos mais avançados, capacidades superiores de rastreamento e uma experiência aprimorada, conecte sua aplicação ao Managed Service for OpenTelemetry pelo protocolo OpenTelemetry. Para mais informações, consulte Preparations.
O ARMS oferece um agent desenvolvido internamente e com suporte comercial para aplicações Go. Esse agent permite instrumentação não intrusiva, além de proporcionar um conjunto de recursos mais amplo e maior estabilidade. Para mais informações, consulte Monitor Go applications.
Pré-requisitos
Informações de fundo
Método 1: Relatar dados usando o SDK do Jaeger
Esta seção usa a ferramenta de gerenciamento de dependências Go Modules como exemplo. Use o SDK do Jaeger para instrumentar e relatar dados diretamente ao servidor do Managed Service for OpenTelemetry. Caso utilize outras ferramentas de gerenciamento de dependências, execute as operações necessárias.
-
Importe o jaeger-client-go.
go get github.com/uber/jaeger-client-go -
Crie um objeto Tracer.
NotaSubstitua
<endpoint>pelo endpoint correspondente ao seu cliente e região. Obtenha o endpoint na página Endpoint Information no console do Managed Service for OpenTelemetry. Para mais detalhes sobre como obter o endpoint, consulte a seção Pré-requisitos deste tópico.func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) { sender := transport.NewHTTPTransport( // Set the gateway. The gateway varies based on the region. "<endpoint>", ) tracer, closer:= jaeger.NewTracer(service, jaeger.NewConstSampler(true), jaeger.NewRemoteReporter(sender)) return tracer, closer } -
Crie um objeto de instância de span e habilite a passagem de dados.
-
Se não existir nenhum parentSpan:
// Create a span. span := tracer.StartSpan("myspan") // Set a tag. clientSpan.SetTag("mytag", "123") // Pass through the trace ID. tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish() -
Se existir um parentSpan:
// Parse spanCtx from the HTTP/RPC object. spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
Para mais informações sobre o uso do SDK, consulte a documentação do Go Doc.
-
Método 2: Relatar dados usando o Jaeger Agent
Inicie o Jaeger Agent. Para mais informações, consulte Install Jaeger Agent.
-
Importe o jaeger-client-go.
go get github.com/uber/jaeger-client-go -
Crie um objeto Tracer.
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 } -
Crie um objeto de instância de span e habilite a passagem de dados.
-
Se não existir nenhum parentSpan:
// Create a span. span := tracer.StartSpan("myspan") // Set a tag. clientSpan.SetTag("mytag", "123") // Pass through the trace ID. tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish() -
Se existir um parentSpan:
// Parse spanCtx from the HTTP/RPC object. spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
Para mais informações sobre o uso do SDK, consulte a documentação do Go Doc.
-
Exemplos
Relatar dados diretamente usando o SDK do Jaeger
Obtenha o endpoint. Para mais informações, consulte a seção Pré-requisitos deste tópico.
-
Execute o comando abaixo para baixe o arquivo de exemplo.
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip -
Abra o arquivo examples/settings.go na pasta de exemplo e configure os parâmetros conforme descrito nos comentários do bloco de código: defina TracingAnalysisEndpoint com o endpoint obtido na Etapa 1.
package examples // Required for SDK reporting: set the Tracing Analysis gateway (the value varies by region; obtain it from the configuration view at http://tracing.console.alibabacloud.com/) const TracingAnalysisEndpoint = "http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxxxx_xxxxx/api/traces" // Agent reporting: true (requires a locally started jaeger-agent) SDK reporting: false (default) const AgentSwitch = false // Application names in the Tracing Analysis console const ( CliTracerServiceName = "cliDemo" GrpcServerName = "grpcServer" GrpcClientName = "grpcClient" HttpServerName = "httpServer" HttpClientName = "httpClient" ) Execute o comando
go mod tidypara gerencie as dependências.Execute o comando
go run tracingdemopara execute o exemplo.
Relatar dados usando o Jaeger Agent
Obtenha o endpoint. Para mais informações, consulte a seção Pré-requisitos deste tópico.
-
Execute o comando abaixo para baixe o arquivo de exemplo.
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip Inicie o Jaeger Agent. Para mais informações, consulte Install Jaeger Agent.
-
Abra o arquivo examples/settings.go na pasta de exemplo, configure os parâmetros conforme descrito nos comentários do bloco de código e altere o valor de
AgentSwitchparatrue.package examples // Required for SDK reporting: set the Tracing Analysis gateway (the value varies by region; obtain it from the configuration view at http://tracing.console.alibabacloud.com/) const TracingAnalysisEndpoint = "http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxxxx_xxxxx/api/traces" // Agent reporting: true (requires a locally started jaeger-agent) SDK reporting: false (default) const AgentSwitch = false // Application names in the Tracing Analysis console const ( CliTracerServiceName = "cliDemo" GrpcServerName = "grpcServer" GrpcClientName = "grpcClient" HttpServerName = "httpServer" HttpClientName = "httpClient" ) Execute o comando
go mod tidypara gerencie as dependências.Execute o comando
go run tracingdemopara execute o exemplo.
Perguntas frequentes
P: Por que o seguinte erro ocorre durante a execução?
2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403
R: Esse erro indica que o endpoint está incorreto. Corrija o endpoint e tente novamente.
