我有一个场景,在这个场景中,Spring与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
发布于 2022-07-19 09:53:23
我不知道为什么span处理器没有被Spring捕获并添加到向跟踪器提供者注册的处理器列表中。
与环境一样,设置进程一致性值的另一种方法是将其设置为资源属性。这是更可取的,因为它是设置一次,并交付每批发送到配置后端的跨度(如蜂窝)。使用span处理器将相同的属性添加到每个span。
这可以通过几种不同的方式来完成:
otelTracerProvider方法期间直接设置资源:resource.setAttribute("environment", "${environment}");FYI蜂窝有OTel Java &代理发行版帮助简化发送数据,减少所需的配置,并设置合理的默认设置。
https://stackoverflow.com/questions/73024352
复制相似问题