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

Spring Boot可观测性:特定端点追踪、Trace ID传递及Graylog替代问题

Spring Boot 3 可观测性相关问题解答

1. 是否可以仅为特定端点启用追踪功能?

可以通过多种方式实现针对性的端点追踪:

  • 基于OpenTelemetry的配置规则:先全局关闭采样,再指定要追踪的端点。在application.properties中添加:
    management.tracing.sampling.probability=0.0
    otel.trace.include-urls=/api/orders/**,/api/payments/**
    
    这样只有匹配include-urls的端点会被追踪,其余端点不生成Span。
  • 自定义拦截器控制追踪:实现HandlerInterceptor,在preHandle方法中判断请求路径,仅对目标端点手动启动追踪:
    @Component
    public class TraceEndpointInterceptor implements HandlerInterceptor {
        private final Tracer tracer;
    
        public TraceEndpointInterceptor(Tracer tracer) {
            this.tracer = tracer;
        }
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String path = request.getRequestURI();
            if (path.startsWith("/api/orders/")) {
                tracer.spanBuilder("custom-endpoint-trace").startSpan().makeCurrent();
            }
            return true;
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            String path = request.getRequestURI();
            if (path.startsWith("/api/orders/")) {
                tracer.currentSpan().end();
            }
        }
    }
    
  • Spring AOP切面:针对特定Controller的方法创建切面,在方法执行前后管理Span的生命周期。

2. 服务间的Trace ID是否通过HTTP Header传递?如何验证该传递过程?

  • Trace ID会通过HTTP Header传递,遵循W3C Trace Context规范,默认使用traceparent Header,格式为00-<trace-id>-<span-id>-<trace-flags>,其中<trace-id>就是跨服务共享的追踪ID。

验证方式:

  • 日志验证:在日志格式中加入traceId字段,比如在logback-spring.xml中配置:
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %X{traceId}%n</pattern>
    
    跨服务调用时,查看上下游服务的日志,同一链路的请求会输出相同的traceId。
  • 抓包验证:用curl发起请求时手动携带traceparent Header:
    curl -H "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" http://localhost:8080/api/orders
    
    然后查看下游服务的请求日志或用抓包工具(如Wireshark)确认请求头中包含该traceparent,且trace-id一致。
  • Tempo面板验证:在Grafana的Tempo中搜索该traceId,可以看到跨服务的Span链路,所有节点共享同一个traceId。

3. 是否可以使用Graylog替代Loki?是否有相关示例可供参考?

完全可以用Graylog替代Loki,二者都是日志聚合工具,适配Spring Boot的配置示例如下:

  • 添加依赖:如果使用Logback作为日志框架,引入GELF格式的日志依赖(Graylog支持GELF协议):
    <dependency>
        <groupId>de.siegmar</groupId>
        <artifactId>logback-gelf</artifactId>
        <version>3.0.0</version>
    </dependency>
    
  • 配置Logback输出到Graylog:在logback-spring.xml中添加GELF Appender:
    <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfUdpAppender">
        <graylogHost>your-graylog-host</graylogHost>
        <graylogPort>12201</graylogPort>
        <encoder class="de.siegmar.logbackgelf.GelfEncoder">
            <includeMdcData>true</includeMdcData>
            <includeLevelName>true</includeLevelName>
            <staticField>app_name:spring-boot-service</staticField>
            <staticField>environment:production</staticField>
        </encoder>
    </appender>
    
    <root level="info">
        <appender-ref ref="GRAYLOG"/>
    </root>
    
  • 关联Trace ID:确保MDC中包含traceId,Spring Boot 3的可观测性自动配置会将traceId放入MDC,Graylog会自动读取MDC数据,这样就能通过traceId检索同一链路的所有日志。
  • Graylog端配置:在Graylog中创建一个GELF UDP输入,端口与配置中的graylogPort一致,然后创建索引集和仪表板,实现日志的检索、分析和可视化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:20:25