アプリケーションのトレースデータを表示するには、クライアントを使用してトレースデータをManaged Service for OpenTelemetryに送信する必要があります。このトピックでは、OpenTelemetry SDK for Go を使用して Go アプリケーションのトレースデータを送信する方法について説明します。
前提条件
背景情報
OpenTelemetry SDK for Goは、Goプログラミング言語に分散トレース分析機能を提供します。 gRPCまたはHTTP経由のOpenTelemetry Protocol (OTLP) を使用して、Managed Service for OpenTelemetry サーバーにデータを送信できます。
OpenTelemetry は、いくつかの半自動インストゥルメンテーションプラグインを提供しています。手動でスパンを作成する必要はありません。コードでこれらのプラグインによって提供されるAPI操作を呼び出すだけで済みます。一般的なフレームワークのスパンは自動的に作成できます。サポートされているフレームワークの詳細については、OpenTelemetry のドキュメントを参照してください。
サンプルコード
gRPC 経由でデータを送信する
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
OpenTelemetry SDK for Go を初期化します。
OpenTelemetry SDK for Go を使用してデータを送信するか、オープンソースの OpenTelemetry Collector を使用してデータを転送できます。
OpenTelemetry SDK for Go を使用してデータを送信する場合は、otelAgentAddr と xtraceToken を「前提条件」セクションで取得したエンドポイントと認証トークンに置き換えます。
オープンソースの OpenTelemetry Collector を使用してデータを転送する場合は、otelAgentAddr をオンプレミスサービスの IP アドレスに置き換え、ヘッダーを削除します。
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} // xtraceToken を「前提条件」セクションで取得した認証トークンに置き換えます。 traceClient := otlptracegrpc.NewClient( otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint(otelAgentAddr), // otelAgentAddr を「前提条件」セクションで取得したエンドポイントに置き換えます。 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( // 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), ) // グローバルプロパゲーターを tracecontext に設定します。グローバルプロパゲーターはデフォルトでは指定されていません。 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) } } }
アプリケーションをインストゥルメントします。
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) // OpenTelemetry でハンドラーを作成します。 handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { // 遅延をシミュレートします。 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)
アプリケーションを起動します。
go run main.go
ARMS コンソールにログインします。左側のナビゲーションペインで、 を選択します。「アプリケーション」ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。
説明アイコンが言語列に表示されている場合は、アプリケーションはApplication Monitoringに接続されています。ハイフン (-) が表示されている場合は、アプリケーションはManaged Service for OpenTelemetryに接続されています。
HTTP 経由でデータを送信する
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
OpenTelemetry SDK for Go を初期化します。Endpoint と URLPath を「前提条件」セクションで取得したエンドポイントに置き換えます。
OpenTelemetry SDK for Go を使用してデータを送信するか、オープンソースの OpenTelemetry Collector を使用してデータを転送できます。
OpenTelemetry SDK for Go を使用してデータを送信する場合は、Endpoint と URLPath を「前提条件」セクションで取得したエンドポイントに置き換えます。
オープンソースの OpenTelemetry Collector を使用してデータを転送する場合は、Endpoint をオンプレミスサービスの IP アドレスに置き換え、ヘッダーを削除します。
func initProvider() func() { ctx := context.Background() traceClientHttp := otlptracehttp.NewClient( otlptracehttp.WithEndpoint("127.0.XX.XX:8080"), // Endpoint を「前提条件」セクションで取得したエンドポイントに置き換えます。 otlptracehttp.WithURLPath("/adapt_xxxxx/api/otlp/traces"), // URLPath を「前提条件」セクションで取得したエンドポイントに置き換えます。 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( // 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), ) // グローバルプロパゲーターを tracecontext に設定します。グローバルプロパゲーターはデフォルトでは指定されていません。 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) } } }
アプリケーションをインストゥルメントします。
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) }
アプリケーションを起動します。
go run main.go
ARMS コンソールにログインします。左側のナビゲーションペインで、 を選択します。「アプリケーション」ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。
説明アイコンが言語列に表示されている場合、アプリケーションはApplication Monitoringに接続されています。ハイフン (-) が表示されている場合、アプリケーションはManaged Service for OpenTelemetryに接続されています。