[英]Spring Boot, Sleuth, OTEL, and Honeycomb
我有一個場景,我將 Spring Boot 與 OTEL 集成並運送到 Honeycomb.io。 我正在嘗試為每個跟蹤添加一個環境標簽。 我創建了一個類:
@Component
public class EnvironmentSpanProcessor implements SpanProcessor {
@Value("${ENVIRONMENT")
private String environment;
Queue<SpanData> spans = new LinkedBlockingQueue<>(50);
@Override
public void onStart(Context context, ReadWriteSpan readWriteSpan) {
readWriteSpan.setAttribute("env", environment);
}
@Override
public boolean isStartRequired() {
return false;
}
@Override
public void onEnd(ReadableSpan readableSpan) {
this.spans.add(readableSpan.toSpanData());
}
@Override
public boolean isEndRequired() {
return true;
}
}
我在這個類中設置了斷點,即使在執行器中可以看到 bean,它們也不會在啟動時命中。 我已在以下位置設置斷點:
SdkTracerProvider otelTracerProvider(SpanLimits spanLimits, ObjectProvider<List<SpanProcessor>> spanProcessors,
SpanExporterCustomizer spanExporterCustomizer, ObjectProvider<List<SpanExporter>> spanExporters,
Sampler sampler, Resource resource, SpanProcessorProvider spanProcessorProvider) {
SdkTracerProviderBuilder sdkTracerProviderBuilder = SdkTracerProvider.builder().setResource(resource)
.setSampler(sampler).setSpanLimits(spanLimits);
List<SpanProcessor> processors = spanProcessors.getIfAvailable(ArrayList::new);
processors.addAll(spanExporters.getIfAvailable(ArrayList::new).stream()
.map(e -> spanProcessorProvider.toSpanProcessor(spanExporterCustomizer.customize(e)))
.collect(Collectors.toList()));
processors.forEach(sdkTracerProviderBuilder::addSpanProcessor);
return sdkTracerProviderBuilder.build();
}
在 OtelAutoConfiguration 中,並且在啟動時也沒有看到它們觸發。
我的 pom.xml 相關部分是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-brave</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-otel-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-extension-trace-propagators</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.47.0</version>
</dependency>
我的配置來自 application.yaml
sleuth:
enabled: true
web:
additional-skip-pattern: /readiness|/liveness
client.skip-pattern: /readiness
sampler:
probability: 1.0
rate: 100
propagation:
type: OT_TRACER
otel:
config:
trace-id-ratio-based: 1.0
log.exporter.enabled: true
exporter:
otlp:
endpoint: https://api.honeycomb.io
headers:
x-honeycomb-team: ${TELEMETRY_API_KEY}
x-honeycomb-dataset: app-telemetry
sleuth-span-filter:
enabled: true
resource:
enabled: true
我得到了跟蹤,所以看起來系統本身正在工作,但是我無法添加我的 env 標簽。
先發制人地感謝@marcingrzejszczak 迄今為止對我的要點的幫助: https ://gist.github.com/fpmoles/b880ccfdef2d2138169ed398e87ec396
我不確定為什么 Spring 沒有選擇您的 span 處理器並將其添加到您向跟蹤器提供程序注冊的處理器列表中。
設置流程一致值(如環境)的另一種方法是將其設置為資源屬性。 這是更可取的,因為它設置一次,每批發送到配置的后端(例如 Honeycomb)的跨度交付一次。 使用跨度處理器為每個跨度添加相同的屬性。
這可以通過幾種不同的方式完成:
otelTracerProvider
方法期間直接在資源上設置:resource.setAttribute("environment", "${environment}");
FYI Honeycomb 擁有OTel Java SDK 和代理發行版來幫助簡化發送數據,從而減少所需的配置並設置合理的默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.