作者:来自 Elastic Daniel Rubinstein

一眼看清数千个用户群组的趋势,无需离开你的工作流程。ES|QL 全新的 SPARKLINE 函数可以将聚合结果转换为趋势线。每行一个数组,零操作成本。
亲自体验 Elasticsearch:深入了解我们在 Elasticsearch Labs 仓库 中提供的示例笔记本,开始 免费云试用,或者立即在你的 本地机器 上试用 Elastic。
当你运行 STATS ... BY 查询并得到几十个或数百个结果时(日志模式、主机、服务、状态码),单纯的计数并不能告诉你这些数据在 一段时间内 发生了什么变化。错误数量或日志模式是在不断增加,还是正在趋于稳定?它是否处于通常的范围内?要回答这些问题,目前你要么构建一个单独的时间序列可视化,要么凭肉眼观察数字,然后祈祷结果是正确的。
对于本应该一眼就能看清的事情来说,这可能需要付出大量精力和时间,还要不断切换上下文。在这篇博客中,我们将介绍 Elasticsearch 查询语言(ES|QL)的 SPARKLINE 是如何工作的、它能做什么,以及如何开始使用。
工作原理
SPARKLINE 是一个 ES|QL 聚合函数,其签名非常简单:
SPARKLINE(aggregation, key, buckets, from, to)
-
aggregation:计算 y 轴值的表达式,包括任何受支持的聚合:COUNT(*)、SUM(bytes)、AVG(latency)或其他聚合。 -
key:用于生成分桶的日期表达式。 -
buckets:目标分桶数量。 -
from/to:时间范围的边界。(在 Kibana 中,它们通过查询参数与时间选择器绑定。)
在底层,SPARKLINE 会对时间范围进行分桶,计算每个分桶中的聚合值,并将结果打包成一个有序数组。空分桶会填充为零,因此每个用户群组都共享相同的 x 轴网格,从而可以快速、轻松地进行可视化比较。
该函数可以很自然地与 STATS ... BY 组合使用,因此你可以将它与任意分组结合起来。
Sparkline 大显身手的地方
你首先会在 Discover 的日志模式分析中看到 SPARKLINE 发挥作用,从 9.5 开始。当你运行 CATEGORIZE 查询时,Discover 会在后台构建 SPARKLINE 查询,并在每个模式旁边渲染趋势线。在这里,你不需要自己编写 SPARKLINE;当你在 ES|QL 编辑器中使用 "identify patterns/识别模式" 选项时,Discover 会自动处理这些操作。结果非常直观:你可以扫描几十种日志模式,并立即看到哪些模式_此刻_正在激增,而哪些模式一整天都保持稳定。

下面是后台实际使用的查询:
less
`
1. FROM app-logs-*
2. | WHERE @timestamp <= ?_tend AND @timestamp > ?_tstart
3. | STATS count = COUNT(*), sparkline = SPARKLINE(COUNT(*), @timestamp, 50, ?_tstart, ?_tend) BY pattern = CATEGORIZE(message)
4. | SORT count DESC
`Lobster AI
设想一个平台团队正在调查如何降低日志成本。他们让 Discover 对数千万个文档进行分析,并使用 CATEGORIZE 将这些文档聚类成不同的模式。其中有两种模式脱颖而出:类似 "正在获取资源......" 和 "已完成资源......" 这样的详细生命周期消息,每种消息都有数百万次命中。
这些行旁边的 sparkline 则揭示了剩下的故事:全天候持续、平稳的日志流。不是由故障事件驱动的。也不是突发性的。只是持续不断的噪声,在悄无声息地消耗数百 TB 的存储空间。

像这种情况,解决方法通常很直接:调整日志级别,在摄取时丢弃该模式,或者将其路由到成本更低的层级。一直以来,真正困难的部分都是_找到_它。借助 ES|QL 中的日志模式分析和内联 sparkline,这种发现过程只需要几秒钟,而不是几个小时。
Elastic 内部的网站可靠性工程(SRE)团队经常成功使用日志模式分析,并充分利用 ES|QL 的各种增强功能。
这些只是一些具体示例。按区域拆分请求数量,看看哪些区域呈上升趋势。比较不同容器 ID 之间的延迟。按消费者群组监控队列深度。应用场景几乎无穷无尽。
简单的设计
我们有意让 SPARKLINE 保持专注:
-
它是一个聚合函数 ,而不是一条新命令。它可以与现有的
STATS ... BY语法组合使用,因此在结构上没有什么新的东西需要学习。 -
**它返回消费者可以在上下文中进行渲染的数据。**该函数生成一个值数组。这些值具体如何渲染,可以是 Discover 中的迷你图表、notebook 中的折线,或者 API 响应中的 JSON 数组,这取决于消费者。
-
**它会填充空桶。**每个分组都会获得数量相同的值,并与相同的时间网格对齐。这是经过刻意设计的:当你可以一眼比较各行之间的形状时,sparkline 最有用,而这需要保持一致的对齐方式。
模式始终相同:一条查询、多个趋势线、即时可视化排查。
下一步
SPARKLINE 在 Elasticsearch 9.5 中以技术预览 形式提供。未来的工作包括在更多 ES|QL 使用界面中渲染 sparkline ,不再局限于最初与 Kibana 中CATEGORIZE上下文的集成。这包括仪表板,也包括 Elastic Observability 中的以下应用场景:
在应用性能监控(APM)工作流中,工程师经常分析速率、错误和持续时间(RED)指标,以了解服务健康状况。挑战在于,聚合后的数字会隐藏维度上的异常值。一个服务整体看起来可能很健康,但某个区域、某个容器,或者某个新部署的版本可能正在悄悄恶化。
目前,Elastic APM UI 允许你按事务名称拆分指标,但根因分析需要按照任意维度进行切分:可用区、服务版本、容器 ID、云区域。SPARKLINE 可以让这一过程变得切实可行。按service.version拆分错误率,就可以立即看到哪个版本的趋势线偏离了其他版本。
开始使用
SPARKLINE 在 Elasticsearch 9.5 中以技术预览形式提供。你可以通过 ES|QL _query API 或 Kibana 的 Discover 进行尝试。完整的语法和支持的类型,请参阅SPARKLINE 函数参考。
本文所述任何功能或特性的发布时间和时间安排均由 Elastic 自行决定。目前尚未提供的任何功能或特性可能无法按时交付,也可能根本不会交付。
原文:Introducing SPARKLINE in ES|QL: Spot trends at a glance | Elasticsearch Labs