すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:OpenTelemetry を使用して Go アプリケーションのトレースデータを送信する

最終更新日:Mar 03, 2025

アプリケーションのトレースデータを表示するには、クライアントを使用してトレースデータをManaged Service for OpenTelemetryに送信する必要があります。このトピックでは、OpenTelemetry SDK for Go を使用して Go アプリケーションのトレースデータを送信する方法について説明します。

前提条件

Managed Service for OpenTelemetry のエンドポイントを取得するには、次の手順を実行します。

  1. Managed Service for OpenTelemetry コンソールにログインします。

  2. 左側のナビゲーションペインで、クラスタ設定をクリックします。表示されるページで、アクセスポイント情報タブをクリックします。

  3. 上部のナビゲーションバーでリージョンを選択します。クラスタ情報セクションで、トークンを表示をオンにします。

  4. クライアントパラメータをOpenTelemetryに設定します。

    下部の表の関連情報列に、Managed Service for OpenTelemetry のエンドポイントが表示されます。OT接入点信息

    説明

    アプリケーションがAlibaba Cloudの本番環境にデプロイされている場合は、Virtual Private Cloud (VPC) エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。

背景情報

OpenTelemetry SDK for Goは、Goプログラミング言語に分散トレース分析機能を提供します。 gRPCまたはHTTP経由のOpenTelemetry Protocol (OTLP) を使用して、Managed Service for OpenTelemetry サーバーにデータを送信できます。

OpenTelemetry は、いくつかの半自動インストゥルメンテーションプラグインを提供しています。手動でスパンを作成する必要はありません。コードでこれらのプラグインによって提供されるAPI操作を呼び出すだけで済みます。一般的なフレームワークのスパンは自動的に作成できます。サポートされているフレームワークの詳細については、OpenTelemetry のドキュメントを参照してください。

サンプルコード

oltp-exporter

gRPC 経由でデータを送信する

  1. 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
  2. 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)
            }
        }
    }
  3. アプリケーションをインストゥルメントします。

    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)
  4. アプリケーションを起動します。

    go run main.go

    ARMS コンソールにログインします。左側のナビゲーションペインで、アプリケーション監視 > アプリケーションを選択します。「アプリケーション」ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。

    説明

    image アイコンが言語列に表示されている場合は、アプリケーションはApplication Monitoringに接続されています。ハイフン (-) が表示されている場合は、アプリケーションはManaged Service for OpenTelemetryに接続されています。

HTTP 経由でデータを送信する

  1. 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
  2. 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)
            }
        }
    }
  3. アプリケーションをインストゥルメントします。

    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)
        }
  4. アプリケーションを起動します。

    go run main.go

    ARMS コンソールにログインします。左側のナビゲーションペインで、アプリケーション監視 > アプリケーションを選択します。「アプリケーション」ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。

    説明

    image アイコンが言語列に表示されている場合、アプリケーションはApplication Monitoringに接続されています。ハイフン (-) が表示されている場合、アプリケーションはManaged Service for OpenTelemetryに接続されています。