Topik ini menjelaskan cara menggunakan OpenTelemetry untuk secara otomatis menulis ID jejak dan ID rentang ke log. Setelah ID jejak dan ID rentang ditulis ke log, Anda dapat mengaitkan data jejak terdistribusi dengan data log untuk diagnosis kesalahan dan analisis kinerja yang lebih efisien.
Java
Kerangka logging yang didukung
Untuk informasi lebih lanjut, lihat Logger MDC Auto-Instrumentation.
Kerangka logging | Versi yang mendukung instrumentasi otomatis | Dependensi yang diperlukan untuk instrumentasi manual |
Log4j1 | 1.2 dan yang lebih baru | Tidak tersedia |
Log4j2 | 2.7 dan yang lebih baru | |
Logback | 1.0 dan yang lebih baru |
Menggunakan Log4j2
Tambahkan dependensi OpenTelemetry Log4j2 ke file pom.xml.
Ganti
OPENTELEMETRY_VERSIONdengan versi terbaru.<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>Buka log4j2.xml, dan tambahkan
%X{trace_id}dan%X{span_id}ke pola untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.Contoh berikut menunjukkan format log:
<?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>
Menggunakan Logback
Tambahkan dependensi OpenTelemetry Logback ke file pom.xml.
Ganti
OPENTELEMETRY_VERSIONdengan versi terbaru.<dependencies> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-logback-mdc-1.0</artifactId> <version>OPENTELEMETRY_VERSION</version> </dependency> </dependencies>Buka logback.xml, dan tambahkan
%X{trace_id}dan%X{span_id}ke pola untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.Contoh berikut menunjukkan format log:
<?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> <!-- Cukup bungkus appender logging Anda, misalnya ConsoleAppender, dengan OpenTelemetryAppender --> <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender"> <appender-ref ref="CONSOLE"/> </appender> <!-- Gunakan appender "OTEL" yang dibungkus alih-alih appender "CONSOLE" asli --> <root level="INFO"> <appender-ref ref="OTEL"/> </root> </configuration>
Menggunakan Logback (Proyek Spring Boot)
Proyek Spring Boot memiliki kerangka logging bawaan, yaitu Logback secara default. Jika Anda sedang mengembangkan proyek Java Spring Boot, Anda dapat mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log dengan konfigurasi sederhana.
Buka file application.properties dan tambahkan application.properties dan %mdc{span_id} ke logging.pattern.level.
logging.pattern.level=trace_id=%mdc{trace_id} span_id=%mdc{span_id} %5pContoh berikut menunjukkan beberapa log:
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].[/] : Menginisialisasi 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 : Menginisialisasi 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 : Inisialisasi selesai dalam 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 : halo duniaGo
OpenTelemetry di Go tidak mendukung penulisan otomatis ID jejak dan ID rentang ke log. Jika Anda tidak melakukan operasi pengembangan tambahan seperti yang berikut ini, Anda perlu mencatat ID jejak dan ID rentang secara manual.
Menggunakan logrus
Tambahkan dependensi.
import ( oteltrace "go.opentelemetry.io/otel/trace" "github.com/sirupsen/logrus" )Buat fungsi utilitas untuk mengekstrak ID jejak dan ID rentang dari rentang dan menambahkannya ke bidang log Logrus.
func LogrusFields(span oteltrace.Span) logrus.Fields { return logrus.Fields{ "trace_id": span.SpanContext().TraceID().String(), "span_id": span.SpanContext().SpanID().String(), } }Setelah rentang dibuat, log dengan ID jejak dan ID rentang dihasilkan.
... _, span := tracer.Start(ctx, "spanName") defer span.End() logEntry := logrus.WithFields(LogrusFields(span)) logEntry.Info("Ini adalah pesan info dengan ID jejak dan ID rentang") ...
Python
OpenTelemetry di Python mendukung penulisan otomatis ID jejak dan ID rentang ke log. Untuk informasi lebih lanjut, lihat Instrumen Logging OpenTelemetry.
Menggunakan logging
Atur variabel lingkungan OTEL_PYTHON_LOG_CORRELATION ke
trueuntuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.export OTEL_PYTHON_LOG_CORRELATION=trueTambahkan
%(otelTraceID)sdan%(otelSpanID)ske format log. OpenTelemetry secara otomatis mengganti%(otelTraceID)sdan%(otelSpanID)sdi log dengan ID jejak dan ID rentang.Contoh berikut menunjukkan format log:
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' )Contoh berikut menunjukkan sebuah log:
2024-06-25 10:00:55,494 INFO [app] [app.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - halo dunia
Contoh operasi
Dalam contoh berikut, aplikasi demo bernama Helloword digunakan untuk menunjukkan cara menulis otomatis ID jejak dan ID rentang ke log di Python.
Sebelum memulai, pastikan Python dan pip telah terinstal. Dalam contoh ini, Python 3.12.4 dan pip 24.1.1 digunakan.
Instal kerangka Flask.
pip3 install flaskOutput yang diharapkan:
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.0Jika informasi serupa dengan output di atas ditampilkan, instalasi berhasil.
Instal paket dan alat OpenTelemetry Python yang diperlukan.
pip3 install opentelemetry-distro \ opentelemetry-exporter-otlp opentelemetry-bootstrap -a installOutput yang diharapkan:
Successfully installed opentelemetry-instrumentation-dbapi-0.46b0 Successfully installed opentelemetry-instrumentation-requests-0.46b0 Successfully installed opentelemetry-instrumentation-urllib3-0.46b0Jika informasi serupa dengan output di atas ditampilkan, instalasi berhasil.
Buat aplikasi menggunakan kode contoh.
import logging from logging.handlers import RotatingFileHandler from flask import Flask import os app = Flask(__name__) # Buat formatter yang berisi konteks 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' ) # Buat RotatingFileHandler untuk menulis log ke file. # Ganti /path/to/app.log dengan jalur sebenarnya dari file 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('Halo Dunia!!!') return 'Halo, Dunia!' if __name__ == '__main__': app.run()Jalankan aplikasi demo. Output yang diharapkan:
* Running on http://127.0.**.**:5000Jika informasi serupa dengan output di atas ditampilkan, penerapan aplikasi berhasil.
Atur variabel lingkungan untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log dan gunakan OpenTelemetry untuk secara otomatis menginstrumen aplikasi demo.
export OTEL_PYTHON_LOG_CORRELATION=true export OTEL_SERVICE_NAME=ot-python-demo export OTEL_TRACES_EXPORTER=otlp export OTEL_METRICS_EXPORTER=none # Ganti test.py dengan nama file sebenarnya. opentelemetry-instrument python3 test.pyLihat file log. Contoh berikut menunjukkan sebuah log:
2024-06-25 10:00:55,494 INFO [app] [test.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - halo duniaDalam contoh ini, ID jejak dan ID rentang dicatat dalam log.