Para visualizar os dados de rastreamento da sua aplicação, use um cliente para reportar esses dados ao Managed Service for OpenTelemetry. Este tópico descreve como usar o OpenTelemetry SDK for Go para enviar os dados de rastreamento de uma aplicação Go.
Pré-requisitos
Informações de fundo
O OpenTelemetry SDK for Go oferece recursos de análise de rastreamento distribuído para a linguagem de programação Go. Use o OpenTelemetry Protocol (OTLP) sobre gRPC ou HTTP para enviar dados ao servidor do Managed Service for OpenTelemetry.
O OpenTelemetry disponibiliza diversos plug-ins de instrumentação semiautomática. Não é necessário criar spans manualmente; basta chamar as operações de API fornecidas por esses plug-ins no código. Spans são criados automaticamente para frameworks comuns. Para mais detalhes sobre os frameworks suportados, consulte a documentação do OpenTelemetry.
Código de exemplo
Envio de dados via gRPC
-
Adicione a dependência do OpenTelemetry Go.
go get go.opentelemetry.io/otel go get go.opentelemetry.io/otel/trace go get go.opentelemetry.io/otel/sdk go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc // otlp grpc -
Inicialize o OpenTelemetry SDK for Go.
Envie dados diretamente pelo OpenTelemetry SDK for Go ou encaminhe-os pelo OpenTelemetry Collector open source.
Para enviar dados com o OpenTelemetry SDK for Go, substitua otelAgentAddr e xtraceToken pelo endpoint e token de autenticação obtidos na seção de Pré-requisitos.
Para encaminhar dados usando o OpenTelemetry Collector open source, substitua otelAgentAddr pelo endereço IP do seu serviço local e remova os headers:
func initProvider() func() { ctx := context.Background() otelAgentAddr, xtraceToken, ok := common.ObtainXTraceInfo() if !ok { log.Fatalf("Cannot init OpenTelemetry, exit") os.Exit(-1) } headers := map[string]string{"Authentication": xtraceToken} // Replace xtraceToken with the authentication token obtained in the Prerequisites section. traceClient := otlptracegrpc.NewClient( otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint(otelAgentAddr), // Replace otelAgentAddr with the endpoint obtained in the Prerequisites section. otlptracegrpc.WithHeaders(headers), otlptracegrpc.WithDialOption(grpc.WithBlock())) log.Println("start to connect to server") traceExp, err := otlptrace.New(ctx, traceClient) handleErr(err, "Failed to create the collector trace exporter") res, err := resource.New(ctx, resource.WithFromEnv(), resource.WithProcess(), resource.WithTelemetrySDK(), resource.WithHost(), resource.WithAttributes( // Specify the service name displayed on the backend of Managed Service for OpenTelemetry. semconv.ServiceNameKey.String(common.ServerServiceName), semconv.HostNameKey.String(common.ServerServiceHostName), ), ) handleErr(err, "failed to create resource") bsp := sdktrace.NewBatchSpanProcessor(traceExp) tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithResource(res), sdktrace.WithSpanProcessor(bsp), ) // Set the global propagator to tracecontext. The global propagator is not specified by default. otel.SetTextMapPropagator(propagation.TraceContext{}) otel.SetTracerProvider(tracerProvider) return func() { cxt, cancel := context.WithTimeout(ctx, time.Second) defer cancel() if err := traceExp.Shutdown(cxt); err != nil { otel.Handle(err) } } } -
Instrumente a aplicação.
shutdown := initProvider() defer shutdown() //meter := global.Meter("demo-server-meter") serverAttribute := attribute.String("server-attribute", "foo") fmt.Println("start to gen chars for trace data") initTraceDemoData() fmt.Println("gen trace data done") tracer := otel.Tracer(common.TraceInstrumentationName) // Create a handler in OpenTelemetry. handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { // Simulate a delay. var sleep int64 switch modulus := time.Now().Unix() % 5; modulus { case 0: sleep = rng.Int63n(2000) case 1: sleep = rng.Int63n(15) case 2: sleep = rng.Int63n(917) case 3: sleep = rng.Int63n(87) case 4: sleep = rng.Int63n(1173) } ctx := req.Context() span := trace.SpanFromContext(ctx) span.SetAttributes(serverAttribute) actionChild(tracer, ctx, sleep) w.Write([]byte("Hello World")) }) wrappedHandler := otelhttp.NewHandler(handler, "/hello") http.Handle("/hello", wrappedHandler) http.ListenAndServe(":7080", nil) -
Inicie a aplicação.
go run main.goNa página Applications do console do Managed Service for OpenTelemetry, clique em nome da aplicação. Na página seguinte, visualize os dados de rastreamento.
Faça login no console do ARMS. No painel de navegação à esquerda, escolha . Na página Applications, clique em nome da aplicação. Na página seguinte, visualize os dados de rastreamento.
NotaA presença do ícone
na coluna Language indica que a aplicação está conectada ao Application Monitoring. Se houver um hífen (-), a conexão é com o Managed Service for OpenTelemetry.
Envio de dados via HTTP
-
Adicione a dependência do OpenTelemetry Go.
go get go.opentelemetry.io/otel go get go.opentelemetry.io/otel/trace go get go.opentelemetry.io/otel/sdk go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp // otlp http -
Inicialize o OpenTelemetry SDK for Go. Substitua Endpoint e URLPath pelo endpoint obtido na seção de Pré-requisitos.
Envie dados diretamente pelo OpenTelemetry SDK for Go ou encaminhe-os pelo OpenTelemetry Collector open source.
Para envio direto com o OpenTelemetry SDK for Go, substitua Endpoint e URLPath pelo endpoint obtido nos Pré-requisitos.
Para encaminhamento via OpenTelemetry Collector open source, substitua Endpoint pelo endereço IP do seu serviço local e remova os headers:
func initProvider() func() { ctx := context.Background() traceClientHttp := otlptracehttp.NewClient( otlptracehttp.WithEndpoint("127.0.XX.XX:8080"), //Replace Endpoint with the endpoint obtained in the Prerequisites section. otlptracehttp.WithURLPath("/adapt_xxxxx/api/otlp/traces"), //Replace URLPath with the endpoint obtained in the Prerequisites section. otlptracehttp.WithInsecure()) otlptracehttp.WithCompression(1) traceExp, err := otlptrace.New(ctx, traceClientHttp) handleErr(err, "Failed to create the collector trace exporter") res, err := resource.New(ctx, resource.WithFromEnv(), resource.WithProcess(), resource.WithTelemetrySDK(), resource.WithHost(), resource.WithAttributes( // Specify the service name displayed on the backend of Managed Service for OpenTelemetry. semconv.ServiceNameKey.String(common.ClientServiceName), semconv.HostNameKey.String(common.ClientServiceHostName), ), ) handleErr(err, "failed to create resource") bsp := sdktrace.NewBatchSpanProcessor(traceExp) tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithResource(res), sdktrace.WithSpanProcessor(bsp), ) // Set the global propagator to tracecontext. The global propagator is not specified by default. otel.SetTextMapPropagator(propagation.TraceContext{}) otel.SetTracerProvider(tracerProvider) log.Println("OTEL init success") return func() { cxt, cancel := context.WithTimeout(ctx, time.Second) defer cancel() if err := traceExp.Shutdown(cxt); err != nil { otel.Handle(err) } } } -
Instrumente a aplicação.
tracer := otel.Tracer(common.TraceInstrumentationName) method, _ := baggage.NewMember("method", "repl") client, _ := baggage.NewMember("client", "cli") bag, _ := baggage.New(method, client) defaultCtx := baggage.ContextWithBaggage(context.Background(), bag) for { ctx, span := tracer.Start(defaultCtx, "ExecuteRequest") makeRequest(ctx) span.End() time.Sleep(time.Duration(1) * time.Second) } -
Inicie a aplicação.
go run main.goNa página Applications do console do Managed Service for OpenTelemetry, clique em nome da aplicação. Na página seguinte, visualize os dados de rastreamento.
Faça login no console do ARMS. No painel de navegação à esquerda, escolha . Na página Applications, clique em nome da aplicação. Na página seguinte, visualize os dados de rastreamento.
NotaA presença do ícone
na coluna Language indica que a aplicação está conectada ao Application Monitoring. Se houver um hífen (-), a conexão é com o Managed Service for OpenTelemetry.
