You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry:如何仅为target info metric添加属性且不关联Spans?

OpenTelemetry 属性配置问题解答

1. 仅为target info metric添加属性,不附加到Spans中

通过Resource添加的属性会全局作用于所有Metrics和Traces,因此要实现仅给target info metric加专属属性,需要直接在创建该metric时传入属性,而非修改全局Resource。

示例代码:

// 初始化OpenTelemetry SDK,无需通过ResourceCustomizer添加版本属性
val openTelemetry = AutoConfiguredOpenTelemetrySdk.builder.build().getOpenTelemetry

// 获取Meter并创建target info metric,直接传入专属属性
val meter = openTelemetry.getMeter("your-meter-namespace")
val targetInfoMetric = meter.gaugeBuilder("target")
  .setDescription("Target info metric with version attributes")
  .setUnit("1")
  .buildWithCallback(observableMeasurement => {
    observableMeasurement.record(1.0, Attributes.of(
      AttributeKey.stringKey("version.workflow"), classOf[Workflow].getPackage.getImplementationVersion,
      AttributeKey.stringKey("version.stream"), classOf[Stream].getPackage.getImplementationVersion,
      AttributeKey.stringKey("version.kafka"), org.apache.kafka.common.utils.AppInfoParser.getVersion
    ))
  })

这样配置后,这些版本属性只会绑定到target这个info metric上,不会出现在任何Span中。

2. 仅将指定属性添加到target info metric和Spans中

可以拆分逻辑分别处理:通过自定义SpanProcessor为所有Span添加指定属性,同时在创建target info metric时也注入这些属性,避免全局Resource影响其他Metrics。

示例代码:

// 定义需要同时附加到Span和target metric的共享属性
val sharedAttributes = Attributes.of(
  AttributeKey.stringKey("version.workflow"), classOf[Workflow].getPackage.getImplementationVersion,
  AttributeKey.stringKey("version.stream"), classOf[Stream].getPackage.getImplementationVersion
)

// 初始化SDK,添加自定义SpanProcessor为所有Span注入共享属性
val openTelemetry = AutoConfiguredOpenTelemetrySdk.builder
  .addSpanProcessor(new SpanProcessor {
    override def onStart(parentContext: Context, span: ReadWriteSpan): Unit = {
      span.setAllAttributes(sharedAttributes)
    }

    override def onEnd(span: ReadOnlySpan): Unit = {}
    override def isStartRequired: Boolean = true
    override def isEndRequired: Boolean = false
  })
  .build()
  .getOpenTelemetry

// 创建target info metric,注入共享属性+专属属性(如需要)
val meter = openTelemetry.getMeter("your-meter-namespace")
val targetInfoMetric = meter.gaugeBuilder("target")
  .setDescription("Target info metric with shared attributes")
  .setUnit("1")
  .buildWithCallback(observableMeasurement => {
    // 合并共享属性与metric专属属性(示例中添加kafka版本)
    val metricAttrs = sharedAttributes.toBuilder
      .put(AttributeKey.stringKey("version.kafka"), org.apache.kafka.common.utils.AppInfoParser.getVersion)
      .build()
    observableMeasurement.record(1.0, metricAttrs)
  })

说明:

  • 自定义SpanProcessor仅在Span启动时注入指定属性,不会影响其他Metrics
  • 创建target metric时可灵活组合共享属性与专属属性,满足不同需求

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:00:02