VictoriaMetrics如何实现多指标值排序?PromQL排序方法咨询
PromQL 与 VictoriaMetrics 按指标值排序的实现方案
PromQL 原生、VictoriaMetrics 兼容扩展的 MetricsQL 都提供了对应 SQL order by 按指标值排序的能力,完全可以覆盖你的需求,具体用法如下:
单指标排序
仅查询单个指标并按指标值排序时,直接用两个内置排序函数即可,不需要额外配置:
sort(向量表达式):返回结果按指标样本值从小到大升序排列,等价于sort by xxx ascsort_desc(向量表达式):返回结果按指标样本值从大到小降序排列,等价于sort by xxx desc
比如你要按 cpu_usage_ppm 从高到低返回所有 office 类型实体的CPU使用率,直接写下面的查询语句就行:
sort_desc(cpu_usage_ppm{entity_type="office"})
返回的序列会严格按照 cpu_usage_ppm 的数值从高到低排列,直接匹配你 payload 里指定 sort_member_attribute="cpu_usage_ppm" 的单指标排序需求。
多指标同维度按指定指标值排序
针对你 payload 里需要同时返回 cpu_usage_ppm、io_ppm、storage_ppm 三个指标,且所有结果统一按 cpu_usage_ppm 值排序的场景,有两种可落地的实现方式:
- 两步查询(兼容原生Prometheus、所有版本VictoriaMetrics)
第一步先查询排序基准指标,拿到按值排好序的实体标识列表:执行sort_desc(cpu_usage_ppm{entity_type="office"}),从返回结果中提取排好序的实体ID/实例标签序列;第二步用拿到的标签列表查询三个目标指标,返回结果时保持第一步的实体顺序即可。 - 单次查询(仅适用于VictoriaMetrics)
借助MetricsQL的扩展函数可以实现单次查询返回排序后的多指标结果:先把cpu_usage_ppm的样本值作为临时标签打到同实体下的三个指标序列上,再按这个临时标签做降序排序,最后删除临时标签即可。示例语句:label_del( sort_by_label_desc( label_set( cpu_usage_ppm{entity_type="office"} or io_ppm{entity_type="office"} or storage_ppm{entity_type="office"}, "sort_val", cpu_usage_ppm{entity_type="office"} ), "sort_val" ), "sort_val" )
补充说明
注意:上述排序函数仅对即时向量查询(对应/api/v1/query接口)生效,如果是范围查询(/api/v1/query_range)返回的是多时间点的序列段,不存在全局排序的概念,排序逻辑需要放到业务侧/前端展示层处理。
- 排序函数只会调整返回结果中序列的排列顺序,不会修改序列本身的标签、指标值,不会影响指标计算结果。
内容的提问来源于stack exchange,提问作者Manish Purohit
相关产品推荐
相关产品推荐

