当你运行一个 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 的日志模式分析,从 9.5 版本开始。当你运行一个 CATEGORIZE 查询时,Discover 在后台构建 SPARKLINE 查询,并在每个模式旁边渲染趋势线。你无需手动编写 SPARKLINE;当你在 ES|QL 编辑器中使用“识别模式”选项时,Discover 会自动处理。结果是立竿见影的:你扫描数十个日志模式,立刻就能看出哪些模式正在激增,哪些全天保持平稳。

以下是后台运行的查询:
FROM app-logs-*| WHERE @timestamp <= ?_tend AND @timestamp > ?_tstart| STATS count = COUNT(*), sparkline = SPARKLINE(COUNT(*), @timestamp, 50, ?_tstart, ?_tend) BY pattern = CATEGORIZE(message)| SORT count DESC想象一个平台团队正在研究如何降低日志成本。他们将 Discover 指向数千万个文档,让 CATEGORIZE 将它们聚类成模式。两个模式脱颖而出:冗长的生命周期消息,例如“fetching resource...”和“completed resource...”,每个都有数百万次命中。这些行旁边的走势图揭示了剩余的故事:平稳、持续不断的流,全天运行。不是由事件驱动,没有突发性,只是持续的噪音,悄悄消耗着数百 TB 的存储空间。

这类情况的修复通常很简单:调整日志级别、在采集时丢弃该模式,或将其路由到更便宜的存储层。难点一直在于“发现”它。借助日志模式分析和 ES|QL 中的内联走势图,这一发现过程从数小时缩短到数秒。
Elastic 内部站点可靠性工程(SRE)团队经常成功使用日志模式分析,并充分利用了 ES|QL 的每项增强功能。
这些只是一些具体示例。按区域拆分请求计数,查看哪些区域呈上升趋势。比较各容器 ID 的延迟。按消费者组监控队列深度。用途无穷无尽。
我们刻意让 SPARKLINE 保持专注:
STATS ... BY 语法组合,因此在结构上无需学习新东西。模式始终如一:一次查询,多条趋势线,即时视觉分类。
SPARKLINE 在 Elasticsearch 9.5 中作为技术预览功能发布。未来的工作包括在更多 ES|QL 界面中渲染走势图,除了最初在 Kibana 中与 CATEGORIZE 上下文的集成之外,还包括仪表板以及 Elastic Observability 的以下用例:
在应用性能监控(APM)工作流中,工程师通常分析速率、错误和持续时间(RED)指标来了解服务健康状况。挑战在于聚合数字会隐藏维度上的异常值。一个服务可能整体看起来健康,但某个区域、某个容器或某个新部署的版本可能正在悄悄恶化。
目前,Elastic APM UI 允许你按事务名称分解指标,但根本原因分析需要按任意维度进行切片:可用区、服务版本、容器 ID、云区域。SPARKLINE 可以使这一过程变得实用。按 service.version 分解错误率,立即就能看到哪个版本的走势线偏离了群体。
SPARKLINE 在 Elasticsearch 9.5 中作为技术预览功能提供。你可以通过 ES|QL _query API 或在 Kibana 的 Discover 中试用。查看 SPARKLINE 函数参考 获取完整语法和受支持的类型。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。