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 - 创建
targetmetric时可灵活组合共享属性与专属属性,满足不同需求
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

