手動挿入

Go トレーサーは、スパン情報と、%v 形式の指定子を使ったログステートメントの印刷を可能にします。

package main

import (
    "net/http"

    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // /posts URL にウェブリクエストようのスパンを作成。
    span := tracer.StartSpan("web.request", tracer.ResourceName("/posts"))
    defer span.Finish()

    // スパン情報をログメッセージに付加:
    log.Printf("my log message %v", span)
}

上記の例は、標準ライブラリの log パッケージのスパンのコンテキストの使い方を説明しています。同様のロジックがサードパーティパッケージにも適用される場合があります。

: Datadog ログインテグレーションを使ってログをパースしていない場合は、カスタムログパースルールによって dd.trace_iddd.span_iddd.servicedd.envdd.version が文字列としてパースされていることを確実にする必要があります。詳しくは、関連するログがトレース ID パネルに表示されないを参照してください。

logrus ログへの注入

logrus パッケージには、ログとスパンを自動的にリンクするためのフックが用意されています。 このパッケージは Go トレーサーで利用可能です。

package main

import (
    "github.com/sirupsen/logrus"

    dd_logrus "gopkg.in/DataDog/dd-trace-go.v1/contrib/sirupsen/logrus"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func main() {
    // オプション: ログ形式を変更して JSON を使用 (Go ログコレクションを参照)
    logrus.SetFormatter(&logrus.JSONFormatter{})

    // Datadog コンテキストログフックを追加
    logrus.AddHook(&dd_logrus.DDContextLogHook{})

    // ...
}

これにより、コンテキスト付きでログを取る際に、トレース ID が自動的にログに注入されます。

    // コンテキスト付きのログ
    logrus.WithContext(ctx).Info("Go logs and traces connected!")

その他の参考資料