Java ログとトレースの接続
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

Java ログとトレースの接続

トレースおよびスパン ID を自動的に挿入します

-Ddd.logs.injection=true を jvm スタートアップ引数として追加するか、環境変数 DD_LOGS_INJECTION=true を通じて、Java トレースのコンフィギュレーションの挿入を有効にします。

ログが JSON 形式で Logback を使っている場合、すべきことは残っていません。一方、他のロギングライブラリの場合は、ログに対する MDC 属性の自動挿入を有効にする必要があります。

ログが Raw 形式の場合、フォーマッタを更新してロガーコンフィギュレーションに dd.trace_id and dd.span_id を含めます:

<Pattern>"%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %X{dd.trace_id:-0} %X{dd.span_id:-0} - %m%n"</Pattern>

: トレース ID の attribute.pathdd.trace_id でない場合は、当該トレース ID の attribute.path 向け予約済み属性設定アカウントを確認してください。詳しくはこのトピックについてのよくあるご質問を参照してください。

トレースおよびスパン ID を手動で挿入する

手動でトレースとログを相関付ける場合は、Datadog API を使用して相関識別子を取得します。

  • CorrelationIdentifier#getTraceId()CorrelationIdentifier#getSpanId() API メソッドを使用して、ログの各スパンの先頭と末尾に識別子を挿入します (以下の例を参照)。
  • MDC を構成して挿入されたキーを使います:

    • ログステートメント中の dd.trace_id アクティブトレース ID (またはトレースがない場合は 0)
    • ログステートメント中の dd.span_id アクティブスパン ID (またはトレースがない場合は 0)
import org.apache.logging.log4j.ThreadContext;
import datadog.trace.api.CorrelationIdentifier;

// このブロックより前に開始し、アクティブなスパンがある必要があります。
try {
    ThreadContext.put("dd.trace_id", String.valueOf(CorrelationIdentifier.getTraceId()));
    ThreadContext.put("dd.span_id", String.valueOf(CorrelationIdentifier.getSpanId()));
}

// 何かをログ

finally {
    ThreadContext.remove("dd.trace_id");
    ThreadContext.remove("dd.span_id");
}
import org.slf4j.MDC;
import datadog.trace.api.CorrelationIdentifier;

// このブロックより前に開始し、アクティブなスパンがある必要があります。
try {
    MDC.put("dd.trace_id", String.valueOf(CorrelationIdentifier.getTraceId()));
    MDC.put("dd.span_id", String.valueOf(CorrelationIdentifier.getSpanId()));
}

// 何かをログ

finally {
    MDC.remove("dd.trace_id");
    MDC.remove("dd.span_id");
}

次にロガーコンフィギュレーションを更新して dd.trace_iddd.span_id をログパターンに含めます:

<Pattern>"%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %X{dd.trace_id:-0} %X{dd.span_id:-0} - %m%n"</Pattern>

: ログのパースに Datadog ログインテグレーションを使用していない場合は、カスタムログパースルールによって dd.trace_iddd.span_id が文字列としてパースされていることを確認する必要があります。詳しくは、このトピックに関するよくあるご質問 を参照してください。

特定のロガー実装の詳細や JSON のログ方法については、Java ロギングのドキュメントを参照してください

その他の参考資料