このトピックでは、OpenTelemetryを使用してトレースIDとスパンIDをログに自動的に書き込む方法について説明します。トレースIDとスパンIDがログに書き込まれた後、分散トレースデータとログデータを関連付けて、より効率的な障害診断とパフォーマンス分析を行うことができます。
Java
サポートされているロギングライブラリ
詳細については、Logger MDC自動インストルメンテーションを参照してください。
ロギングフレームワーク | 自動インストルメンテーションをサポートするバージョン | 手動インストルメンテーションのために導入する必要がある依存関係 |
Log4j1 | 1.2以降 | 該当なし |
Log4j2 | 2.7以降 | |
Logback | 1.0以降 |
Log4j2を使用する
OpenTelemetry Log4j2依存関係をpom.xmlファイルに追加します。
OPENTELEMETRY_VERSION
を最新バージョンに置き換えます。<dependencies> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-log4j-context-data-2.17-autoconfigure</artifactId> <version>OPENTELEMETRY_VERSION</version> <scope>runtime</scope> </dependency> </dependencies>
log4j2.xmlを開き、パターンに
%X{trace_id}
と%X{span_id}
を追加して、トレースIDとスパンIDのログへの自動書き込みを有効にします。次の例は、ログ形式を示しています。
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} - %msg%n"/> </Console> </Appenders> <Loggers> <Root> <AppenderRef ref="Console" level="All"/> </Root> </Loggers> </Configuration>
Logbackを使用する
OpenTelemetry Logback依存関係をpom.xmlファイルに追加します。
OPENTELEMETRY_VERSION
を最新バージョンに置き換えます。<dependencies> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-logback-mdc-1.0</artifactId> <version>OPENTELEMETRY_VERSION</version> </dependency> </dependencies>
logback.xmlを開き、パターンに
%X{trace_id}
と%X{span_id}
を追加して、トレースIDとスパンIDのログへの自動書き込みを有効にします。次の例は、ログ形式を示しています。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %msg%n</pattern> </encoder> </appender> <!-- ロギングアペンダー(例:ConsoleAppender)をOpenTelemetryAppenderでラップするだけです --> <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender"> <appender-ref ref="CONSOLE"/> </appender> <!-- 元の「CONSOLE」アペンダーの代わりに、ラップされた「OTEL」アペンダーを使用します --> <root level="INFO"> <appender-ref ref="OTEL"/> </root> </configuration>
Logbackを使用する(Spring Bootプロジェクト)
Spring Bootプロジェクトには、デフォルトでLogbackである組み込みのロギングフレームワークがあります。Java Spring Bootプロジェクトを開発している場合は、簡単な構成でトレースIDとスパンIDのログへの自動書き込みを有効にすることができます。
application.propertiesファイルを開き、application.properties
と%mdc{span_id}
をlogging.pattern.levelに追加します。
logging.pattern.level=trace_id=%mdc{trace_id} span_id=%mdc{span_id} %5p
次の例は、いくつかのログを示しています。
2024-06-26 10:56:31.200 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a INFO 53724 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-06-26 10:56:31.201 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-06-26 10:56:31.209 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2024-06-26 10:56:31.296 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=5743699405074f4e INFO 53724 --- [nio-8081-exec-1] com.example.httpserver.ot.OTServer : hello world
Go
GoのOpenTelemetryは、トレースIDとスパンIDのログへの自動書き込みをサポートしていません。以下のような追加の開発操作を行わない場合は、トレースIDとスパンIDを手動で記録する必要があります。
logrusを使用する
依存関係を追加します。
import ( oteltrace "go.opentelemetry.io/otel/trace" "github.com/sirupsen/logrus" )
スパンからトレースIDとスパンIDを抽出し、Logrusログフィールドに追加するツール関数を作成します。
func LogrusFields(span oteltrace.Span) logrus.Fields { return logrus.Fields{ "trace_id": span.SpanContext().TraceID().String(), "span_id": span.SpanContext().SpanID().String(), } }
スパンが作成された後、トレースIDとスパンIDを持つログが生成されます。
... _, span := tracer.Start(ctx, "spanName") defer span.End() logEntry := logrus.WithFields(LogrusFields(span)) logEntry.Info("This is an info message with trace and span ID") // トレースIDとスパンIDを含む情報メッセージです ...
Python
PythonのOpenTelemetryは、トレースIDとスパンIDのログへの自動書き込みをサポートしています。詳細については、OpenTelemetry Logging Instrumentationを参照してください。
loggingを使用する
OTEL_PYTHON_LOG_CORRELATION環境変数を
true
に設定して、トレースIDとスパンIDのログへの自動書き込みを有効にします。export OTEL_PYTHON_LOG_CORRELATION=true
ログ形式に
%(otelTraceID)s
と%(otelSpanID)s
を追加します。OpenTelemetryは、ログ内の%(otelTraceID)s
と%(otelSpanID)s
をトレースIDとスパンIDに自動的に置き換えます。次の例は、ログ形式を示しています。
formatter = logging.Formatter( '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s' )
次の例は、ログを示しています。
2024-06-25 10:00:55,494 INFO [app] [app.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - hello world
操作例
次の例では、Hellowordという名前のデモアプリケーションを使用して、PythonでトレースIDとスパンIDをログに自動的に書き込む方法を示します。
開始する前に、Pythonとpipがインストールされていることを確認してください。この例では、Python 3.12.4とpip 24.1.1を使用しています。
Flaskフレームワークをインストールします。
pip3 install flask
期待される出力:
Successfully installed Jinja2-3.1.4 MarkupSafe-2.1.5 Werkzeug-3.0.3 blinker-1.8.2 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0
上記の出力と同様の情報が表示された場合は、インストールは成功です。
必要なOpenTelemetry Pythonパッケージとツールをインストールします。
pip3 install opentelemetry-distro \ opentelemetry-exporter-otlp opentelemetry-bootstrap -a install
期待される出力:
Successfully installed opentelemetry-instrumentation-dbapi-0.46b0 Successfully installed opentelemetry-instrumentation-requests-0.46b0 Successfully installed opentelemetry-instrumentation-urllib3-0.46b0
上記の出力と同様の情報が表示された場合は、インストールは成功です。
サンプルコードを使用してアプリケーションを作成します。
import logging from logging.handlers import RotatingFileHandler from flask import Flask import os app = Flask(__name__) # OpenTelemetryコンテキストを含むフォーマッタを作成します。 formatter = logging.Formatter( '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s' ) # ログをファイルに書き込むRotatingFileHandlerを作成します。 # /path/to/app.logをログファイルの実際のパスに置き換えます。 file_handler = RotatingFileHandler('/path/to/app.log', maxBytes=10000, backupCount=1) file_handler.setLevel(logging.INFO) file_handler.setFormatter(formatter) app.logger.addHandler(file_handler) @app.route('/') def hello_world(): app.logger.info('Hello World!!!') // Hello World!!! return 'Hello, World!' if __name__ == '__main__': app.run()
デモアプリケーションを実行します。期待される出力:
* Running on http://127.0.**.**:5000
上記の出力と同様の情報が表示された場合は、アプリケーションのデプロイは成功です。
環境変数を設定して、トレースIDとスパンIDのログへの自動書き込みを有効にし、OpenTelemetryを使用してデモアプリケーションを自動的にインストルメントします。
export OTEL_PYTHON_LOG_CORRELATION=true export OTEL_SERVICE_NAME=ot-python-demo export OTEL_TRACES_EXPORTER=otlp export OTEL_METRICS_EXPORTER=none # test.pyを実際のファイル名に置き換えます。 opentelemetry-instrument python3 test.py
ログファイルを表示します。次の例は、ログを示しています。
2024-06-25 10:00:55,494 INFO [app] [test.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - hello world
この例では、トレースIDとスパンIDがログに記録されています。