作者:Lalit Satapathy
Elasticsearch® 最近发布了用于指标的时间序列数据流。 这不仅为 Elastic Observability 提供了更好的指标支持,而且还有助于降低存储成本。 我们在之前的博客中讨论过这个问题。
在本博客中,我们通过回顾什么是时间序列指标文档(document)以及用于启用时间序列的映射(mapping),深入探讨如何启用和使用时间序列数据流。 特别是,我们将通过使用 Elastic Observability 的 Nginx 集成来展示这一点。 随着 Elastic® 时间序列数据流 (Time Series Data Strream - TSDS) 指标功能的发展,以下一些场景将会发生变化。
Elastic TSDS 将指标存储在针对时间序列数据库 (TSDB) 优化的索引中,TSDB 用于存储时间序列指标。 Elastic 的 TSDB 在 8.7 中也得到了显着优化,存储成本降低了 70% 以上。
什么是 Elastic 时间序列数据流?
时间序列数据流 (TSDS) 将带时间戳的指标数据建模为一个或多个时间序列。 在 TSDS 中,每个 Elasticsearch 文档代表特定时间序列中的一个观察或数据点。 虽然一份 TSDS 可以包含多个时间序列,但一篇文档只能属于一个时间序列。 时间序列不能跨越多个数据流。
常规数据流可以有不同的用途,包括日志。 但是,对于指标使用,建议使用时间序列数据流。 时间序列数据流在很多方面与常规数据流不同。 TSDS 包含多个预定义维度和多个指标。
以 Nginx 指标为例
集成(integrations)提供了一种简单的方法来获取大量服务和系统的可观察性指标。 我们在这里使用 Nginx 集成指标数据集作为示例。 这是最近启用的时间序列集成之一。
在包上启用 TSDS 的过程
添加相关时间序列指标和维度映射后,在集成包的指标数据流上启用时间序列。 与指标数据流的现有集成将启用时间序列指标,以便用户可以按原样使用它们,而无需任何其他配置。
下图捕获了时间序列数据流、相应索引模板、时间序列索引和单个文档的高级摘要。 我们将很快深入了解文档中每个字段的详细信息。
TSDS 指标文件
下面我们提供了提取的 Elastic 文档的片段,其中包含时间序列指标和维度。
`
1. {
2. "@timestamp": "2023-06-29T03:58:12.772Z",
4. "nginx": {
5. "stubstatus": {
6. "accepts": 202,
7. "active": 2,
8. "current": 3,
9. "dropped": 0,
10. "handled": 202,
11. "hostname": "host.docker.internal:80",
12. "reading": 0,
13. "requests": 10217,
14. "waiting": 1,
15. "writing": 1
16. }
17. }
18. }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
每个文档多个指标:
摄取的文档具有字段集合,包括指标字段。 多个相关的指标字段可以是单个文档的一部分。 文档是单个数据流的一部分,通常它包含的所有指标都是相关的。 文档中的所有指标都是同一时间序列的一部分。
作为映射的指标类型和维度:
虽然文档包含指标详细信息,但指标类型和维度详细信息被定义为字段映射的一部分。 作为包开发的一部分,所有时间序列相关的字段映射都是针对给定数据流共同定义的。 与时间序列数据流一起发布的所有集成都包含所有相关的时间序列字段映射,作为包发布的一部分。 特别需要两个附加映射:time_series_metric 映射和 time_series_dimension 映射。
指标类型字段
文档包含指标类型字段(如上所示)。 指标类型字段的映射是使用索引模板中的 time_series_metric 映射完成的,如下所示:
1. "nginx": {
2. "properties": {
3. "stubstatus": {
4. "properties": {
5. "accepts": {
6. "type": "long",
7. "time_series_metric": "counter"
8. },
9. "active": {
10. "type": "long",
11. "time_series_metric": "gauge"
12. },
13. "current": {
14. "type": "long",
15. "time_series_metric": "gauge"
16. },
17. "dropped": {
18. "type": "long",
19. "time_series_metric": "counter"
20. },
21. "handled": {
22. "type": "long",
23. "time_series_metric": "counter"
24. },
25. "reading": {
26. "type": "long",
27. "time_series_metric": "gauge"
28. },
29. "requests": {
30. "type": "long",
31. "time_series_metric": "counter"
32. },
33. "waiting": {
34. "type": "long",
35. "time_series_metric": "gauge"
36. },
37. "writing": {
38. "type": "long",
39. "time_series_metric": "gauge"
40. }
41. }
42. }
43. }
44. }
维度字段
维度(dimensions)是字段名称和值,它们组合起来标识文档的时间序列。
在 Elastic 时间序列中,维度还有一些额外的考虑因素:
- 需要为每个时间序列定义维度字段。 不会有零维度字段的时间序列。
- 关键字(keyword,或类似)类型字段可以定义为维度。
- 当前可以在数据流中定义的维度数量存在限制。 未来限制可能会取消。
维度对于单个文档中的所有指标是通用的,作为数据流的一部分。 包(例如:Nginx)的每个时间序列数据流都带有一组预定义的维度字段,如下所示。
该文档将包含多个维度字段。 对于 Nginx,agend.id 和 nginx.stubstatus.hostname 是一些维度字段。 维度字段的映射是使用 time_series_dimension 映射完成的,如下所示:
1. "agent": {
2. "properties": {
3. "id": {
4. "type": "keyword",
5. "time_series_dimension": true
6. }
7. }
8. },
10. "nginx": {
11. "properties": {
12. "stubstatus": {
13. "properties": {
14. "hostname": {
15. "type": "keyword",
16. "time_series_dimension": true
17. },
18. }
19. }
20. }
21. }
元字段 - Meta fields
除了上面解释的指标和维度字段之外,摄取的文档还具有其他元字段。 这些附加字段为指标提供了更丰富的查询功能。
Elastic 元字段示例
1. "data_stream": {
2. "dataset": "nginx.stubstatus",
3. "namespace": "default",
4. "type": "metrics"
5. }
在 Kibana 中 Discover 和可视化
Elastic 为时间序列指标提供全面的搜索和可视化。 可以在 Discover 中按原样搜索时间序列指标。 在下面的搜索中,计数器(counters)和仪表(gauges)指标被捕获为不同的图标。 下面我们还提供了使用 Nginx 集成包中包含的 Lens 和 OOTB 仪表板进行时间序列指标可视化的示例。
Discover TSDS 指标搜索
使用 Lens 可视化的计数器字段 nginx.stubstatus.accepts 的最大值
带有 TSDS 指标可视化的 OOTB Nginx 仪表板
试试看!
我们提供了由 Elastic Nginx 集成摄取的时间序列文档的详细示例。 我们已经通过示例了解了如何在 Elastic 中对时间序列指标进行建模以及其他时间序列映射。 我们提供了 Elastic 时间序列的维度要求的详细信息,以及 Kibana® 中 TSDS 指标的搜索/可视化/仪表板的简要示例。
还没有 Elastic Cloud 帐户? 注册 Elastic Cloud 并尝试我上面讨论的自动检测功能。 我很想了解你对使用 Elastic 了解应用程序堆栈的体验的反馈。
原文:Exploring Nginx metrics with Elastic time series data streams | Elastic Blog