在 Elasticsearch 8.8 中,我们推出了技术预览版的重定向处理器,它使您可以根据灵活的路由规则将日志等文档发送到不同的数据流。当使用 Elastic Observability 时,这使您可以更好地控制数据的保留、权限和处理,并充分利用数据流命名方案的潜在优势。虽然重定向处理器针对数据流进行了优化,但它也适用于传统的索引。本博文包含有关如何使用重定向处理器的示例,您可以通过在Kibana 开发工具中执行代码片段来自己尝试。
Elastic Observability 提供了广泛的集成,可帮助您监控应用程序和基础设施。这些集成作为策略添加到 Elastic Agent 中,后者有助于将遥测数据提取到 Elastic Observability 中。这些集成的几个示例包括从发送来自不同应用程序的日志流的系统中提取日志的功能,例如Amazon Kinesis Data Firehose、Kubernetes 容器日志和 syslog。一个挑战是,这些多路复用日志流将数据发送到同一个 Elasticsearch 数据流,例如 logs-syslog-default。这使得在提取管道和仪表板中为特定技术(如来自 Nginx 和 Apache 集成的技术)创建解析规则变得困难。这是因为在 Elasticsearch 中,结合 数据流命名方案,处理和架构都封装在一个数据流中。
重定向处理器可帮助您将数据从通用数据流中分离出来,并将其发送到更具体的数据流。例如,您可以使用该机制将日志发送到 Nginx 集成设置的数据流,以便使用该集成解析日志,并且您可以使用该集成的预构建仪表板或使用字段(例如 URL、状态代码和响应时间,Nginx 管道已从 Nginx 日志消息中解析出来)创建自定义仪表板。您还可以使用重定向处理器拆分/分离常规 Nginx 日志和错误,从而进一步分离和分类日志。
示例用例
要使用重定向处理器,首先
-
确保您使用的是 Elasticsearch 8.8
-
确保您具有管理索引和数据流的权限
-
如果您尚未在 Elastic Cloud 上拥有帐户,请注册一个
接下来,您需要设置数据流并创建自定义 Elasticsearch 提取管道,该管道被称为默认管道。下面我们将逐步介绍“mydata”数据集的步骤,我们将模拟将容器日志提取到该数据集中。我们从一个基本示例开始,然后从那里进行扩展。
以下步骤应在 Elastic 控制台中使用,该控制台位于管理 -> 开发工具 -> 控制台中。首先,我们需要一个提取管道和一个数据流模板
PUT _ingest/pipeline/logs-mydata
{
"description": "Routing for mydata",
"processors": [
{
"reroute": {
}
}
]
}
这将创建一个具有空重定向处理器的提取管道。要使用它,我们需要一个索引模板
PUT _index_template/logs-mydata
{
"index_patterns": [
"logs-mydata-*"
],
"data_stream": {},
"priority": 200,
"template": {
"settings": {
"index.default_pipeline": "logs-mydata"
},
"mappings": {
"properties": {
"container.name": {
"type": "keyword"
}
}
}
}
}
上面的模板应用于发送到 logs-mydata-* 的所有数据。我们将 container.name 映射为关键字,因为这是我们稍后将用于路由的字段。现在,我们将文档发送到数据流,它将被提取到 logs-mydata-default 中
POST logs-mydata-default/_doc
{
"@timestamp": "2023-05-25T12:26:23+00:00",
"container": {
"name": "foo"
}
}
我们可以使用以下命令检查是否已提取,该命令将显示 1 个结果。
GET logs-mydata-default/_search
在不修改路由处理器的情况下,这已经允许我们路由文档。一旦指定了重定向处理器,它将默认查找 data_stream.dataset 和 data_stream.namespace 字段,并将根据数据流命名方案 logs-<dataset>-<namespace> 将文档发送到相应的数据流。让我们试一下
POST logs-mydata-default/_doc
{
"@timestamp": "2023-03-30T12:27:23+00:00",
"container": {
"name": "foo"
},
"data_stream": {
"dataset": "myotherdata"
}
}
正如使用 GET logs-mydata-default/_search 命令所看到的,此文档最终位于 logs-myotherdata-default 数据流中。但是,我们不想使用默认规则,而是想为字段 container.name 创建自己的规则。如果该字段为 container.name = foo,我们想将其发送到 logs-foo-default。为此,我们修改我们的路由管道
PUT _ingest/pipeline/logs-mydata
{
"description": "Routing for mydata",
"processors": [
{
"reroute": {
"tag": "foo",
"if" : "ctx.container?.name == 'foo'",
"dataset": "foo"
}
}
]
}
让我们用一个文档测试一下
POST logs-mydata-default/_doc
{
"@timestamp": "2023-05-25T12:26:23+00:00",
"container": {
"name": "foo"
}
}
虽然可以为每个容器名称指定路由规则,但也可以按文档中字段的值进行路由
PUT _ingest/pipeline/logs-mydata
{
"description": "Routing for mydata",
"processors": [
{
"reroute": {
"tag": "mydata",
"dataset": [
"{{container.name}}",
"mydata"
]
}
}
]
}
在此示例中,我们使用字段引用作为路由规则。如果文档中存在 container.name 字段,它将被路由 — 否则将回退到 mydata。这可以使用以下命令进行测试
POST logs-mydata-default/_doc
{
"@timestamp": "2023-05-25T12:26:23+00:00",
"container": {
"name": "foo1"
}
}
POST logs-mydata-default/_doc
{
"@timestamp": "2023-05-25T12:26:23+00:00",
"container": {
"name": "foo2"
}
}
这将创建数据流 logs-foo1-default 和 logs-foo2-default。
注意:处理器目前存在一个限制,要求在
API 密钥
使用重定向处理器时,指定的 API 密钥必须具有源索引和目标索引的权限。例如,如果模式用于从 logs-mydata-default 进行路由,则 API 密钥必须具有以下写入权限
我们目前正在努力扩展我们的集成的 API 密钥权限,以便如果您运行 Fleet 管理的 Elastic Agent,它们默认允许路由。
如果您使用的是独立的 Elastic Agent 或任何其他托运人,则可以使用此模板创建您的 API 密钥
POST /_security/api_key
{
"name": "ingest_logs",
"role_descriptors": {
"ingest_logs": {
"cluster": [
"monitor"
],
"indices": [
{
"names": [
"logs-*-*"
],
"privileges": [
"auto_configure",
"create_doc"
]
}
]
}
}
}
未来计划
在 Elasticsearch 8.8 中,重定向处理器以技术预览版发布。计划是在我们的数据接收器集成(如 syslog、k8s 等)中采用此处理器。Elastic 将提供开箱即用的默认路由规则,但用户也可以添加自己的规则。如果您正在使用我们的集成,请按照本指南了解如何添加自定义提取管道。
试用一下!
本博文展示了基于文档路由的一些示例用例。通过调整索引模板和提取管道的命令以适应您自己的数据,在您自己的数据上尝试一下,并通过 7 天免费试用开始使用 Elastic Cloud。请通过此反馈表单告知我们您计划如何使用重定向处理器,以及您是否有改进建议。