如何复用Loki提取的日志值提升Grafana分位数查询效率
LogQL多分位数查询性能优化方案
- 优先用Loki记录规则预提取公共数据集
你现在查询慢、长跨度执行失败的核心原因,是每次查询都要重复扫描原始日志、做字符串过滤、pattern正则解析、字段unwrap,这部分是整个查询最重的IO和计算环节。可以在Loki的Ruler组件配置记录规则,提前把你需要的build_time_seconds相关字段按固定短窗口(比如1m/5m)预提取、结构化存储为时序指标,后续查分位数时直接查询预生成的结构化指标,不需要再扫原始日志,查询速度可以提升10倍以上,跨月查询也不会超时。
记录规则示例:
后续分位数查询直接基于预生成的groups: - name: build_time_common_metrics interval: 1m rules: - record: extracted_build_time_seconds expr: | {app="my-awesome-app"} |= "build_time_seconds" |= "MacBook" | pattern "<_>} <metric_value>\\<_>" | unwrap metric_valueextracted_build_time_seconds指标编写即可,不需要再重复写过滤、解析逻辑。 - 单条LogQL语句一次性计算多个分位数
如果你暂时没法配置记录规则,不要拆成三个独立查询分别算0.5/0.95/0.99分位。2.7及以上版本的Loki原生支持quantile_over_time传入多个分位参数,一次查询即可返回所有分位结果,查询引擎会自动复用公共的日志扫描、解析逻辑,不会重复执行三次提取计算。示例语句:
返回结果会自动携带quantile_over_time( 0.5, 0.95, 0.99, {app="my-awesome-app"} |= "build_time_seconds" |= "MacBook" | pattern "<_>} <metric_value>\\<_>" | unwrap metric_value [1d] )quantile标签区分不同分位值,在Grafana里可以直接按这个标签拆分成三条线展示。 - 用Grafana表达式功能复用查询结果
你要的前置查询结果引用能力不需要把仪表板配置为数据源,直接用Grafana内置的Expression功能即可实现:- 在面板的查询栏新建第一个Loki查询,命名为
A,只写公共的日志过滤、解析、unwrap逻辑,返回原始提取到的指标值,把这个查询的可见性设为隐藏 - 新建3个Reduce类型的表达式查询,分别选择输入数据源为
$A,计算函数选分位数,参数分别填0.5、0.95、0.99,窗口对齐你需要的1d粒度 - 这三个分位数计算会完全复用查询A返回的缓存结果,只会向Loki发起一次日志提取请求,不会重复计算。
- 在面板的查询栏新建第一个Loki查询,命名为
注意:如果你的Loki版本低于2.7不支持多参数
quantile_over_time,用Grafana表达式复用的方案兼容性最好,不需要升级Loki就能拿到性能提升。
内容的提问来源于stack exchange,提问作者christopherdrum
相关产品推荐
相关产品推荐

