微服务可观测性面试题:OpenTelemetry、Trace、采样与SLO
本页只放标准回答和原理跳转。完整数据链、Demo与Runbook见微服务可观测性主线。
高频问题
| 问题 | 标准回答 | 原理页 |
|---|---|---|
| 监控和可观测性区别 | 监控用已知指标发现已知异常;可观测性提供足够上下文探索未知问题。Metrics发现范围,Trace定位链路,Logs解释细节,Profiles定位资源热点。 | 信号 |
| OpenTelemetry是什么 | 它是遥测规范、API、SDK、语义约定、协议和Collector生态,不是固定存储数据库。 | 架构 |
| API和SDK区别 | API供库和业务创建遥测;SDK实现采样、聚合、处理和导出。只有API没有SDK时可能不会导出。 | 组件关系 |
| 一次HTTP Trace怎样形成 | 入口提取或创建Context并创建Server Span,客户端创建Client Span并注入traceparent,下游提取后创建子Server Span,各Span结束后异步导出。 | 请求流程 |
| traceparent四段是什么 | version、32位十六进制trace-id、16位parent-id和trace-flags;trace-id和parent-id不能全0。 | Trace Context |
| tracestate和Baggage区别 | tracestate承载追踪厂商受限状态;Baggage传播应用键值。Baggage不会自动成为Span属性,也不能放敏感或无限业务数据。 | Trace Context、Baggage |
| 异步线程为什么断链 | 任务在线程池其他线程执行,ThreadLocal Context不会天然传播;要在提交时捕获、执行时恢复、结束后清理。 | 异步传播 |
| MDC为什么会串链 | MDC通常基于ThreadLocal,线程池线程会复用。如果任务结束后没有在finally清理或恢复旧上下文,下一个请求可能复用上一个请求的traceId、userId或tenantId,造成日志串链甚至用户串号排查困难。 | 线程池上下文Demo |
| Span Parent和Span Link区别 | Parent表达主要层级;Link表达与一个或多个其他Span的因果关联,适合批量消费、多来源和异步处理。 | MQ追踪 |
| Head Sampling是什么 | Trace开始时决定,成本可控但不知道最终是否错误,可能漏掉关键故障。 | 采样 |
| Tail Sampling是什么 | Collector收到Trace后按错误、延迟和属性决定保留,诊断价值高,但需要缓存、同Trace路由和更多资源。 | 采样 |
| 采样导致关键错误查不到怎么办 | 先用Metrics和日志确认事故存在,再查Head Sampling、Parent-based sampled位、业务错误是否标记Span、SDK队列、Collector Tail Sampling、Exporter和后端写入。关键错误不能只靠Trace保留,应把错误率、业务失败码、审计日志和事实源作为稳定证据。 | 采样决策链 |
| Trace未采样会不会没有指标 | 不应该。Metrics负责全量聚合,Trace负责抽样解释,二者应是独立但可关联的信号。 | 采样边界 |
| traceId、requestId、幂等键有什么区别 | traceId用于观测一条调用链,requestId用于一次入口请求或一次尝试,幂等键表示一次业务意图且跨重试保持不变。traceId和requestId都不能直接替代幂等键;写请求去重要靠唯一约束、幂等表或业务状态机。 | ID边界 |
| RT、P95和P99是什么 | RT是Response Time,表示一次请求响应耗时,但要说明观测层级。P95/P99是百分位延迟,把请求耗时排序后,95%或99%位置的值就是对应分位。它们不是平均值,也不是最大值;平均RT正常但P99高,说明少量尾部请求很慢,常见于慢实例、锁等待、GC、连接池等待、热点参数或下游长尾。 | RT与百分位延迟 |
| Counter、Gauge、Histogram区别 | Counter累计只增量,Gauge表示当前值,Histogram累计值分布并支持聚合分位数估算。 | Metrics |
| Exemplar是什么 | 在Histogram样本和具体Trace之间保存少量关联,让延迟尖峰可跳到代表性Trace,避免traceId成为Metric Label。 | Exemplar |
| 为什么不能把orderId做Label | 时间序列数量是标签取值组合乘积,百万orderId会造成内存、索引、存储和查询爆炸。 | 高基数 |
| Collector Pipeline怎样走 | Receiver接收,Processor限内存、补资源、过滤、批处理或采样,Exporter写后端;失败使用有界队列和退避。 | Collector |
| Collector挂了能阻塞业务吗 | 不应。应用Exporter应异步有界,必要时丢遥测并记录Dropped指标,也不能让观测故障拖垮核心交易。 | Collector边界 |
| RED和USE区别 | RED面向请求:Rate、Errors、Duration;USE面向资源:Utilization、Saturation、Errors。 | 方法 |
| SLI、SLO、SLA区别 | SLI是测量,SLO是内部目标,SLA是带外部承诺的协议;Error Budget是允许不满足SLO的空间。 | SLO |
| Burn Rate是什么 | 实际错误比例除以允许错误比例,表示错误预算消耗速度;多窗口告警兼顾快速发现和持续确认。 | Burn Rate |
| Sleuth与Boot 3怎样迁移 | Boot 2存量常见Sleuth/Brave;Boot 3主线是Micrometer Observation/Tracing并桥接OTel或Brave,要校验传播格式、采样、MDC和Exporter。 | Java基线 |
| Trace断链怎么排查 | 先确定最后一个有Span的服务和第一个缺失的调用边,再逐层查Gateway入口、Header转发、Feign/RestTemplate/WebClient、gRPC/Dubbo拦截器、线程池、Reactor、MQ消息属性、SDK导出、Collector和后端查询条件。最后用Metrics、日志和业务事实交叉验证,不能只看Trace平台。 | Trace断链深度排查 |
场景题:Trace平台没有数据是否说明请求没发生
不能。可能是未采样、Context未传播、SDK未注册、Batch未刷新、Exporter失败、Collector拒绝、Tail Sampling丢弃、后端写入失败或查询条件错误。应从应用生成、SDK队列、Collector accepted/dropped、Exporter和后端逐层取证,并用Metrics、日志和业务事实交叉证明。核心交易是否发生要看数据库状态机、幂等表、消息表、审计日志和对账结果,不能把Trace当事实源。
项目回答模板
我们用W3C Trace Context传播同步调用,MQ消费按单消息Parent或批量Span Link关联;Boot 3使用Micrometer Observation/Tracing桥接OpenTelemetry。Metrics按规范化route、version和状态聚合,订单号只进脱敏日志和Trace,P99 Histogram通过Exemplar跳Trace。Collector使用内存限制、批处理、有界队列和Tail Sampling,自身监控accepted、dropped与export失败。告警基于业务SLI、SLO和多窗口Burn Rate,而不是只看CPU。
本章小结
可观测性面试不能只背Trace ID。应讲清信号语义、上下文传播、采样、指标基数、Collector数据链和SLO告警。
