2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenTelemetryAdvent Calendar 2024

Day 9

GoのslogでOpenTelemetryのログを出す

Posted at

はじめに

OpenTelemetryではログ出力は既存のログライブラリに乗っかるという方針で、ログ出力ライブラリ用のブリッジがcontribリポジトリにあります。slogでもログを出力することができます。

OpenTelemetryでログを出力することの何が良いかというと、Traceと関連付けてログを出力できることです。一般的なバックエンド(Datadogなど)であれば特定のTraceを表示すると関連付けられたログだけを表示することができます。

GoのLogのステータスはBetaです。まあOpenTelemetryを使っているような人はBetaでも気にせず使う気がします。

設定

otel側の設定

// resourceはどこかで定義されているものとする
resource := getResource()

// 面倒なのでautoexportを使います
// go.opentelemetry.io/contrib/exporters/autoexport
logExporter, err := autoexport.NewLogExporter(ctx)
if err != nil {
    return nil, err
}

// ログレベルをminsevで指定
// go.opentelemetry.io/contrib/processors/minsev
severity = minsev.SeverityDebug

// sdklog "go.opentelemetry.io/otel/sdk/log"
lp := sdklog.NewLoggerProvider(
    sdklog.WithResource(resource),
    sdklog.WithProcessor(
        minsev.NewLogProcessor(
            sdklog.NewBatchProcessor(logExporter),
            severity,
        ),
    ),
)
// go.opentelemetry.io/otel/log/global
global.SetLoggerProvider(lp)

設定時にminsevを使わないとログ出力レベルが変更できません。slogのログ出力レベルは無視されます。

slog側の設定

logLevel := slog.LevelDebug
logger = slog.New(
    // stdoutにも出てほしいのでslog-multiを使う
    // slogmulti "github.com/samber/slog-multi
    slogmulti.Fanout(
        // go.opentelemetry.io/contrib/bridges/otelslog
        otelslog.NewHandler("slog-test"),
        slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
            Level: logLevel
        }),
    ),
)
slog.SetDefault(logger)

ログ出力

slog.InfoContext(ctx, "hoge")

注意点として、Contextに関連付けられたTraceが終了しているとログが出力されません。

これでTraceとLogが関連付けられた状態でDatadogなどで表示することができます。ローカルだとAspire Dashboardかotel-tuiが確認しやすいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?