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规范,默认使用
traceparentHeader,格式为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发起请求时手动携带
traceparentHeader:
然后查看下游服务的请求日志或用抓包工具(如Wireshark)确认请求头中包含该curl -H "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" http://localhost:8080/api/orderstraceparent,且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
相关产品推荐
相关产品推荐

