簡體   English   中英

Spring Boot、Sleuth、OTEL 和 Honeycomb

[英]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)的跨度交付一次。 使用跨度處理器為每個跨度添加相同的屬性。

這可以通過幾種不同的方式完成:

  • 如果使用 AutoConfigure,您可以通過系統屬性或環境變量進行設置
  • 在您的otelTracerProvider方法期間直接在資源上設置:
resource.setAttribute("environment", "${environment}");

FYI Honeycomb 擁有OTel Java SDK 和代理發行版來幫助簡化發送數據,從而減少所需的配置並設置合理的默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM