代表性面试主题

数据面试:如何设计 OpenTelemetry 指数直方图管道并控制成本?

数据困难
Offer.cc 编辑团队发布 更新

题干

你要把高动态范围延迟指标从 OpenTelemetry 发送到 Prometheus。如何选择指数直方图、保证合并正确,并避免存储和查询成本失控?

题目

为多区域服务设计延迟指标管道:SDK 产生 OpenTelemetry ExponentialHistogram,Collector 进行聚合,后端写入 Prometheus 原生直方图。请说明数据语义、降级和成本控制。

场景与约束

延迟范围从微秒到数分钟,服务有高基数标签。部分后端只支持经典桶,网络可能丢批,查询需要 p50、p95 和跨区域聚合。指标不能暴露租户隐私,也不能无限增加时间序列。

核心考点

考察指数边界、scale、正负桶、zero count、count/sum 与 temporality 的理解,以及跨进程合并的可交换性。OpenTelemetry 指数直方图用指数公式压缩桶边界,在相近大小下覆盖高动态范围;Prometheus 原生直方图可映射该模型,但转换和查询必须保留语义。

参考解法

SDK 只记录业务维度允许的标签和原始观测,Collector 按服务、区域和固定时间窗合并同 schema 数据。对不支持原生直方图的后端,显式转换为经典桶并记录精度损失。限制 scale、桶数、标签集合和每租户预算;超限时降采样或拒绝新标签,而不是静默截断。

关键细节

合并前检查 temporality、aggregation temporality、schema、正负桶和时间范围;不同 schema 不能直接拼接。查询层对 p95 使用直方图分位数近似,并在面板显示样本量、误差和降级标记。对丢批使用批序号和重试,避免把同一批重复计数。

常见误区

把指数桶当成精确分位数;把不同 temporality 相加;无界标签直接进入维度;将所有数据转换成最细 scale;忽略负值、零桶和重试重复;只看存储量不看查询放大。

评估标准

优秀答案能画出 SDK、Collector、远程写入、查询和预算控制边界,给出合并不变量、降级策略和 p95 误差说明。一般答案只说“用 histogram_quantile”,没有解释数据模型和成本。

追问

为什么不能直接合并不同 schema 的指数直方图?

桶索引与边界映射不同,直接相加会把观测放进错误区间;应先按规范重映射到兼容 schema,并记录精度变化。

如何处理累计 temporality 与 delta temporality 混用?

在 Collector 明确转换并保存每个流的起点与上次值;缺少连续性时丢弃不完整窗口或标记缺口,不能把累计值当 delta 重复相加。

什么时候应退回经典直方图?

当下游不支持原生格式、合规要求固定桶或查询生态无法解释指数桶时,选择有限经典桶并公开误差与成本,而不是让消费者猜测转换规则。

公开来源

同类题目