在我的研究中洛基我已经分享了所有最好的创作技巧快速过滤器查询它可以在几秒钟内过滤tb级的数据转义特殊字符.
在这篇博文中,我们将介绍如何在Loki中使用度量查询来随时间聚合日志数据。
现有业务
在Loki中,有两种类型的聚合操作。
第一种类型将日志项作为一个整体来计算值。over操作支持的功能有:
率(log-range)
:计算每秒的表项个数count_over_time (log-range)
:统计指定范围内每个日志流的条目数bytes_rate (log-range)
:计算每个流每秒的字节数bytes_over_time (log-range)
:统计指定范围内每条日志流占用的字节数
例子:
Sum by (host) (rate({job="mysql"} |= "error" != "timeout" | json | duration > 10s [1m]))
第二种类型是未包装范围,它使用提取的标签作为示例值,而不是日志行。
但是,要选择在聚合中使用哪个标签,日志查询必须以打开表达式而且(可选)丢弃错误的标签筛选器表达式。
支持对未包装范围进行操作的函数有:
率(unwrapped-range)
:计算指定时间间隔内所有值的每秒速率sum_over_time (unwrapped-range)
:指定区间内所有值的和avg_over_time (unwrapped-range)
:指定区间内各点的平均值max_over_time (unwrapped-range)
:指定区间内所有点的最大值min_over_time (unwrapped-range)
:指定区间内所有点的最小值stdvar_over_time (unwrapped-range)
:各值在指定区间内的总体标准方差stddev_over_time (unwrapped-range)
:指定区间内各值的总体标准差unwrapped-range quantile_over_time(标量)
:指定区间内值的φ-分位数(0≤φ≤1)
例子:
Quantile_over_time (0.99, {cluster="ops-tools1",container="ingress-nginx"} | json | __error__ =" | unwrap request_time [1m])) by (path)
应该指出的是,这一点quantile_over_time
比如在普罗米修斯,不是一个估计。将对范围内的所有值进行排序,并计算第99个百分位数。
展开表达式的速率是新的,非常有用。例如,如果您记录每次获取的字节量,那么您可以使用率
.
关于分组
不像普罗米修斯,其中一些范围操作允许你使用分组而不需要向量操作。这就是avg_over_time
,max_over_time
,min_over_time
,stdvar_over_time
,stddev_over_time
,quantile_over_time
.
这对于聚合特定维度上的数据非常有用,否则是不可能的。
例如,如果你想获得集群的平均延迟,你可以使用:
Avg_over_time ({container="ingress-nginx",service=" hosting -grafana"} | json | unwrap response_latency_seconds | __error__=""[1m]) by (cluster)
对于其他操作,可以简单地使用Sum by (..) (
向量操作,就像你对Prometheus所做的那样,在范围聚合后减少标签维数。
例如,对每个状态码的请求率进行分组:
Sum by (response_status) (rate({container="ingress-nginx",service=" hosting -grafana "} | json | __error__=""[1m]))
您可能也注意到了这一点:提取的标签可以用于分组,而且通过解析日志数据在度量查询中包含新维度功能非常强大。
在构建具有的指标查询时,应该始终使用分组logfmt
而且json
解析器,因为这是减少结果序列的唯一方法——这些解析器可以隐式地提取大量标签。
结论
范围向量操作非常适合计算日志量,但是结合LogQL解析器和未包装表达式,可以从日志中提取一组全新的指标,甚至不需要更改代码就可以查看系统。
我们还没有详细介绍LogQL解析器或解包装表达式,但是您绝对应该看一看我们的文档了解有关如何提取新标签并在指标查询中使用它们的更多信息。
如果你想试试洛基,你可以试试自己安装或者在几分钟内开始Grafana云.我们刚刚宣布了新的免费和付费Grafana云计划,以适应每一个用例-现在免费注册.