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

如何让Spring Cloud Sleuth识别Spring MVC控制器参数上的@SpanTag注解

问题原因

Spring Cloud Sleuth 默认不会对普通 Spring MVC 控制器方法自动扫描参数上的@SpanTag注解,该注解的解析逻辑默认仅对标注了@NewSpan(生成新Span)或@ContinueSpan(沿用现有Span)的方法生效,所以你直接在控制器方法参数上加@SpanTag不会被识别。

解决方案

方案1:搭配@ContinueSpan注解使用

不需要生成新的Span,仅需在控制器方法上添加@ContinueSpan注解,即可触发@SpanTag的解析逻辑,沿用当前请求的根Span添加标签:

@RestController
@RequestMapping("/api/auth")
class ExampleController() {

    // 新增@ContinueSpan注解,不会生成额外Span
    @ContinueSpan
    @PostMapping("/create")
    fun createToken(
            @SpanTag(key="username",expression = "username") 
            @RequestBody 
            authTokenRequest: Request){
        // 业务逻辑
    }
}

注意:如果后续仍不生效,可检查Request类是否存在username字段的公共Getter方法,SpEL表达式需要通过Getter读取属性值。

方案2:手动注入Tracer添加标签

该方案更稳定无额外注解解析开销,直接获取当前活跃Span手动添加标签即可:

@RestController
@RequestMapping("/api/auth")
// 注入Tracer实例
class ExampleController(private val tracer: Tracer) {

    @PostMapping("/create")
    fun createToken(
            @RequestBody 
            authTokenRequest: Request){
        // 手动添加自定义标签到当前Span
        tracer.currentSpan()?.tag("username", authTokenRequest.username)
        // 业务逻辑
    }
}
注意事项
  • 确保Spring Cloud Sleuth版本在2.2.x及以上,低版本存在@SpanTag解析缺陷
  • 不要使用@NewSpan注解标注控制器方法,会额外生成不必要的子Span,导致标签被加到子Span而非请求根Span上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:36:01