如何为@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
相关产品推荐
相关产品推荐

