Loki LogQL分组查询无数据时如何返回零向量?
解决Loki查询无数据返回0且避免多余零向量的问题
核心解决方案
如果你的需求是:有匹配日志时返回各namespace的计数,无任何匹配时返回单个0向量,且不出现多余的零向量,可以使用以下查询:
sum by (namespace) (count_over_time({namespace=~"something.+", container="backend"} |= "somelog" [$__range])) or vector(0) unless sum(count_over_time({namespace=~"something.+", container="backend"} |= "somelog" [$__range]))
原理说明
- 第一部分是你的原查询,正常返回各namespace的匹配日志计数
- 第二部分的
sum(...)会计算所有匹配日志的总条数:- 若总条数大于0(存在匹配数据),
unless运算符会屏蔽vector(0),仅保留原查询的有效计数结果 - 若总条数为0或无数据(无匹配日志),
unless会触发vector(0)生效,返回一个值为0的向量,避免出现"No data"
- 若总条数大于0(存在匹配数据),
进阶需求:返回所有目标namespace的0值
如果需要所有符合namespace=~"something.+"且存在backend容器日志的namespace都出现在结果中,有匹配日志显示计数,无匹配显示0,可以使用以下查询:
(sum by (namespace) ( count_over_time({namespace=~"something.+", container="backend"} |= "somelog" [$__range]) ) on (namespace) group_left() sum by (namespace) (count_over_time({namespace=~"something.+", container="backend"} [$__range]) or vector(1)) * 0) or vector(0)
原理说明
- 后半部分的
sum by (namespace) (...) * 0会生成所有存在backend容器日志的namespace列表,每个namespace对应值为0 on (namespace) group_left()将原查询的结果与这个列表合并,自动给无匹配日志的namespace填充0- 最后的
or vector(0)用于兜底:当完全没有backend容器日志时,返回单个0向量
内容的提问来源于stack exchange,提问作者Kristóf Marosvári
相关产品推荐
相关产品推荐

