Maurizio Branca

使用 ecs@mappings 模板让您的日志面向未来

了解 Elasticsearch 中的 ecs@mappings 组件模板如何通过提供 Elastic 通用模式 (ECS) 映射的集中式官方定义来简化数据管理。了解其优势,包括减少配置麻烦、提高数据完整性以及增强集成开发人员和社区用户的性能。了解此功能如何简化 Elastic Agent 集成中的 ECS 字段支持并使您的数据流面向未来。

16 分钟阅读
Future-proof your logs with ecs@mappings template

随着 Elasticsearch 生态系统的发展,旨在简化数据管理的工具和方法也在不断发展。一个将显著惠及我们社区的进步是 ecs@mappings 组件模板。

ECS(Elastic 通用模式)是日志和指标的标准化数据模型。它定义了一组通用字段名称和数据类型,有助于确保一致性和兼容性。

ecs@mappings
是一个组件模板,它提供了一个由 Elastic 维护的 ECS 映射定义。每个 Elasticsearch 版本都包含所有 ECS 字段的最新定义。

Elastic 通用模式和 Open Telemetry

Elastic 将通过捐赠 ECS 给 Open Telemetry 来保护用户在 Elastic 通用模式上的投入。Elastic 参与并与 OTel 社区合作,以便随着时间的推移合并 ECS 和 Open Telemetry 的语义约定。

ECS 映射的演变

从历史上看,用户和集成开发人员在各个索引模板和包中手动定义 ECS(Elastic 通用模式)映射,每个都细致地列出其字段。尽管简单明了,但这种方法被证明是耗时的,并且难以维护。

为了应对这一挑战,集成开发人员转向两种主要方法

  1. 引用 ECS 映射
  2. 直接导入 ECS 映射

这些方法是朝着正确方向迈出的一步,但引入了它们的挑战,例如使 ECS 映射与 Elasticsearch 更改保持同步的维护成本。

进入 ecs@mappings

ecs@mappings 组件模板通过利用命名约定和一组动态模板来支持 ECS 中的所有字段定义。

Elastic 开始发布

ecs@mappings
带有 Elasticsearch v8.9.0 的组件模板,将其包含在 logs-- 索引模板中。

借助 Elasticsearch v8.13.0,Elastic 现在将

ecs@mappings
包含在所有 Elastic Agent 集成的索引模板中。

此举是一项突破,因为

  • 集中式且官方:使用 ecs@mappings,我们现在有了 ECS 映射的官方定义。
  • 开箱即用的功能:ECS 映射已准备就绪,减少了对其他导入或引用的需求。
  • 简化的维护:由于 Elasticsearch 本身的模板保持最新,手动跟上 ECS 更改的需求已经减少。

增强的一致性和可靠性

使用

ecs@mappings
,ECS 映射成为单一事实来源。这种统一方法意味着集成之间的数据流中的差异更少,一致性更高。

社区用户如何受益

社区用户可以从采用

ecs@mappings
中获得多方面的收益。以下是主要优点

  1. 减少配置麻烦:无论您是高级用户还是刚开始使用,简化的设置意味着更少的配置步骤和更少的出错机会。
  2. 提高数据完整性:由于 ecs@mappings 确保字段定义准确且最新,因此可以轻松维护数据完整性。
  3. 更好的性能:由于维护和引用 ECS 字段的开销减少,您的 Elasticsearch 操作将更加顺畅。
  4. 增强的文档和可发现性:随着我们标准化 ECS 映射,文档可以集中化,使用户更容易发现和理解 ECS 字段。

让我们来探索

ecs@mappings
组件模板如何帮助用户实现这些好处。

减少配置麻烦

现代 Elasticsearch 版本附带开箱即用的完整 ECS 字段支持(有关特定版本,请参阅后面的“要求”部分)。

例如,安装在受支持的 Elasticsearch 集群上的自定义 AWS 日志集成已经在其索引模板中包含

ecs@mappings
组件模板

GET _index_template/logs-aws_logs.generic
{
  "index_templates": [
    {
      "name": "logs-aws_logs.generic",
      ...,
        "composed_of": [
          "logs@settings",
          "logs-aws_logs.generic@package",
          "logs-aws_logs.generic@custom",
          "ecs@mappings",
          ".fleet_globals-1",
          ".fleet_agent_id_verification-1"
        ],
    ...

无需导入或定义任何 ECS 字段。

提高数据完整性

ecs@mappings
组件模板支持所有现有的 ECS 字段。如果您在文档中使用任何 ECS 字段,它将准确地具有预期的类型。

为了确保

ecs@mappings
始终与ECS 存储库保持同步,我们设置了每日自动化测试,以确保组件模板支持所有字段。

更好的性能

紧凑的定义

ECS 字段定义非常紧凑;在撰写本文时,它只有 228 行,并且支持所有 ECS 字段。要了解更多信息,请参阅

ecs@mappings
组件模板源代码

它依赖于命名约定并使用动态模板来实现这种紧凑性。

延迟映射

由于使用了动态模板,Elasticsearch 只会将现有文档字段添加到映射中。延迟映射使内存开销保持在最低水平,从而提高群集性能并使字段建议更具相关性。

增强的文档和可发现性

所有 Elastic Agent 集成都在迁移到

ecs@mappings
组件模板。这些集成不再需要添加和维护 ECS 字段映射,并且可以引用官方ECS 字段参考或 Git 存储库中的 ECS 源代码:https://github.com/elastic/ecs/

入门

要求

要利用

ecs@mappings
组件模板,请确保以下堆栈版本

  • 8.9.0:如果您的数据流使用日志索引模板或您定义自己的索引模板。
  • 8.13.0:如果您的数据流使用 Elastic Agent 集成的索引模板。

示例

我们将使用自定义 AWS 日志集成向您展示

ecs@mapping
如何处理任何开箱即用的 ECS 字段的映射。

假设您想使用自定义 AWS 日志集成来摄取以下日志事件

{
  "@timestamp": "2024-06-11T13:16:00+02:00", 
  "command_line": "ls -ltr",
  "custom_score": 42
}

开发工具

Kibana 提供了一个出色的工具,用于试验 Elasticseatch API,即开发工具控制台。借助开发工具,用户可以快速轻松地运行所有 API 请求。

打开开发工具

  • 打开 Kibana
  • 选择 管理 > 开发工具 > 控制台

Elasticsearch 版本 < 8.13

在 8.13 之前的 Elasticsearch 版本中,自定义 AWS 日志集成具有以下索引模板

GET _index_template/logs-aws_logs.generic
{
  "index_templates": [
    {
      "name": "logs-aws_logs.generic",
      "index_template": {
        "index_patterns": [
          "logs-aws_logs.generic-*"
        ],
        "template": {
          "settings": {},
          "mappings": {
            "_meta": {
              "package": {
                "name": "aws_logs"
              },
              "managed_by": "fleet",
              "managed": true
            }
          }
        },
        "composed_of": [
          "logs-aws_logs.generic@package",
          "logs-aws_logs.generic@custom",
          ".fleet_globals-1",
          ".fleet_agent_id_verification-1"
        ],
        "priority": 200,
        "_meta": {
          "package": {
            "name": "aws_logs"
          },
          "managed_by": "fleet",
          "managed": true
        },
        "data_stream": {
          "hidden": false,
          "allow_custom_routing": false
        }
      }
    }
  ]
}

如您所见,它不包含 ecs@mappings 组件模板。

如果我们尝试索引测试文档

POST logs-aws_logs.generic-default/_doc
{
  "@timestamp": "2024-06-11T13:16:00+02:00", 
  "command_line": "ls -ltr",
  "custom_score": 42
}

数据流将具有以下映射

GET logs-aws_logs.generic-default/_mapping/field/command_line
{
  ".ds-logs-aws_logs.generic-default-2024.06.11-000001": {
    "mappings": {
      "command_line": {
        "full_name": "command_line",
        "mapping": {
          "command_line": {
            "type": "keyword",
            "ignore_above": 1024
          }
        }
      }
    }
  }
}

GET logs-aws_logs.generic-default/_mapping/field/custom_score
{
  ".ds-logs-aws_logs.generic-default-2024.06.11-000001": {
    "mappings": {
      "custom_score": {
        "full_name": "custom_score",
        "mapping": {
          "custom_score": {
            "type": "long"
          }
        }
      }
    }
  }
}

这些映射与 ECS 不一致,因此用户和开发人员必须维护它们。

Elasticsearch 版本 >= 8.13

在等于或新于 8.13 的 Elasticsearch 版本中,自定义 AWS 日志集成具有以下索引模板

GET _index_template/logs-aws_logs.generic
{
  "index_templates": [
    {
      "name": "logs-aws_logs.generic",
      "index_template": {
        "index_patterns": [
          "logs-aws_logs.generic-*"
        ],
        "template": {
          "settings": {},
          "mappings": {
            "_meta": {
              "package": {
                "name": "aws_logs"
              },
              "managed_by": "fleet",
              "managed": true
            }
          }
        },
        "composed_of": [
          "logs@settings",
          "logs-aws_logs.generic@package",
          "logs-aws_logs.generic@custom",
          "ecs@mappings",
          ".fleet_globals-1",
          ".fleet_agent_id_verification-1"
        ],
        "priority": 200,
        "_meta": {
          "package": {
            "name": "aws_logs"
          },
          "managed_by": "fleet",
          "managed": true
        },
        "data_stream": {
          "hidden": false,
          "allow_custom_routing": false
        },
        "ignore_missing_component_templates": [
          "logs-aws_logs.generic@custom"
        ]
      }
    }
  ]
}

的索引模板

logs-aws_logs.generic
现在包含
ecs@mappings
组件模板。

如果我们尝试索引测试文档

POST logs-aws_logs.generic-default/_doc
{
  "@timestamp": "2024-06-11T13:16:00+02:00", 
  "command_line": "ls -ltr",
  "custom_score": 42
}

数据流将具有以下映射

GET logs-aws_logs.generic-default/_mapping/field/command_line
{
  ".ds-logs-aws_logs.generic-default-2024.06.11-000001": {
    "mappings": {
      "command_line": {
        "full_name": "command_line",
        "mapping": {
          "command_line": {
            "type": "wildcard",
            "fields": {
              "text": {
                "type": "match_only_text"
              }
            }
          }
        }
      }
    }
  }
}

GET logs-aws_logs.generic-default/_mapping/field/custom_score
{
  ".ds-logs-aws_logs.generic-default-2024.06.11-000001": {
    "mappings": {
      "custom_score": {
        "full_name": "custom_score",
        "mapping": {
          "custom_score": {
            "type": "float"
          }
        }
      }
    }
  }
}

在 Elasticsearch 8.13 中,诸如以下字段

command_line
custom_score
开箱即用地从 ECS 获取它们的定义。

这些映射与 ECS 对齐,因此用户和开发人员不必维护它们。 这同样适用于 Elastic Common Schema 中的所有数百个字段定义。您可以通过在数据流中包含一个 200 行的组件模板来实现这一点。

注意事项

值得一提的是 ecs@mappings 组件模板处理数据类型的一些方面。

ECS 类型不强制执行

ecs@mappings
组件模板不包含动态映射已使用正确字段类型的 ECS 字段的映射。 因此,如果您发送的字段值具有兼容但错误的类型,Elasticsearch 将不会强制转换该值。

例如,如果您发送以下包含 faas.coldstart 字段(在 ECS 中定义为布尔值)的文档

{
  "faas.coldstart": "true"
}

Elasticsearch 将映射

faas.coldstart
keyword
而不是
boolean
。 因此,您需要确保您摄取到 Elasticsearch 的值使用正确的 JSON 字段类型,根据它们在 ECS 中的定义方式。

这是拥有紧凑且高效的 ecs@mappings 组件模板的权衡。当处理 ECS 和自定义字段的混合时,它还允许更好的兼容性,因为如果类型与 ECS 中定义的类型不一致,文档将不会被拒绝。

结论

的引入

ecs@mappings
标志着在 Elasticsearch 中管理 ECS 映射方面的重大改进。通过集中和简化这些定义,我们可以确保更高的一致性、减少维护和更好的整体性能。

无论您是集成开发人员还是社区用户,迁移到

ecs@mappings
都代表着朝着更高效、更可靠的 Elasticsearch 操作迈出了一步。随着我们继续采纳反馈并改进我们的工具,您使用 Elasticsearch 的旅程只会更加顺畅和更有价值。

加入讨论

您对以下内容有疑问或反馈吗

ecs@mappings
? 在我们的社区讨论论坛Slack 实例上发布,并分享您的经验。您的意见对于帮助我们为整个社区微调这些改进至关重要。

映射愉快!