微服务架构下排查一次跨服务慢请求,靠逐台机器看日志几乎不可能。OpenTelemetry(OTel)是目前事实标准的可观测性标准,统一了链路、指标、日志三类信号的采集协议,后端服务接入一次,数据可同时送往Jaeger、Prometheus、Grafana等后端。本文从SDK接入、上下文传播到采样策略,给出Java服务落地OTel的完整方案。
为什么用OpenTelemetry统一可观测性
早年的做法是每家公司一套链路SDK,或同时接入多个链路平台,埋点代码重复且互相冲突。OTel把链路(Trace)、指标(Metric)、日志(Log)三类信号统一到一套API和协议(OTLP),语言SDK覆盖Java、Go、Python等主流后端栈,Agent或SDK二选一接入,数据格式一致,切换后端平台不用改业务代码。
Java服务接入:SDK初始化与自动埋点
Spring Boot项目推荐用Java Agent方式接入,零代码改动自动埋点HTTP、数据库、消息队列调用:
java -javaagent:opentelemetry-javaagent.jar \
-Dotel.service.name=order-service \
-Dotel.exporter.otlp.endpoint=http://otel-collector:4317 \
-Dotel.metrics.exporter=otlp \
-Dotel.logs.exporter=otlp \
-jar order-service.jar
Agent自动把Spring MVC、JDBC、RestTemplate等组件纳入链路。需要自定义埋点的场景用SDK API手动创建Span:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
@Autowired
private Tracer tracer;
public void processOrder(Order order) {
Span span = tracer.spanBuilder("order.process").startSpan();
span.setAttribute("order.id", order.getId());
try {
// 业务逻辑
} finally {
span.end();
}
}
自定义Span用于标识Agent识别不出的业务边界,比如异步任务、批处理步骤。
上下文传播:跨服务链路如何串联
链路串联靠Trace Context(trace-id + span-id + flags)在服务间传递。HTTP场景通过W3C traceparent请求头传递,Agent自动处理;异步消息场景(Kafka、RabbitMQ)需要手动把上下文写入消息头:
import io.opentelemetry.context.Context;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
// 发送方:把当前上下文注入消息头
Map<String, String> headers = new HashMap<>();
W3CTraceContextPropagator.getInstance().inject(
Context.current(), headers, Map::put);
// 消费端:从消息头提取上下文
Context extracted = W3CTraceContextPropagator.getInstance().extract(
Context.current(), headers, Map::get);
不注入则消费端链路线索丢失,消息驱动场景排查问题只能靠日志拼凑。
采样策略:数据完整性与成本平衡
全量采集高并发系统成本不可控,采样是必须的。OTel支持三种策略:头部采样(进入时按比例决定整条链路是否采样)、尾部采样(链路结束按规则决定,可保留慢请求)、概率采样(按百分比)。生产推荐组合:
# collector配置:尾部采样 + 兜底比例
processors:
tail_sampling:
policies:
- name: slow-request
type: latency
latency:
threshold_ms: 500
- name: error-request
type: status_code
status_code:
status_codes: [ERROR]
- name: default-sample
type: probabilistic
probabilistic:
sampling_percentage: 20
慢请求和错误请求100%保留,其余按20%比例采样。数据量仍大时可在网关层再降采样率。
告警与排障联动
链路数据与指标打通后,排障路径是:Prometheus告警发现错误率升高,点击看板跳转到对应链路,定位慢Span的服务与阶段,再结合日志样本确认根因。落地时把trace-id写入业务日志,日志平台按trace-id聚合,实现全链路日志回放。
接入注意事项
SDK/Agent版本与后端平台版本对齐,避免字段不兼容。生产环境关闭控制台打印与过短的导出间隔,避免额外IO开销。跨公网调用对链路数据脱敏,不要在Span属性中写入身份证、手机号等敏感字段。采样率调整基于量级数据评估,链路数据保留周期建议30天以上,用于周期性的容量与性能复盘。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/hou-duan-kai-fa-shi-zhan-opentelemetry-fen-bu-shi-lian-lu/