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

如何为@Observed注解方法的追踪信息添加参数值

在Zipkin追踪中添加@Observed方法的参数值

要给标注了@Observed的方法在Zipkin追踪信息里添加参数值,需要自定义ObservationConvention来扩展默认的追踪逻辑,具体步骤如下:

1. 自定义MethodObservationConvention

创建一个实现MethodObservationConvention的类,重写方法来将参数值添加到Span的标签中:

import io.micrometer.observation.Observation
import io.micrometer.observation.annotation.MethodObservationContext
import io.micrometer.observation.annotation.MethodObservationConvention

class FooObservationConvention : MethodObservationConvention {
    // 匹配@Observed注解的name和contextualName
    override fun getName(): String = "foo"
    override fun getContextualName(): String = "foo"

    // 只对目标方法生效
    override fun supportsContext(context: Observation.Context): Boolean {
        return context is MethodObservationContext && context.method.name == "foo"
    }

    // 添加参数到低基数标签(如果是高基数值,改用getHighCardinalityKeyValues)
    override fun getLowCardinalityKeyValues(context: MethodObservationContext): MutableList<Observation.KeyValue> {
        val keyValues = mutableListOf<Observation.KeyValue>()
        val args = context.args
        
        // 按参数名添加标签(需确保编译时保留参数名)
        context.method.parameters.forEachIndexed { index, param ->
            val argValue = args[index]?.toString() ?: "null"
            keyValues.add(Observation.KeyValue.of("param.${param.name}", argValue))
        }
        
        return keyValues
    }
}

2. 注册自定义Convention

将上面的类注册为Spring Bean,让Micrometer自动识别并使用:

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class ObservationConfig {
    @Bean
    fun fooObservationConvention(): FooObservationConvention {
        return FooObservationConvention()
    }
}

3. 关键配置与注意事项

  • 保留参数名:如果要使用参数名而非索引,需在Kotlin编译配置中开启参数名保留,在build.gradle.kts中添加:
    tasks.withType<KotlinCompile> {
        kotlinOptions.javaParameters = true
        kotlinOptions.jvmTarget = "17" // 替换为你的JDK版本
    }
    
  • 敏感信息脱敏:如果参数包含密码、手机号等敏感数据,必须先做脱敏处理再添加到标签,避免信息泄露。
  • 高基数值处理:如果参数值是唯一标识(如用户ID、订单号),不要放在低基数标签里,改用getHighCardinalityKeyValues方法,防止Zipkin存储压力过大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:22:40