已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 Spring Boot 3 + JDK 17 + Kafka 3.5(4 分区)+ OpenTelemetry 1.32(Java Agent 接入)+ 自研线程池。业务链路:HTTP 入口 → 同步处理 → 发 Kafka → 消费端落库 + 线程池并发更新 3 张关联表。整体 P50 在 40ms 左右,但每周都有 1–2 次 P99 飙到 600ms+,且告警里只能看到入口 span 耗时,消费端和线程池里的子任务完全没有 span,等于排查时只能盲猜。
【现象】
【已尝试】
MDC.put 手动透传 + ThreadLocal 包装线程池的 TaskDecorator:解决了 MDC 日志,但 OTel 的 Context 还是丢;-Dotel.instrumentation.kafka.enabled=true 打开:入口→Kafka 这段有 span,但消费端内部线程池里依然没有;@KafkaListener 方法开头手动 Context.current().withSpan(...) 再 runWith:能挂上 span,但 3 个并发子任务的 span 父子关系还是错的(挂到了同一个父下,看不出并行耗时)。【期望得到的答案形态】
@KafkaListener 入口 → 自研线程池 → 子任务,OTel Context 怎么正确传播(包括 ContextStorage、Context.run、TaskDecorator 的正确写法),最好带「串号」问题的修复点;