博客/工程

Loki 2.3已经推出:自定义保留,对最近数据的15倍查询速度,普罗米修斯式的记录规则

2021年8月6日5分钟

Loki v2.3.0带来了优秀的新功能。Bug也修复了。性能在此基础上得到提升。虽然我们一直很安静,但我们一直很忙!

自定义保留

Loki中的保留始终是集群的全局保留,并延迟到底层对象存储。

洛基现在可以通过压缩组件处理留存。您可以配置每个租户和每个流的保留率。这些不同的保留配置允许您控制存储成本,并以更细粒度的方式满足安全性和遵从性需求。

配置是使用洛基配置的现有覆盖机制完成的:

读了洛基存储保留文档更多信息。

删除

Loki现在支持在指定的时间间隔内删除选定流的日志条目。

与自定义保留特性一样,通过Compactor组件支持删除。Compactor为删除任务公开API端点。有用于请求删除、列出现有删除请求及其状态以及取消挂起的删除请求的端点。

该特性的初始实现支持删除当前时间(24小时)内的数据(不能删除最近24小时内的数据)。这种实现的主要要求是确保Loki能够遵守删除个人信息的请求。删除当前时间之前的数据是可能的,但更为复杂。我们将来可能会在这个功能上进行迭代,以添加这样的功能。

该特性是实验性的,仅由BoltDB托运人索引存储.您可以在日志条目删除文档

记录规则

Loki现在支持普罗米修斯风格的记录规则。记录规则使您能够定期对日志运行度量查询,将产生的度量发送到普罗米修斯以及与普罗米修斯兼容的系统,如Cortex和灭霸。

记录规则的一个引人注目的用例是不能通过仪表来发送Prometheus度量的软件。只使用日志,您可以创建指标!

我们一直在尝试从Loki’s创建每个租户(组织_id)指标metrics.go日志行,它输出许多单独的查询统计信息。

这也可以通过Prometheus和直方图来实现,但是这种方法的一个优点是我们不需要生成带有租户标签维度的直方图,因此它减少了存储在Prometheus中的序列数量。每个租户只生成一个系列,而不是每个租户生成一个系列乘以直方图中的桶数。Prometheus中的记录规则也可以实现同样的减少到每个租户一个系列,但是在某些情况下,这种方法可能更适合您。

这个特性是实验性的。看到记录规则文档了解更多细节。

模式解析器

使用新的模式解析器,编写LogQL查询来提取非结构化日志的标签更快、更容易。使用模式解析器,您可以避免编写繁琐的正则表达式,特别是对于由文字和空格分隔的标记组成的常见日志格式。

考虑以下NGINX日志行:

0.191.12.2 - - [10/Jun/ 201:09:14:29 +0000] "GET /api/plugins/versioncheck HTTP/1.1" 200 2" -" Go-http-client/2.0" "13.76.247.102, 34.120.177.193" "TLSv1.2" "US" ""

这条日志行可以用模式解析器表达式进行解析:

< ip > - - <_> "< 方法> < uri > < _ > " <地位> <大小> < _ > " <代理> " < _ >

它提取了这些字段:

“知识产权”= >“0.191.12.2”“方法”= >“获得”“uri”= >“/ api /插件/ versioncheck”“状态”= >“200”“大小”= >“2”“代理”= >“Go-http-client / 2.0”

要了解有关语法的更多信息,请参阅LogQL文档

摄取分片

Loki中的分片是查询前端使用的一种技术,用于将查询拆分为并行计算。在v2.3.0之前,对近期数据不应用分片。使用入口分片,所有的时间范围都是并行的。

分片提高了性能:我们的环境搜索速度从大约1GB/s跃升到大约15gb /s。对于针对大量流或具有大量数据的流的近期数据查询,它应该提高搜索性能。

例如,查看从NGINX入口控制器查询最近一小时的数据时的差异,NGINX入口控制器的日志记录约为每小时90GB:

在ingester sharding之前:

❯logcli query '{container="ingress-nginx"} |= "trytofindme!!’——since=1h——stats 2>&1 | grep Summary Summary。BytesProcessedPerSecond 784 MB摘要。LinesProcessedPerSecond 1263304摘要。TotalBytesProcessed。合计已处理141420028摘要。ExecTime 1 m51.944531908s

摄入切屑后:

❯logcli query '{container="ingress-nginx"} |= "trytofindme!!’——since=1h——stats 2>&1 | grep Summary Summary。BytesProcessedPerSecond 15gb Summary。LinesProcessedPerSecond 24171034摘要。TotalBytesProcessed。总计已处理142086646摘要。ExecTime 5.878385063秒

入口分片在默认情况下是启用的,但只有当您有一个查询前端组件正在运行,该组件负责创建发送到入口的分片和碎片时才会生效。

LogQL IP地址匹配

对于任何想要对包含IP地址的日志进行更复杂的过滤的人来说,已经教会了LogQL许多新技巧来帮助您。

语法如下所示:知识产权(“< >模式”).<模式>可以是:

  • 单个IP地址。示例:ip(" 192.0.2.0 "), ip("::1")

  • IP地址范围。例子:ip(“192.168.0.1-192.189.10.12”),ip(“2001:db8:: 1 - 2001: db8:: 8”)

  • CIDR规范。例子:ip(“192.51.100.0/24”),ip(“2001:db8:: / 32”)

这允许你做以下事情:

返回与特定IP匹配的日志行

{container="nginx"} |= ip("192.168.4.5")

返回不包含ip范围的日志行

{容器= " nginx "} ! = ip(“192.168.4.1-192.168.4.10”)

返回与特定子网匹配的日志行

{container="nginx"} |= ip("192.168.4.0/24")

有关语法的更多信息,请参阅LogQL文档

了解更多

一定要阅读更新日志有关此版本的所有细节,以及升级指南以确保升级过程顺利进行。

v2.3是AGPLv3许可下的第一个Loki版本。你可以在这里阅读更多关于我们的许可

从洛基开始最简单的方法就是格拉夫娜云,还有我们有慷慨的免费(包括50GB的原木)和付费计划.如果你还没有使用Grafana Cloud,今天免费注册并找出哪个计划符合您的用例。