前言
先前有過一篇Tracing with Opentelemetry,後續有些更新的做法,修改後留了這篇記錄。
早期Spring在用Opentelemetry的時候,似乎僅有唯一的選擇,就是使用Opentelemetry Java Agent,但的確不是每個程式都可以直接套用這種模式,例如如果想用Graalvm Native Image的方式包成執行檔,或是已經有另一個其他功能的Java Agent,那這模式就無法使用了。
所以Opentelemetry在2022年起開始了新的專案,先前一直都是以alpha的版本發佈,直到前幾天2024/07/17才發佈一個正式的版本,但程式裡的info還是有著不少alpha的標記,但至少在maven的設定裡不再是alpha了。
POM設定
dependencyManagement
<dependencyManagement>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-bom</artifactId>
<version>2.6.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependency 引用
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>
application.yaml 設定
再來可以不用透過System Environment做為設定的唯一方式,用SpringBoot裡的application.yaml也可以控制。
otel:
sdk:
disabled: false
exporter:
otlp:
endpoint: http://localhost:4318
logs:
exporter: none
metrics:
exporter: none
otel.sdk.disabled
可以決定是否要啟用
otel.logs.exporter
跟otel.metrics.exporter
設為none則是因為用jaegertracing
全家桶不支援這兩類
otel.exporter.otlp.endpoint
則可參考jaegertracing的設定,簡單一點走http就是port 4318
最後
然後就好了….
實在太簡單。
07/31 補記
後來發現似乎在logback裡沒有辦法取得MDC裡的traceId跟spanId,查了一下,將這部份補上
加入logback moc要用的libaray
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-logback-mdc-1.0</artifactId>
<version>2.6.0-alpha</version>
</dependency>
修改logback.xml
,主要是加入OpenTelemetryAppender
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Default logback configuration -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<!-- -->
<appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</appender>
<root level="INFO">
<appender-ref ref="OTEL"/>
</root>
</configuration>
所以先前在application.yaml
裡的設定就直接產生作用
logging:
pattern:
level: "%5p [${spring.application.name:},%X{trace_id:-},%X{span_id:-}]"