自定义字段编辑

ECS 定义字段、数据类型和使用方法,并将它们分类为“核心”和“扩展”级别。

然而,ECS 并没有定义任何关于自定义字段的内容。根据定义,它们是额外的字段,完全按照用户或集成定义,独立于 ECS。

用户和集成可以使用自定义字段来捕获事件中的附加信息。这种灵活性是经过设计的,确保没有人会被 ECS 尚不支持的内容所阻碍。

然而,ECS 正在积极开发中。添加自定义字段存在与未来 ECS 字段冲突的风险。可以通过对自定义字段进行建模来降低与未来 ECS 版本发生冲突的可能性。本节将概述其中的一些策略。

建模以降低冲突的可能性编辑

labels 字段编辑

当数据源有一些可以使用 keyword 数据类型建模的额外字段时,捕获它们的最简单方法是使用 ECS 字段 labels

示例

{ "labels": { "foo_id": "beef42", "env": "production" },
  "message": "...",
  "event": { ... }
}

如果 labels 不适用于您的用例,这里有一些避免冲突的额外技巧。

适当的名称编辑

ECS 试图通过使用概念名称来建模信息,并避免使用诸如工具名称、项目名称或公司名称之类的专有名词。扩展来说,将自定义字段嵌套在专有名词下是一种比较安全的添加自定义字段的方法。例如,Filebeats 模块采用了这种方法。

例如,来自 HAProxy 的 HTTP 日志将包含典型的 HTTP 信息,以及代理详细信息和统计信息。标准 HTTP 信息可以捕获在 ECS 字段集 httpurl 中,而额外的详细信息则可以捕获在自定义 haproxy 部分中

{ "http": { "request": { "method": "get", ... },
            "response": { "status_code": 200, ... } },
  "url": { "original": "/favicon.ico", ... },
  "haproxy": { "frontend_name": "myfrontend", "backend_name": "mybackend_prod",
               "backend_queue": 0, ... }
}
首字母大写编辑

ECS 努力通过使用嵌套来分组相关概念,并使用下划线来连接单词,从而保持一致的感觉。遵循这些自定义字段准则可以确保你在整个架构中保持一致的体验。

但是请注意,为了您的自定义字段,可以打破这些准则,这对您来说可能是有利的。这可以成为区分 ECS 字段和自定义字段的好方法。由于 ECS 不对字段名称使用首字母大写,因此这种方法几乎可以保证自定义字段不会与未来的 ECS 字段发生冲突。

常见代理概念可以通过首字母大写的通用概念名称来建模。

HAProxy 示例

{ "http": { "request": { "method": "get", ... } },
  "url": { "original": "/favicon.ico", ... },
  "Proxy": { "FrontendName": "myfrontend", "BackendName": "mybackend_prod" },
  "event": { "module": "haproxy" }
}

NGINX 示例

{ "http": { "request": { "method": "get", ... } },
  "url": { "original": "/favicon.ico", ... },
  "Proxy": { "FrontendName": "another_frontend", "BackendName": "another_backend_prod" },
  "event": { "module": "nginx" }
}

上述示例表明,在自定义字段中使用通用概念名称仍然有利于在填充它们的多个源之间进行关联。使用首字母大写可以确保未来版本的 ECS 定义的 proxy 字段集不会发生冲突。

以下是一个示例事件,它演示了从自定义字段迁移到使用新的等效 ECS 字段集的过程

{ "http": { "request": { "method": "get", ... } },
  "Proxy": { "FrontendName": "myfrontend", "BackendName": "mybackend_prod" },
  "proxy": { "frontend_name": "myfrontend", "backend_name": "mybackend_prod" }
}

上述示例在迁移过程中会显得奇怪。但是,能够在自定义字段仍然存在于事件中的情况下开始填充 ECS 字段,可以使你将升级到新版本的 ECS 与调整管道和分析内容的时间脱钩。