随着 Elasticsearch 生态系统的发展,旨在简化数据管理的工具和方法也在不断发展。一个将显著惠及我们社区的进步是 ecs@mappings 组件模板。
ECS(Elastic 通用模式)是日志和指标的标准化数据模型。它定义了一组通用字段名称和数据类型,有助于确保一致性和兼容性。
Elastic 通用模式和 Open Telemetry
Elastic 将通过捐赠 ECS 给 Open Telemetry 来保护用户在 Elastic 通用模式上的投入。Elastic 参与并与 OTel 社区合作,以便随着时间的推移合并 ECS 和 Open Telemetry 的语义约定。
ECS 映射的演变
从历史上看,用户和集成开发人员在各个索引模板和包中手动定义 ECS(Elastic 通用模式)映射,每个都细致地列出其字段。尽管简单明了,但这种方法被证明是耗时的,并且难以维护。
为了应对这一挑战,集成开发人员转向两种主要方法
- 引用 ECS 映射
- 直接导入 ECS 映射
这些方法是朝着正确方向迈出的一步,但引入了它们的挑战,例如使 ECS 映射与 Elasticsearch 更改保持同步的维护成本。
进入 ecs@mappings
ecs@mappings 组件模板通过利用命名约定和一组动态模板来支持 ECS 中的所有字段定义。
Elastic 开始发布
借助 Elasticsearch v8.13.0,Elastic 现在将
此举是一项突破,因为
- 集中式且官方:使用 ecs@mappings,我们现在有了 ECS 映射的官方定义。
- 开箱即用的功能:ECS 映射已准备就绪,减少了对其他导入或引用的需求。
- 简化的维护:由于 Elasticsearch 本身的模板保持最新,手动跟上 ECS 更改的需求已经减少。
增强的一致性和可靠性
使用
社区用户如何受益
社区用户可以从采用
- 减少配置麻烦:无论您是高级用户还是刚开始使用,简化的设置意味着更少的配置步骤和更少的出错机会。
- 提高数据完整性:由于 ecs@mappings 确保字段定义准确且最新,因此可以轻松维护数据完整性。
- 更好的性能:由于维护和引用 ECS 字段的开销减少,您的 Elasticsearch 操作将更加顺畅。
- 增强的文档和可发现性:随着我们标准化 ECS 映射,文档可以集中化,使用户更容易发现和理解 ECS 字段。
让我们来探索
减少配置麻烦
现代 Elasticsearch 版本附带开箱即用的完整 ECS 字段支持(有关特定版本,请参阅后面的“要求”部分)。
例如,安装在受支持的 Elasticsearch 集群上的自定义 AWS 日志集成已经在其索引模板中包含
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 字段定义非常紧凑;在撰写本文时,它只有 228 行,并且支持所有 ECS 字段。要了解更多信息,请参阅
它依赖于命名约定并使用动态模板来实现这种紧凑性。
延迟映射
由于使用了动态模板,Elasticsearch 只会将现有文档字段添加到映射中。延迟映射使内存开销保持在最低水平,从而提高群集性能并使字段建议更具相关性。
增强的文档和可发现性
所有 Elastic Agent 集成都在迁移到
入门
要求
要利用
- 8.9.0:如果您的数据流使用日志索引模板或您定义自己的索引模板。
- 8.13.0:如果您的数据流使用 Elastic Agent 集成的索引模板。
示例
我们将使用自定义 AWS 日志集成向您展示
假设您想使用自定义 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"
]
}
}
]
}
的索引模板
如果我们尝试索引测试文档
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 中,诸如以下字段
这些映射与 ECS 对齐,因此用户和开发人员不必维护它们。 这同样适用于 Elastic Common Schema 中的所有数百个字段定义。您可以通过在数据流中包含一个 200 行的组件模板来实现这一点。
注意事项
值得一提的是 ecs@mappings 组件模板处理数据类型的一些方面。
ECS 类型不强制执行
该
例如,如果您发送以下包含 faas.coldstart 字段(在 ECS 中定义为布尔值)的文档
{
"faas.coldstart": "true"
}
Elasticsearch 将映射
这是拥有紧凑且高效的 ecs@mappings 组件模板的权衡。当处理 ECS 和自定义字段的混合时,它还允许更好的兼容性,因为如果类型与 ECS 中定义的类型不一致,文档将不会被拒绝。
结论
的引入
无论您是集成开发人员还是社区用户,迁移到
加入讨论
您对以下内容有疑问或反馈吗
映射愉快!