如何从APM Trace数据查询按pod_name分组统计resource_name的计数表格
APM Trace按资源名和Pod分组计数的可行解决方案
方案1:直接对接APM底层存储查询统计
绝大多数APM系统(SkyWalking、Jaeger、云厂商托管APM等)的原始Trace数据都会存在Elasticsearch、ClickHouse、Cassandra这类可查询的存储中,你可以直接连接存储写查询语句实现统计:
- 若底层为Elasticsearch,使用如下DSL查询:
{ "size": 0, "query": { "range": { "start_time": { "gte": "now-1h", "lte": "now" } } }, "aggs": { "group_resource": { "terms": { "field": "resource_name.keyword", "size": 1000 }, "aggs": { "group_pod": { "terms": { "field": "pod_name.keyword", "size": 100 }, "aggs": { "total_count": { "value_count": { "field": "trace_id" } } } } } } } }
- 若底层为ClickHouse,使用如下SQL查询:
SELECT resource_name, pod_name, COUNT(DISTINCT trace_id) AS count FROM 你的APM Trace表名 WHERE start_time >= NOW() - INTERVAL 1 HOUR GROUP BY resource_name, pod_name ORDER BY count DESC;
查询得到的结果可以直接对接Grafana、DataEase等可视化工具生成表格仪表盘,支持自定义刷新频率。
方案2:通过采集侧预生成自定义指标
如果你用OpenTelemetry Collector做Trace采集,直接新增spanmetrics连接器配置,把resource_name和pod_name设为指标的固定维度,就能直接生成符合要求的计数指标:
connectors: spanmetrics: metrics_exporter: prometheus dimensions: - name: http.route - name: k8s.pod.name aggregation_temporality: AGGREGATION_TEMPORALITY_CUMULATIVE
生成的span_count指标自带两个维度标签,直接在仪表盘内按两个标签分组取count值即可,无需修改业务埋点。
方案3:云厂商托管APM的特殊处理
如果用的是云厂商托管APM,原生能力不支持该查询的话可以走数据投递链路:
- 开通APM Trace数据投递功能,将全量Trace数据投递到同厂商的日志服务/SLS/大数据分析产品
- 用日志服务的SQL统计能力实现按两个字段分组计数,再将统计结果直接导入厂商自带的仪表盘展示即可
注意事项
- 统计前先确认
resource_name已经做了参数归一化,避免同一个接口因为路径参数不同被识别为不同资源导致统计结果不准 - 数据量大的时候务必加时间范围过滤,避免全表扫描导致查询超时
内容的提问来源于stack exchange,提问作者Dave New
相关产品推荐
相关产品推荐

