Elasticsearch 用于各种数据类型,其中一种是指标。多年前引入 Metricbeat,之后又推出了 APM 代理,指标用例变得越来越流行。多年来,Elasticsearch 在处理指标聚合和稀疏文档方面进行了许多改进。同时,引入了TSVB 可视化,使指标可视化更容易。大多数其他指标解决方案都具备时间序列和维度概念,而 Elasticsearch 此前缺少这一概念。
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 值重建它。尤其是在指标用例中,保留源几乎没有好处。
不存储它意味着显着减少存储空间。时间序列数据流根据维度和时间戳对数据进行排序。这意味着通常一起查询的数据一起存储,从而加快了查询时间。这也意味着单个时间序列的数据点彼此相邻地存储在磁盘上。由于计数器增加的速率通常相对恒定,因此这可以进一步压缩数据。
指标类型
但是,为了充分利用 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 值重建。上面添加的附加字段是 @timestamp。这很重要,因为它是任何数据流的必需字段。
为什么这对可观测性如此重要?
Elastic 可观测性解决方案的优势之一是,它在一个存储引擎中将所有信号整合到一个位置。用户可以一起查询日志、指标和跟踪,而无需在不同系统之间切换。因此,对日志和指标而言,拥有出色的存储和查询引擎对我们至关重要。
在集成中使用 TSDS
借助集成,我们为用户提供了开箱即用的体验,可以与他们的基础设施和服务集成。如果您使用的是我们的集成,最终您将自动获得 TSDS 对指标的所有好处,前提是您使用的是 8.7 或更高版本。
目前,我们正在处理我们的集成软件包列表,添加维度、指标类型字段,然后为指标数据流启用 TSDS。这意味着,一旦软件包启用了所有属性,您只需升级集成,其他所有操作都将在后台自动完成。
要在 Kibana 中可视化您的时间序列,请使用Lens,它内置了对 TSDS 的原生支持。
了解更多信息
如果您切换到 TSDS,您将自动受益于 Elasticsearch 对指标时间序列的所有未来改进,无论是更高效的存储、查询性能还是新的聚合功能。如果您想了解有关 TSDS 内部工作原理和所有可用配置选项的更多信息,请查看TSDS 文档。Elasticsearch 在 8.7 版本中支持的只是 Elasticsearch 中指标时间序列的第一次迭代。
自 8.7 版本起可以使用 TSDS,并且在集成升级时,它将自动集成到越来越多的集成中。您唯一会注意到的就是更低的存储使用率和更快的查询速度。尽情享受吧!