这一期我正在进行的Grafana Loki指南系列,我想提供一些有用的——也许是令人惊讶的——关于使用LogQL (Loki的查询语言)的事实。
如果你是新来的Grafana洛基这是一个创建于2018年的日志聚合系统,Loki团队从那以后就一直与社区合作引入新功能而且让它更容易部署.LogQL在很大程度上受到PromQL的启发,PromQL是一种用于查询指标的语言普罗米修斯即广受欢迎的CNCF项目。
早在2020年,LogQL就收到了许多新的扩展,允许它提取、转换和过滤您的日志。在这篇博文中,我们将看看10个你可能不知道的功能。
1.可以使用拆封速率来计算每秒钟的样例值。
未包装的范围向量聚合是从日志行提取样本值的常用方法。通常你想用它们sum_over_time
或quantile_over_time
范围聚合运算符。但是,速率聚合可用于计算每秒日志数,也可与未包装的范围向量一起使用,以对来自日志行的样本值进行评分。如果日志行包含计数器值,这将非常有用。注意不要使用率(…|打开)
可以上升或下降的值,但只会上升的值。
例如,下面的查询对每个命名空间的订单计数进行了统计:
Sum by (namespace) (rate({cluster="dev-us-central-1"} | json | unwrap order_count[$__interval]))
与日志计数的速率不同,unwrapped速率将通过外推值计入计数器重置,就像Prometheus对counter所做的一样。
2.可以计算提取值的长度。
文本模板是LogQL结合使用的模板引擎line_format
而且label_format
.这门语言包含了大量我们经常忘记的有用函数——包括len
,它返回变量的大小—在查询日志时非常有用。
如果你想计算在Cortex中最长的查询,试试这个:
Max_over_time ({namespace="皮质-prod", container="query-frontend"} | logfmt | label_format param_query_count= ' {{.param_query | len}} ' | unwrap param_query_count [$__interval]) by (cluster)
3.有一个新的文本/模板变量。
我们最近增加了__line__
,一个用于文本/模板的新变量,将打印或输出实际的日志行。当您想修剪、添加或更改整个日志线时,这非常有用。
移除所有\
在日志行中,你可以使用:
{name = " query-frontend”,名称空间=“洛基”}| line_format的{{取代__line __ "\\" "" - 1}}’
4.多个解析器是一个选项。
如果LogQL中的解析器解析失败,它们实际上不会过滤数据。这意味着,如果您想从不同的格式进行提取,那么实际上可以在同一个查询中包含多个解析器。
例如,在《洛基》中我们有这样的日志线:
level=debug ts= 22-03-15t10:06:21. 308662138z caller=logging。go:67 traceID=7acfb2b833acb3e2 orgID=29 msg="GET /loki/api/v1/query_range? "start=1647337422075409296&end=1647337442075409296&query=% 7Bstream%3D%22stdout%22%2Cpod%3D% 22lo基- canole -x672l%22%7D&limit=1000 (200) 27.806027ms"
如果希望解析请求信息(方法、状态、持续时间),可以组合使用logfmt
模式解析器如下所示:
{name="query-frontend", namespace="loki-ops"} |= "logging. log . "= "gRPC" | logfmt | line_format ' {{. go" !味精}}|模式的<法> < _ >(< >状态)<时间> '
正如您所看到的,诀窍是使用您想要解析的下一个属性来更改日志行line_format
.
5.可以用距离向量聚合进行分组。
在Prometheus中,范围向量聚合不允许分组通过
而且没有
;然而,这在Loki中是可能的——有些查询在其他情况下是无法表达的。
例如,如果您想获得每个方法和状态的第99个分位数的延迟,您就不能用by(方法,状态)的和包装分位数,因为延迟分位数不能被求和。然而,你可以直接对分位数使用分组,如下图所示,以达到正确的结果:
Quantile_over_time (0.99, {name="query-frontend", namespace="loki-ops"} |= "logging. log . "执行" | logfmt | line_format '{{。Msg}} ' | pattern ' <_> () ' | unwrap duration(duration) | __error__=""[$__interval]) by (method,status)
这对于大多数范围向量聚合也是正确的,除了那些可以求和的,如速率、计数超时时间等。
6.有字节和持续时间标签过滤器。
一旦解析了新的标签,它们就可以用于进一步的过滤使用标签过滤器.这些过滤器的优点是,它们可以使用表达式的字面分支来推断类型。
例如,像下面这样的查询将过滤延迟高于5秒和字节吞吐量低于4gb的请求。
{container="query-frontend"} |= "metrics. "| logfmt | duration >= 5s或吞吐量< 4GB
7.您可以重新格式化日志行。
有时屏幕上的日志很难阅读。洛基line_format
它不仅可以帮助您过滤内容,还可以以更可读的方式重新格式化日志行。
我使用这个查询来删除双退格,但也从日志行(使用t
),并限制.query
变量为100个字符。
{name="query-frontend", namespace="loki"} |= "metrics. "走”| logfmt | label_format查询= "{{取代.query \“\ \ n \ \“\”1}}”| line_format”{{.ts}} {{\ t。\ttraceID = {{. duration}}\traceID}}\t{{ printf \"%100s\" .query }}"
8.有IP过滤。
如果您正在使用网络设备或只是记录ip,这是为您准备的。
我们最近增加了IP过滤在Loki中,虽然技术上,你已经可以使用正则表达式,IP过滤器支持更多的用例,如IP v6, CIDR匹配,范围等。
下面的查询将返回与给定IP范围不匹配的日志。
{job_name =“myapp”}! = ip(“192.168.4.5-192.168.4.20”)
9.你可以在日志里加入表情符号。
Loki和Grafana支持任何UTF-8字符的组合line_format
,这可以帮助你创建漂亮的可视化。
在你所有的请求前加上状态表情,试试这个:
{name="query-frontend", namespace="loki-ops"} |= "logging. log . "= "gRPC" | logfmt | line_format ' {{. go" !味精}}’|模式 `<_> <_> (< 状态 >) <_>` | line_format的{{如果情商.status " 500 "}}❌{{其他}}✅{{结束}}{{__line__}}’
10.数组值可以用JSON访问。
默认情况下,JSON解析器将自动从JSON文档中提取所有可能的属性。但是,它有意跳过数组。如果希望访问此数据,可以使用JSON解析器的另一种变体接受参数。
要从JSON数组中提取第一个服务器,你可以使用这个查询:
{app="infrastructure"} | json first_server="servers[0]"
额外的好处:您可以在LogQL中注释。
最后但同样重要的是,你可以使用#
而且/ * * /
分别注释查询中的一行或多行。这在排除查询故障时非常有用。
我希望这些建议对你有用!有关LogQL的更多信息,请访问我们的LogQL文档页面.
您也可以参加我们的“用Grafana Loki缩放和保护你的日志在5月19日的网络研讨会上。今天注册免费!
最简单的开始方式Grafana洛基是Grafana云.我们对每个用例都有一个慷慨的免费永久层bob体育手机二维码和计划。现在就免费注册!