查询最佳实践
在 Loki 中编写查询的方式会影响您从这些查询中获取结果的速度。了解 Loki 解析查询的方式可以帮助您编写高效且高性能的查询。
提示
在开始优化查询之前,请阅读标签最佳实践页面,了解如何设置好的标签。选择正确的标签是编写高效查询的第一步。
Loki 从左到右评估 LogQL 查询,按照编写顺序进行。为了获得最佳查询性能,请在查询早期尽可能地排除潜在结果,然后随着查询的继续,逐步缩小搜索范围。本页面介绍了编写能够有效过滤掉不需要的结果的查询的推荐顺序。
首先缩小时间范围
通过指定要搜索的时间段来减少 Loki 需要查看的日志数量。Loki 每天创建一个索引文件,因此跨越多天的查询会读取多个索引文件。Loki 需要搜索的文件越少,查询结果返回得越快。
时间范围通常不是查询的一部分,但您可以通过可视化工具或Loki API设置时间范围。
在 Grafana 中
如果您将 Loki 与 Grafana 结合使用,可以使用仪表盘右上角的下拉菜单选择时间范围,可以是相对时间(过去 X 小时)或绝对时间(特定日期和时间)。
通过 Loki API
如果您通过Loki API查询 Loki,可以使用query_range
endpoint将您的查询的 start
和 end
时间戳作为参数添加到 HTTP 调用中,而不是作为查询本身的一部分。
http://<loki-instance>/loki/api/v1/query_range?query={job="app"}&start=1633017600000000000&end=1633104000000000000
使用精确的标签选择器
接下来,编写您的标签选择器。识别日志行中最具体的标签,并首先基于该标签进行搜索。例如,如果日志包含标签 namespace
和 app_name
,并且后者是数据的较小子集,请首先基于 app_name
选择来开始您的查询。
{app_name="carnivorousgreenhouse"}
使用最具体的标签选择器还有一个额外的好处,即缩短查询长度。由于 app_name
比 namespace
更具体,您无需为 namespace
添加选择器。添加更通用的标签选择器对查询没有进一步的影响。
优先使用简单的行过滤表达式而非正则表达式
使用行过滤表达式时,优先使用更简单的过滤操作符,例如
|=
(包含字符串) 和!=
(不包含字符串),而不是正则表达式过滤操作符|~
(匹配正则表达式)!~
(不匹配正则表达式)
Loki 计算前两种过滤表达式比计算正则表达式快得多,因此,请始终尝试根据日志行是否包含或不包含某个字符串来重写您的查询。正则表达式仅作为最后的手段使用。
行过滤表达式比解析器表达式更高效。
避免使用复杂的文本解析器
仅在行过滤表达式之后使用解析器表达式。解析器表达式是查看日志行并提取不同格式标签的方式,这很有用,但对 Loki 而言也比行过滤表达式更耗费资源。在行过滤表达式之后使用它们意味着 Loki 只需对匹配行过滤表达式的日志行评估解析器表达式,从而减少了 Loki 需要搜索的日志量。
解析器表达式包括JSON、logfmt、pattern、regexp 和unpack 解析器。
使用记录规则
有些查询足够复杂,或者数据集足够大,以至于查询性能优化存在一定限制。如果您遵循本页的提示后仍然遇到查询缓慢的问题,可以考虑为它们创建记录规则。记录规则在预设时间运行查询,并预计算查询结果,从而将这些结果保存起来以便后续更快地检索。