news 2026/9/12 23:58:51

Jaeger Elasticsearch 指标迁移对照指南:V1 到 V2 的 Metric 命名与标签映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jaeger Elasticsearch 指标迁移对照指南:V1 到 V2 的 Metric 命名与标签映射

Jaeger Elasticsearch 指标迁移对照指南:V1 到 V2 的 Metric 命名与标签映射

【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger

本文档是 Jaeger v1 → v2 迁移系列中的 Elasticsearch 指标篇,完整罗列了 Elasticsearch 存储后端在迁移前后的指标名与标签(labels)对照关系,涵盖组合指标(Combined Metrics,V1/V2 名称完全一致)与等价指标(Equivalent Metrics,名称与标签均发生变更)两类,并给出对应源码依据,帮助监控团队在升级过程中无痛切换告警规则与 Grafana 面板。

本指南以仓库内 cmd/jaeger/docs/migration/elasticsearch-metrics.md 为核心骨架,结合 Elasticsearch 存储实现源码与指标生成脚本展开讲解。读者读完可掌握:哪些 ES 指标在 v2 中保持不变、哪些指标被重命名并扩展了标签、以及如何在迁移后继续用统一指标名构建监控面板。

为什么需要指标迁移对照表

Jaeger v2 基于 OpenTelemetry Collector 重写了整体架构,数据写入、接收与构建信息的埋点方式也随之变化:

  • 写入路径从 v1 的internal/storage/v1演进为 v2 的internal/storage/v2,但 Elasticsearch 批量写入核心仍然复用统一的写入指标模型;
  • 接收路径改为标准 OTLP receiver,拒绝 span 的计数指标从 Jaeger 自定义命名切换为 OTel 语义约定的receiver_refused_spans
  • 构建信息改为遵循 OpenTelemetry 资源语义的target_info,标签结构也向 OTel 资源属性靠拢。

仓库在 cmd/jaeger/docs/migration/ 下按存储后端分别维护了迁移对照表(all-in-one-metrics.mdbadger-metrics.mdcassandra-metrics.mdelasticsearch-metrics.mdopensearch-metrics.md),本文聚焦 Elasticsearch(OpenSearch 对照表见 opensearch-metrics.md,内容与 ES 完全一致)。这些表格并非手写维护,而是由 scripts/utils/metrics-md.py 从指标定义中自动生成的:脚本中的generate_combined_markdown_table负责产出"Combined Metrics"小节,generate_spans_markdown_table负责产出"Equivalent Metrics"小节,确保对照关系与源码始终同步。

组合指标(Combined Metrics):V1 与 V2 完全一致

ES 写入相关的 10 个指标在 v1、v2 中名称与参数(标签)完全相同,均为N/A(即无附加标签,只有指标名本身)。这意味着基于这些指标构建的写入监控面板、告警规则在迁移后无需任何修改即可继续工作。

V1 MetricV1 ParametersV2 MetricV2 Parameters
jaeger_bulk_index_attempts_totalN/Ajaeger_bulk_index_attempts_totalN/A
jaeger_bulk_index_errors_totalN/Ajaeger_bulk_index_errors_totalN/A
jaeger_bulk_index_inserts_totalN/Ajaeger_bulk_index_inserts_totalN/A
jaeger_bulk_index_latency_errN/Ajaeger_bulk_index_latency_errN/A
jaeger_bulk_index_latency_okN/Ajaeger_bulk_index_latency_okN/A
jaeger_index_create_attempts_totalN/Ajaeger_index_create_attempts_totalN/A
jaeger_index_create_errors_totalN/Ajaeger_index_create_errors_totalN/A
jaeger_index_create_inserts_totalN/Ajaeger_index_create_inserts_totalN/A
jaeger_index_create_latency_errN/Ajaeger_index_create_latency_errN/A
jaeger_index_create_latency_okN/Ajaeger_index_create_latency_okN/A

指标族的统一命名模型

这 10 个指标属于两个命名族:bulk_index(批量写入)与index_create(索引创建)。每个族内都遵循固定的"attempts / inserts / errors / latency-ok / latency-err"五件套结构,其底层定义位于 internal/storage/v1/api/spanstore/spanstoremetrics/write_metrics.go:

type WriteMetrics struct { Attempts metrics.Counter `metric:"attempts"` Inserts metrics.Counter `metric:"inserts"` Errors metrics.Counter `metric:"errors"` LatencyOk metrics.Timer `metric:"latency-ok"` LatencyErr metrics.Timer `metric:"latency-err"` }

其语义通过 Emit 方法 一次性确定:

func (t *WriteMetrics) Emit(err error, latency time.Duration) { t.Attempts.Inc(1) if err != nil { t.LatencyErr.Record(latency) t.Errors.Inc(1) } else { t.LatencyOk.Record(latency) t.Inserts.Inc(1) } }

即:每次操作先递增attempts;成功则记录latency-ok并递增inserts;失败则记录latency-err并递增errors。因此监控时通常以errors / attempts计算失败率,用latency-oklatency-err分别观察正常与异常路径的耗时分布。

bulk_index:批量写入指标

bulk_index族由 BulkIndexer 在写入_bulk时埋点。在 v2 的统一 ES 客户端实现 internal/storage/elasticsearch/esclient/bulk.go 中:

func NewBulkIndexer(client *Client, cfg BulkIndexerConfig, metricsFactory metrics.Factory, logger *zap.Logger) (*BulkIndexer, error) { b := &BulkIndexer{ metrics: spanstoremetrics.NewWriter(metricsFactory, "bulk_index"), ... } }

spanstoremetrics.NewWriter(metricsFactory, "bulk_index")会将上述五件套指标统一放入bulk_index命名空间,最终输出为jaeger_bulk_index_attempts_totaljaeger_bulk_index_errors_totaljaeger_bulk_index_inserts_totaljaeger_bulk_index_latency_errjaeger_bulk_index_latency_ok。同步写入路径 internal/storage/elasticsearch/esclient/sync_bulk.go 使用相同的"bulk_index"命名空间,因此无论采用异步批量还是同步批量,指标口径完全一致。

单元测试对指标行为做了精确断言(见 internal/storage/elasticsearch/esclient/bulk_test.go):

  • 成功场景:bulk_index.inserts = 1bulk_index.errors = 0,只出现latency-ok计时器;
  • 失败场景:bulk_index.inserts = 0bulk_index.errors = 1,只出现latency-err计时器;
  • 入队失败场景(队列已满):bulk_index.attempts = 1bulk_index.errors = 1(见 TestBulkIndexerEnqueueError)。

这从测试层面印证了表格中"V1/V2 指标名与参数一致"的结论——同一套写入指标模型在迁移前后被完整保留。

index_create:索引创建指标

index_create族对应 Elasticsearch 索引初始化/创建(如按天/按小时滚动索引的预创建)操作,同样沿用NewWriter(metricsFactory, "index_create")的五件套模型。在迁移对照表中该族 5 个指标的 V1/V2 名称与参数也保持完全一致(N/A),因此索引创建相关的告警(如jaeger_index_create_errors_total持续增长)可以直接沿用。

等价指标(Equivalent Metrics):名称与标签均发生变更

以下 2 个指标在 v1 与 v2 中名称不同、标签集合也不同,迁移时必须同步更新告警表达式与面板查询:

V1 MetricV1 ParametersV2 MetricV2 Parameters
jaeger_collector_spans_rejected_totaldebug, format, svc, transportreceiver_refused_spansreceiver, service_instance_id, service_name, service_version, transport
jaeger_build_infobuild_date, revision, versiontarget_infoservice_instance_id, service_name, service_version

拒绝 span 计数:jaeger_collector_spans_rejected_total → receiver_refused_spans

v1 中拒绝 span 的计数由 Collector 自定义埋点jaeger_collector_spans_rejected_total上报,携带标签debug(调试开关)、format(数据格式,如 jaeger/otlp)、svc(服务名)、transport(传输协议)。

v2 中 Jaeger 以标准 OTel Collector 组件形态运行,该指标由接收器按 OpenTelemetry 语义约定上报为receiver_refused_spans,标签集变为:

  • receiver:接收器名称(如 otlp、jaeger 等);
  • service_instance_id/service_name/service_version:OTel 资源属性,标识上报实例;
  • transport:传输协议(标签名保留,含义与 v1 一致)。

这一命名在 Jaeger 的监控资产中已被采用,例如 monitoring/jaeger-mixin/dashboard-for-grafana.json 与生成代码 monitoring/jaeger-mixin/generate/main.go 中均使用receiver_refused_spans构建接收拒绝率的监控表达式。迁移后若需按服务维度拆分告警,应改用service_name而非 v1 的svc

构建信息:jaeger_build_info → target_info

v1 的jaeger_build_info携带build_date(构建日期)、revision(Git 提交)、version(版本号)三个标签,用于在 Prometheus 中标识运行中的二进制版本。

v2 中该信息通过 OTel 资源属性导出为target_info,标签仅保留服务身份三要素service_instance_idservice_nameservice_version。迁移后查询运行版本时,不再直接看到version/revision标签,而需要通过service_name+service_version组合定位实例;若面板依赖jaeger_build_info{version="..."}做版本告警或展示,需改写为对target_info的查询。

迁移落地建议

  1. 写入与索引类指标零改动jaeger_bulk_index_*jaeger_index_create_*共 10 个指标直接沿用,现有面板与告警无需修改;可结合errors/attempts比率与latency-err观察写入健康度。
  2. 接收拒绝类指标改写:将jaeger_collector_spans_rejected_total相关查询/告警替换为receiver_refused_spans,并按需在标签receiverservice_nametransport上做分组与过滤。
  3. 版本信息类指标改写:将jaeger_build_info相关查询替换为target_info,注意标签从version/revision变为service_version/service_name的差异。
  4. 保持文档同步:若后续指标定义发生变更,可通过 scripts/utils/metrics-md.py 重新生成 elasticsearch-metrics.md 对照表,确保监控团队始终拿到与源码一致的迁移依据。

小结

Elasticsearch 后端的指标迁移可以概括为"写入路径不变、接收与元信息标准化":bulk_indexindex_create两个指标族的 10 个指标在 v1/v2 中名称与标签完全一致,迁移成本为零;而receiver_refused_spanstarget_info两个 OTel 标准化指标的引入,则要求监控侧同步更新查询与告警。结合 bulk.go、write_metrics.go 与 bulk_test.go 中的实现与测试,可以确认这套对照关系与运行时代码保持一致,可放心作为迁移核对清单使用。

【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 23:56:14

PyQt5+OpenCV打造监控视频播放器:UI转换、帧率控制与异常处理

简介:基于Python实现本地视频播放的完整示例项目,面向需要快速掌握PyQt5/PySide2桌面界面开发与OpenCV视频处理的Python学习者与开发者。项目使用Qt Designer可视化设计主界面,生成兼容的.ui布局文件,再通过OpenCV的VideoCapture读…

作者头像 李华
网站建设 2026/9/12 23:54:06

Remotion 如何为视频添加 AI 自动生成的字幕?

Remotion 如何为视频添加 AI 自动生成的字幕? 【免费下载链接】remotion 🎥 Make videos programmatically with React 项目地址: https://gitcode.com/GitHub_Trending/re/remotion 如果你的 Remotion 项目中有一段带人声的视频,想通…

作者头像 李华
网站建设 2026/9/12 23:52:05

Arm-2D:面向Cortex-M的确定性2D图形加速框架

1. 为什么在Cortex-M上做2D图形加速,Arm-2D不是“锦上添花”,而是“生死线” 你有没有遇到过这样的场景:在一款带320240 OLED屏的工业HMI设备上,客户突然要求增加一个动态波形图——不是静态图标,是每50ms刷新一次、带…

作者头像 李华
网站建设 2026/9/12 23:50:55

极空间NAS自建Typecho博客:从云服务器迁移到Docker部署实践

1. 为什么我把博客从云服务器搬回了家里的极空间 NAS前阵子我的云服务器又到期了,续费价格直接翻了一倍。这台服务器上只跑着一个 Typecho 博客,平时流量不大,但我每年要为一台几乎闲置的机器付几百块续费。想想觉得挺不值的,干脆…

作者头像 李华
网站建设 2026/9/12 23:44:47

无限画布百万节点性能压测:从卡顿到流畅的选型指南

前一阵帮一个做工业流程可视化的团队做技术选型,他们原本在某款开源无限画布上搭原型,节点数刚过八千就开始明显掉帧,拖拽时连线像橡皮筋一样拉丝,客户来验收那天直接在框选操作时卡了十几秒。后来换了策略,我先帮他们…

作者头像 李华