地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Go】go.opentelemetry.io/otel/sdk/traceでサンプリングレートを指定する

otelcollectorがローカルにいればそちらで指定すれば良いがそうじゃないケースでサンプリングしたい場合に使える。

package main

import (
    "context"
    "log"

    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
    "go.opentelemetry.io/otel/sdk/resource"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
    semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
)

func main() {
    // トレースエクスポーターの設定
    exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
    if err != nil {
        log.Fatalf("Failed to create stdouttrace exporter: %v", err)
    }

    // サンプリングレートを50%に設定
    sampler := sdktrace.ParentBased(sdktrace.TraceIDRatioBased(0.5))

    tp := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
        // サンプラーを設定
        sdktrace.WithSampler(sampler),
        sdktrace.WithResource(resource.NewWithAttributes(
            semconv.SchemaURL,
            attribute.String("service.name", "your-service-name"),
        )),
    )
    otel.SetTracerProvider(tp)

    // ここからアプリケーションのトレースを開始します
    tracer := otel.Tracer("your-tracer-name")

    ctx, span := tracer.Start(context.Background(), "your-operation-name")
    defer span.End()

    // トレース対象の操作...
}