APM Span 内置指标支持声明式引用
0x01 背景
a. 问题
apm_web.trace.resources.TraceChatsResource.perform_request 当前直接拼接大量图表查询参数。
这些参数同时承载指标语义、UnifyQuery 查询结构和前端图表兼容字段,导致新增或调整 Span 指标时容易重复改写多份 dict。
b. 现有基础
项目已经通过 QueryConfigBuilder、UnifyQuerySet 和 BaseMetricGroup 提供声明式查询能力。
ResourceMetricGroup 与 TrpcMetricGroup 已经证明该模式可以沉淀为可复用指标算子。
0x02 目标
- 新增 APM Span 指标组,用声明式算子表达 Trace 概览图使用的 Span 内置指标。
- 让
TraceChatsResource从手工拼接查询参数改为引用内置指标算子。 - 保持改造前后构造出的 charts 配置等价。
- 支持可选
service_name,用于服务视角复用同一套 Span 指标定义。
0x03 需求范围
BaseMetricGroup.query_config支持raw参数:默认返回告警/策略侧格式,raw=True返回 UnifyQuery 原始查询配置。- 定义
SpanMetricGroup:通过kind区分主调、被调,通过service_name增加服务过滤。 - 第一版 Span 算子覆盖 Trace 概览图现有指标:请求数、错误数、错误率、平均耗时、P50、P95 和 P99。
TraceChatsResource提供build_target,集中补齐前端图表 target 需要但CompilerMixin.config不提供的字段。- 补充单元测试或快照测试,证明算子配置和 charts 配置保持等价。
0x04 非目标
- 本期不实现
SpanMetricGroup.handle。 - 本期不把成功数、成功率、异常数和异常率扩展为完整 RED 指标集合。
- 本期不调整 Trace 图表的展示布局、图表数量和前端协议。
- 本期不改造
ResourceMetricGroup与TrpcMetricGroup的查询语义。
0x05 方法论
- 先冻结
TraceChatsResource现有 charts 输出作为等价基线。 - 再把查询语义迁移到
SpanMetricGroup,把图表兼容字段保留在build_target。 - 最后通过 raw query config 与 charts 快照验证,确认改造只改变构造方式,不改变对外配置。
0x06 验收标准
SpanMetricGroup.query_config(raw=True)能生成 Trace 概览图所需的7类 Span 指标查询配置。TraceChatsResource.perform_request在不传service_name时,返回 charts 配置与改造前一致。- 传入
service_name时,每个 query config 都追加服务过滤,target data 也携带service_name。 ResourceMetricGroup与TrpcMetricGroup默认query_config行为不变。- 相关测试或可执行验证通过,并记录到同目录
PLAN.md。
0x07 参考
- 实施方案:PLAN.md
<源码>bk-monitor/bkmonitor/packages/apm_web/trace/resources.py<源码>bk-monitor/bkmonitor/packages/apm_web/handlers/metric_group/groups/resource.py<源码>bk-monitor/bkmonitor/packages/apm_web/handlers/metric_group/groups/trpc.py<源码>bk-monitor/bkmonitor/bkmonitor/data_source/unify_query/builder.py