Spring Boot 3集成Micrometer Tracing如何通过配置自定义标签?
Spring Boot 3.x Micrometer Tracing 自定义Span标签最佳实践
Spring Boot 3.x不再支持Spring Sleuth,改用Micrometer Tracing结合OpenTelemetry(默认)实现链路追踪,原来Sleuth的spring.sleuth.otel.resource.attributes.*配置方式无法直接沿用,下面是几种实用的自定义Span标签方案:
1. 全局资源属性配置(全Span生效)
如果需要给所有Span统一添加全局标签(比如服务标识、环境信息),可以通过application.properties/application.yml配置,前缀改为management.tracing.resource.attributes:
# application.properties示例 management.tracing.resource.attributes.custom-key=custom-value management.tracing.resource.attributes.service.version=1.0.0 management.tracing.resource.attributes.env=prod
这些属性会被附加到所有Span的资源信息中,相当于全局统一标签。
2. 单个Span手动添加标签
针对特定业务方法或代码块的Span,可通过Tracer手动注入标签:
import io.micrometer.tracing.Tracer; import org.springframework.stereotype.Service; @Service public class OrderService { private final Tracer tracer; public OrderService(Tracer tracer) { this.tracer = tracer; } public void createOrder(String orderId) { // 获取当前活动Span Tracer.Span currentSpan = tracer.currentSpan(); if (currentSpan != null) { // 添加自定义标签 currentSpan.tag("order.id", orderId); currentSpan.tag("operation.type", "create"); } // 业务逻辑... } }
3. 注解方式快速添加标签
结合@NewSpan和@SpanTag注解,在方法级别自动生成Span并添加标签:
import io.micrometer.tracing.annotation.NewSpan; import io.micrometer.tracing.annotation.SpanTag; import org.springframework.stereotype.Service; @Service public class PaymentService { @NewSpan("process-payment") // 自定义Span名称 public void processPayment(@SpanTag("payment.amount") Double amount, @SpanTag("payment.method") String method) { // 业务逻辑... } }
调用这个方法时,生成的Span会自动带上payment.amount和payment.method两个标签,值为方法参数的实际值。
4. 全局Span处理器(统一规则标签)
如果需要对所有Span统一添加特定规则的标签(比如用户ID、请求ID),可以实现SpanProcessor接口:
import io.micrometer.tracing.Span; import io.micrometer.tracing.SpanProcessor; import org.springframework.stereotype.Component; @Component public class CustomSpanProcessor implements SpanProcessor { @Override public void onStart(Span span) { // 从请求上下文获取用户ID(示例,实际根据业务场景获取) String userId = getCurrentUserId(); if (userId != null) { span.tag("user.id", userId); } // 添加其他全局标签 span.tag("app.name", "order-service"); } @Override public void onEnd(Span span) { // Span结束时可添加的标签(比如耗时统计补充) } private String getCurrentUserId() { // 实现获取当前用户ID的逻辑,比如从ThreadLocal、SecurityContext等 return "user123"; } }
这个处理器会在每个Span启动时自动触发,添加指定标签。
注意事项
- 标签键推荐使用小写字母、数字和连字符(符合OpenTelemetry命名规范),避免特殊字符。
- 如果使用第三方链路追踪系统(比如Jaeger、Zipkin),确保对应的Exporter配置正确,能正常接收自定义标签。
内容的提问来源于stack exchange,提问作者user3792889
相关产品推荐
相关产品推荐

