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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:57:51