Elasticsearch 用于各种数据类型,其中一种是指标。随着多年前 Metricbeat 的引入以及后来的 APM Agent,指标用例变得越来越受欢迎。多年来,Elasticsearch 在如何处理诸如指标聚合和稀疏文档等方面做了许多改进。与此同时,TSVB 可视化被引入,使指标可视化更容易。大多数其他指标解决方案中存在的一个缺失概念是带有维度的时间序列概念。
2021 年年中,Elasticsearch 团队开始使 Elasticsearch 更适合指标。该团队创建了时间序列数据流 (TSDS),该数据流在 8.7 版本中正式发布 (GA)。
这篇博文深入探讨了 TSDS 的工作原理、我们如何在 Elastic 可观测性中使用它,以及如何将其用于您自己的指标。
TSDS 快速入门
时间序列数据流 (TSDS)构建于 Elasticsearch 中针对时间序列优化的数据流之上。要为指标创建数据流,需要在数据流上添加一个设置。由于我们使用的是数据流,因此首先必须创建索引模板。
PUT _index_template/metrics-laptop
{
"index_patterns": [
"metrics-laptop-*"
],
"data_stream": {},
"priority": 200,
"template": {
"settings": {
"index.mode": "time_series"
},
"mappings": {
"properties": {
"host.name": {
"type": "keyword",
"time_series_dimension": true
},
"packages.sent": {
"type": "integer",
"time_series_metric": "counter"
},
"memory.usage": {
"type": "double",
"time_series_metric": "gauge"
}
}
}
}
}
让我们仔细看一下这个模板。在顶部,我们使用 metrics-laptop-* 标记索引模式。可以选择任何模式,但建议对所有指标使用数据流命名方案。下一部分将 “index.mode” 设置为 “time_series”,并确保它是 data_stream: “data_stream”。.
维度
每个时间序列数据流都需要至少一个维度。在上面的示例中,host.name 被设置为维度字段,并且 "time_series_dimension": true。默认情况下,最多可以有 16 个维度。并非每个维度都必须显示在每个文档中。维度定义时间序列。一般的规则是将唯一标识您的时间序列的字段选作维度。通常,这是主机/容器的唯一描述,但对于某些指标(如磁盘指标),还需要磁盘 ID。如果您对默认推荐的维度感兴趣,请查看此ECS 贡献,其中包含维度属性。
减少存储空间并提高查询速度
此时,您已经拥有一个功能正常的时间序列数据流。将索引模式设置为时间序列会自动启用合成源。默认情况下,Elasticsearch 通常会将数据复制三份
使用合成源时,不会持久保存 _source 字段;相反,它是从 doc values 中重建的。尤其是在指标用例中,保留源几乎没有好处。
不存储它意味着存储空间的大幅减少。时间序列数据流根据维度和时间戳对数据进行排序。这意味着通常一起查询的数据存储在一起,从而加快了查询时间。这也意味着单个时间序列的数据点存储在磁盘上的彼此相邻的位置。这使得可以进一步压缩数据,因为计数器增加的速度通常相对恒定。
指标类型
但是,要从 TSDS 的所有优势中获益,必须使用以下内容扩展指标字段的字段属性:
当您在数据流命名方案下为数据流创建自己的模板时,请务必将 “priority” 设置为 200 或更高,否则将应用内置的默认模板。
摄取文档
将文档摄取到 TSDS 中与将文档摄取到 Elasticsearch 中没有任何不同。您可以使用 Dev Tools 中的以下命令来添加文档,然后搜索它并查看映射。注意:您必须调整 @timestamp 字段使其接近您当前的日期和时间。
# Add a document with `host.name` as the dimension
POST metrics-laptop-default/_doc
{
# This timestamp neesd to be adjusted to be current
"@timestamp": "2023-03-30T12:26:23+00:00",
"host.name": "ruflin.com",
"packages.sent": 1000,
"memory.usage": 0.8
}
# Search for the added doc, _source will show up but is reconstructed
GET metrics-laptop-default/_search
# Check out the mappings
GET metrics-laptop-default
如果您进行搜索,它仍然显示 _source,但这是从 doc values 中重建的。上面添加的附加字段是 @timestamp。这很重要,因为它是任何数据流的必填字段。
为什么这对可观测性如此重要?
Elastic 可观测性解决方案的优势之一是,在单个存储引擎中,所有信号都汇集在一个位置。用户可以一起查询日志、指标和跟踪,而无需从一个系统跳转到另一个系统。因此,拥有一个出色的存储和查询引擎不仅对日志很重要,而且对指标也很重要。
在集成中使用 TSDS
通过集成,我们为用户提供了开箱即用的体验,可以与他们的基础设施和服务集成。如果您使用的是我们的集成,假设您使用的是 8.7 或更高版本,最终您将自动获得 TSDS 为您的指标带来的所有好处。
目前,我们正在处理集成包列表,添加维度、指标类型字段,然后为指标数据流启用 TSDS。这意味着,一旦包启用了所有属性,您只需升级集成,其他一切都将在后台自动完成。
要在 Kibana 中可视化时间序列,请使用 Lens,它内置了对 TSDS 的原生支持。
了解更多
如果您切换到 TSDS,您将自动受益于 Elasticsearch 未来针对指标时间序列所做的所有改进,无论是更高效的存储、查询性能还是新的聚合功能。如果您想了解有关 TSDS 在底层如何工作以及所有可用配置选项的更多信息,请查看TSDS 文档。Elasticsearch 在 8.7 中支持的只是 Elasticsearch 中指标时间序列的第一次迭代。
自 8.7 版本以来可以使用 TSDS,并且随着集成的升级,它将自动出现在我们越来越多的集成中。您只会注意到存储使用量更低和查询速度更快。享受吧!