实战指南:从 RED 指标采集到查询 API 全解析)
Jaeger Service Performance MonitoringSPM实战指南从 RED 指标采集到查询 API 全解析【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaegerService Performance MonitoringSPM是 Jaeger 的 opt-in可选启用特性它基于链路 span 数据派生 Request、Error 和 DurationRED指标并按 service 与 operation 维度聚合通过 jaeger-query 暴露的指标查询 API 以及 UI 的 Monitor 标签页以图表形式可视化。本文以 docker-compose/monitor/README.md 为骨架结合仓库中的真实配置与源码完整讲解如何用 docker compose 一键拉起 SPM 开发/演示环境、如何通过两种 metrics backendPrometheus 与 Elasticsearch/OpenSearch 直查落地 RED 指标、如何用 tracegen 产生模拟流量、如何调用/api/metrics/*HTTP API以及无 metrics backend 时的行为与排查要点。读完本文你将能够独立搭建 SPM 环境、读懂配置细节并熟练使用其指标查询接口。SPM 是什么span 数据驱动的 RED 指标SPMService Performance Monitoring的核心思想是不再依赖额外的埋点或业务代码直接从已采集的 span 数据中派生出服务级指标。这些指标按 service name 和 operation 分组包含三类经典 RED 语义Request请求量每秒调用次数calls/secError错误率每秒错误次数或错误占比Duration延迟按分位数如 P95计算的延迟分布。在 Jaeger 中SPM 指标既可以通过 jaeger-query 暴露的编程式 API 获取也可以通过 UI 中的 Monitor 标签页以图形方式查看。该特性默认关闭opt-in需要显式配置 metrics storage 才会启用。SPM 支持两种 metrics backend 实现方案README 中两种方案均给出对应 docker compose 文件Prometheus 作为指标后端指标由 OpenTelemetry Collector 计算并聚合到 Prometheusjaeger-query 再向 Prometheus 查询直接从 trace 存储Elasticsearch/OpenSearch查询指标直接从 ES/OS 中存储的 trace 数据计算省去了 Prometheus 这类独立指标后端。组件组成SPM 环境由以下组件构成公共组件MicroSim用于模拟 trace 的程序本文仅作背景说明不输出外部链接展开Jaeger单容器镜像内的完整 Jaeger 技术栈all-in-oneOpenTelemetry Collector负责接收 Jaeger span、转发给 Jaeger并从 span 数据中聚合出指标。Prometheus 方案下其指标聚合能力依赖 spanmetrics connector。Prometheus 方案额外Prometheus 作为指标采集与查询引擎抓取 Collector 计算出的指标并为 Jaeger All-in-one 提供指标查询 API。ES/OS 直查方案额外Elasticsearch/OpenSearch 作为 Jaeger 的 trace 存储后端在本配置中同时承担 trace 存储与指标直查双重职责。架构与数据流Prometheus 方案README 用 mermaid 流程图描述了 Prometheus 方案下各组件的关系其数据流如下应用内的 OTel SDK 通过 OTLP 协议把 traces 发送到 OTel CollectorCollector 的 traces pipeline 依次经过 batch processor随后同时导出到两处spanmetrics connector生成 span 指标与traces exporter转发原始 tracespanmetrics connector 产生的指标进入 metrics/spanmetrics pipeline经 Prometheus exporter 暴露在:8889端口供 Prometheus 抓取Prometheus 存储指标并提供查询 APIJaeger 接收 traces 后写入存储同时 jaeger-query 从 Prometheus 查询 RED 指标供 Jaeger UI 的 Monitor 标签页展示。快速开始一键拉起 SPM 环境README 提供了三种开箱即用的启动方式均使用 Jaeger 与 OpenTelemetry 的最新镜像标签。Option 1Prometheus 作为指标后端docker compose up默认 compose 文件即 docker-compose.yml它会启动 jaeger、microsim流量模拟器、prometheus、grafana 四个服务。从 docker-compose.yml 可以看到关键细节Jaeger 容器挂载了 cmd/jaeger/config-spm.yaml 作为配置文件--config /etc/jaeger/config.yml并暴露 16686UI、16687内部管理、8888jaeger 自身 prometheus 指标、8889span 指标导出、4317/4318OTLP gRPC/HTTP端口Jaeger 在 backend 网络中拥有别名spm_metrics_source这是 prometheus.yml 中抓取目标使用的主机名microsim 以-d 24h -s 500ms运行即持续 24 小时、每 500ms 生成一条模拟 trace并通过OTEL_EXPORTER_OTLP_TRACES_ENDPOINThttp://jaeger:4318/v1/traces上报Grafana 使用 monitoring/jaeger-mixin/dashboard-for-grafana.json 预置了 Jaeger mixin 仪表盘采用原生timeseries面板兼容 Grafana 12且开启匿名访问GF_AUTH_ANONYMOUS_ENABLEDtrue无需登录。其中 Jaeger 实际使用的 SPM 配置 cmd/jaeger/config-spm.yaml 值得展开它声明了jaeger_query扩展的 storage 同时挂载traces: some_storage与metrics: some_metrics_storagejaeger_storage扩展定义了内存 trace 后端max_traces: 100000以及指向http://prometheus:9090的 Prometheus 指标后端并开启normalize_calls: true与normalize_duration: true用于指标归一化traces pipeline 将数据同时导出到jaeger_storage_exporter与spanmetricsconnectormetrics/spanmetrics pipeline 则由 Prometheus exporter 暴露在0.0.0.0:8889。Option 2直接从 trace 存储查询ES/OSdocker compose -f docker-compose-elasticsearch.yml up docker compose -f docker-compose-opensearch.yml updocker-compose-elasticsearch.yml 使用单节点 Elasticsearch 9.5.3通过健康检查curl -f http://localhost:9200保证 jaeger 在 ES 就绪后才启动对应的 Jaeger 配置为 cmd/jaeger/config-spm-elasticsearch.yaml其中jaeger_query.storage的traces与metrics都指向同一个elasticsearch_trace_storage后端通过 YAML 锚点elasticsearch_config复用同一段 ES 配置。docker-compose-opensearch.yml 使用单节点 OpenSearch 3.8.0DISABLE_SECURITY_PLUGINtrue由于 3.8 起即使禁用插件也会运行审计日志、拖慢批量写入因此直接不安装安全插件Jaeger 配置为 cmd/jaeger/config-spm-opensearch.yaml同样将 traces 与 metrics 指向同一个opensearch_trace_storage后端。这种方案下 metrics 由 jaeger-query 在查询时直接从 trace 数据计算无需 Prometheus 参与也没有 spanmetrics connector两个配置的 pipelines 均只有jaeger_storage_exporter。使用提示与镜像清理留出数据积累时间让应用运行几分钟确保有足够的时间序列数据可供绘图查看 UI打开 Jaeger UI http://localhost:16686/ 进入 Monitor 标签页在下拉框选择redis服务可看到多个 endpoint 的指标Prometheus 原始指标Prometheus 方案下可在 http://localhost:9090/query 直接查询原始指标例如traces_span_metrics_calls_totalREADME 给出了该指标 5 分钟范围的示例查询Grafanahttp://localhost:3000 预载 Jaeger mixin 仪表盘无需登录使用原生timeseries面板、兼容 Grafana 12。警告compose 文件使用 Jaeger 及其他组件的latest版本。如果本地 Docker 仓库已存在旧版本可能仍被打上latest标签建议先删除旧镜像以保证行为一致make clean-allmake clean-all在 Makefile 中会执行docker system prune -f并强制删除jaegertracing/jaeger:dev、jaegertracing/jaeger:latest、otel/opentelemetry-collector-contrib:latest、prom/prometheus:latest等镜像。若希望使用官方发布的 Jaeger 镜像版本可通过环境变量指定JAEGER_VERSION2.0.0 docker compose -f docker-compose.yml up开发模式从 Jaeger 源码构建本地环境SPM 环境的第二个用途是支持本地开发——主要场景是对 SPM 功能做源码级改动后的本地验证。构建 jaeger-v2 docker 镜像make buildMakefile 中的build目标会进入仓库根目录执行make build-jaeger GOOSlinux编译 Linux 二进制 → 构建基础镜像 → 用docker buildx build --target release以jaegertracing/jaeger:dev标签构建镜像BINARY ? jaeger默认即 v2 二进制。启动开发环境make devdev目标设置JAEGER_VERSIONdev后执行docker compose up从而用刚构建的 dev 镜像替换latest镜像。此外 Makefile 还提供了make elasticsearch、make opensearch、make clickhouse分别对应各 metrics backend 的 dev 环境以及make clean-jaeger清理缓存的中间容器。发送模拟 traces使用 tracegenREADME 使用 tracegen 向 OpenTelemetry Collector 发送 traceCollector 负责把 trace 数据聚合成指标。如果尚未启动先启动本地 SPM 栈docker compose up生成指定数量的 tracedocker run --env OTEL_EXPORTER_OTLP_TRACES_ENDPOINThttp://jaeger:4318/v1/traces \ --network monitor_backend \ --rm \ jaegertracing/jaeger-tracegen:latest \ -trace-exporter otlp-http \ -traces 1或在一段时间内持续产生 tracedocker run --env OTEL_EXPORTER_OTLP_TRACES_ENDPOINThttp://jaeger:4318/v1/traces \ --network monitor_backend \ --rm \ jaegertracing/jaeger-tracegen:latest \ -trace-exporter otlp-http \ -duration 5s说明OTEL_EXPORTER_OTLP_TRACES_ENDPOINT指向 jaeger 容器的 OTLP HTTP 接收端4318/v1/traces--network monitor_backend将 tracegen 容器接入 compose 默认创建的网络网络名monitor_backend由项目目录名monitor与 compose 项目网络名backend组合而成-trace-exporter otlp-http选择 OTLP over HTTP 导出器-traces 1生成 1 条 trace-duration 5s则在 5 秒内持续生成。生成后打开 Jaeger UI http://localhost:16686/在tracegen服务下可以看到这些模拟 trace随后进入 Monitor 标签页 http://localhost:16686/monitor 即可查看 RED 指标指标查询 HTTP API 实战SPM 的核心价值之一在于 jaeger-query 暴露的编程式指标 API。README 给出了 4 个可直接复制的示例均使用jq格式化 JSON 输出。示例 1按 operation 分组的调用速率获取 driver 与 frontend 两个服务、按 operation 分组的 call rate从当前时刻endTs$(date %s)000往前回看 1 秒lookback1000步长 100msstep100滑动速率计算窗口 1 分钟ratePer60000curl http://localhost:16686/api/metrics/calls?servicedriverservicefrontendgroupByOperationtrueendTs$(date %s)000lookback1000step100ratePer60000 | jq .示例 2P95 延迟指定 span kind获取 driver 与 frontend 的 P95 延迟参数同上并限定 span kind 为server或client同一参数可重复出现逻辑上 ORcurl http://localhost:16686/api/metrics/latencies?servicedriverservicefrontendquantile0.95endTs$(date %s)000lookback1000step100ratePer60000spanKindserverspanKindclient | jq .示例 3默认参数的错误率获取 driver 与 frontend 的错误率全部使用默认参数curl http://localhost:16686/api/metrics/errors?servicedriverservicefrontend | jq .示例 4查询最小步长获取底层指标存储支持的最小时间分辨率curl http://localhost:16686/api/metrics/minstep | jq .查询参数规范查询端点格式为/api/metrics/{metric_type}?{query}README 使用 Backus-Naur 形式给出规范整理如下metric_type latencies | calls | errors query services , [ optionalParams ] optionalParams param | param optionalParams param groupByOperation | quantile | endTs | lookback | step | ratePer | spanKinds services service | service services service service strValue spanKinds spanKind | spanKind spanKinds spanKind spanKind spanKindType各参数语义与默认值参数取值必填默认值说明service字符串可重复OR 语义必填—指标选择过滤的服务列表逻辑上取 ORquantile浮点数有效区间 (0,1]latencies必填—计算延迟 P 值所用的分位数groupByOperation布尔1/t/T/true/TRUE/True/0/f/F/false/FALSE/False可选false是否额外按 operation 分组endTs整数POSIX 毫秒时间戳可选now指标查询时间范围的结束时刻lookback整数毫秒可选36000001 小时从endTs向前回看的数据点时长如设3600000查询范围即endTs - 1h到endTsstep整数毫秒可选50005 秒查询结果数据点之间的间隔如设 5s则从endTs - lookback到endTs每 5 秒一个数据点ratePer整数毫秒可选60000010 分钟对累计计数器指标计算每秒变化率的滑动窗口时长spanKindunspecified/internal/server/client/producer/consumer可重复OR 语义可选server指标选择过滤的 span kind 列表minstep 端点/api/metrics/minstep返回底层指标存储支持的最小时间分辨率毫秒该值可作为step参数的下限。例如 min step 为 1 表示后端返回的数据点之间至少间隔 1ms不能更近。响应数据模型响应数据模型基于 internal/proto/metrics/openmetrics.proto 中的MetricsFamily。以 call rate 为例响应结构如下{ name: service_call_rate, type: GAUGE, help: calls/sec, grouped by service, metrics: [ { labels: [ { name: service_name, value: driver } ], metricPoints: [ { gaugeValue: { doubleValue: 0.005846808321083344 }, timestamp: 2021-06-03T09:12:06Z }, { gaugeValue: { doubleValue: 0.006960443672323934 }, timestamp: 2021-06-03T09:12:11Z } ] } ] }当设置groupByOperationtrue时labels 中会额外携带 operation 名称labels: [ { name: operation, value: /FindNearest }, { name: service_name, value: driver } ]无 SPM 后端时的行为与复现方法SPM 功能UI 的 Monitor 标签页与/api/metrics/*端点依赖指标后端。Jaeger 在启动时会向 UI 通告后端能力当未配置 metrics backend 时Jaeger 不会通告metricsStorage能力Monitor 标签页也不会出现。复现方法注释掉 cmd/jaeger/config-spm.yaml 中extensions.jaeger_query.storage的metrics键extensions: jaeger_query: storage: traces: some_storage # metrics: some_metrics_storage # comment this out此时查询任意指标端点会返回如下错误结构HTTP 语义上由errors数组携带code: 501$ curl http://localhost:16686/api/metrics/minstep | jq . { data: null, total: 0, limit: 0, offset: 0, errors: [ { code: 501, msg: trace metrics are currently disabled - no metrics backend configured } ] }这个 501 响应中的错误信息trace metrics are currently disabled - no metrics backend configured正是未配置 metrics backend 时的典型排错线索若在 UI 上看不到 Monitor 标签页或 API 返回 501应优先检查 jaeger_query 扩展的 storage 中是否配置了metrics后端。小结SPM 把 Jaeger 从纯粹的 trace 查询平台延伸为自带服务级 RED 指标观测能力的分布式追踪平台。通过 docker-compose/monitor 目录下的 compose 文件开发者可以用一条命令在本地拉起完整 SPM 栈Prometheus 方案或 ES/OS 直查方案结合 cmd/jaeger/config-spm.yaml 等真实配置理解指标后端的声明方式借助 tracegen/microsim 快速生成模拟流量并通过/api/metrics/{calls|latencies|errors|minstep}以编程方式消费 RED 指标。无论是验证 Jaeger UI 的 Monitor 标签页、联调自己的应用接入指标查询 API还是为 SPM 功能做源码级开发调试这套环境都能提供最小可用的闭环。【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考