Nicolas Ruflin

如何使用 Elasticsearch 和时间序列数据流进行可观测性指标监控

借助时间序列数据流 (TSDS),Elasticsearch 引入了针对指标时间序列的优化存储。了解我们如何将其用于 Elastic 可观测性。

阅读时间:7分钟
How to use Elasticsearch and Time Series Data Streams for observability metrics

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_values: true)
  • 索引(用于过滤和搜索的 index: true)

使用合成源,不会持久化 _source 字段;而是从 doc 值重建它。尤其是在指标用例中,保留源几乎没有好处。

不存储它意味着显着减少存储空间。时间序列数据流根据维度和时间戳对数据进行排序。这意味着通常一起查询的数据一起存储,从而加快了查询时间。这也意味着单个时间序列的数据点彼此相邻地存储在磁盘上。由于计数器增加的速率通常相对恒定,因此这可以进一步压缩数据。

指标类型

但是,为了充分利用 TSDS 的所有优势,必须使用以下方法扩展指标字段的字段属性:

time_series_metric: {type}
支持多种类型,例如,上面使用了 gauge 和 counter。让 Elasticsearch 了解指标类型,可以让 Elasticsearch 为不同类型提供更优化的查询,并进一步减少存储使用。

当您在数据流命名方案下创建自己的数据流模板时,务必设置 "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,并且在集成升级时,它将自动集成到越来越多的集成中。您唯一会注意到的就是更低的存储使用率和更快的查询速度。尽情享受吧!

分享这篇文章