重新路由处理器

编辑

reroute 处理器允许将文档路由到另一个目标索引或数据流。它有两种主要模式

当设置 destination 选项时,目标被显式指定,并且不能设置 datasetnamespace 选项。

destination 选项未设置时,此处理器处于数据流模式。请注意,在这种模式下,reroute 处理器只能在遵循数据流命名方案的数据流上使用。尝试在名称不合规的数据流上使用此处理器将引发异常。

数据流的名称由三部分组成:<type>-<dataset>-<namespace>。有关更多详细信息,请参阅数据流命名方案文档。

此处理器可以使用静态值或引用文档中的字段来确定新目标的 datasetnamespace 组件。有关更多详细信息,请参阅表 39,“重新路由选项”

无法使用 reroute 处理器更改数据流的 type

在执行 reroute 处理器后,将跳过当前管道的所有其他处理器,包括最终管道。如果当前管道在管道的上下文中执行,则调用管道也将被跳过。这意味着在管道中最多只执行一个 reroute 处理器,允许定义互斥的路由条件,类似于 if、else-if、else-if、… 条件。

重新路由处理器确保根据新目标设置 data_stream.<type|dataset|namespace> 字段。如果文档包含 event.dataset 值,它将被更新以反映与 data_stream.dataset 相同的值。

请注意,客户端需要具有对最终目标的权限。否则,文档将被拒绝并出现如下所示的安全异常

{"type":"security_exception","reason":"action [indices:admin/auto_create] is unauthorized for API key id [8-dt9H8BqGblnY2uSI--] of user [elastic/fleet-server] on indices [logs-foo-default], this action is granted by the index privileges [auto_configure,create_index,manage,all]"}

表 39. 重新路由选项

名称 必需 默认 描述

destination

-

目标的静态值。当设置 datasetnamespace 选项时,不能设置此项。

dataset

{{data_stream.dataset}}

数据流名称的 dataset 部分的字段引用或静态值。除了 索引名称 的标准之外,不能包含 - 且长度不得超过 100 个字符。示例值为 nginx.accessnginx.error

支持带有类似 Mustache 语法的字段引用(表示为 {{double}}{{{triple}}} 花括号)。解析字段引用时,处理器会将无效字符替换为 _。如果所有字段引用解析为 null、缺失或非字符串值,则使用索引名称的 <dataset> 部分作为回退。

namespace

{{data_stream.namespace}}

数据流名称的 namespace 部分的字段引用或静态值。有关允许的字符,请参阅 索引名称 的标准。长度不得超过 100 个字符。

支持带有类似 Mustache 语法的字段引用(表示为 {{double}}{{{triple}}} 花括号)。解析字段引用时,处理器会将无效字符替换为 _。如果所有字段引用解析为 null、缺失或非字符串值,则使用索引名称的 <namespace> 部分作为回退。

description

-

处理器的描述。可用于描述处理器的目的或其配置。

if

-

有条件地执行处理器。请参阅有条件地运行处理器

ignore_failure

false

忽略处理器的失败。请参阅处理管道失败

on_failure

-

处理处理器的失败。请参阅处理管道失败

tag

-

处理器的标识符。可用于调试和指标。

if 选项可用于定义将文档重新路由到新目标时应满足的条件。

{
  "reroute": {
    "tag": "nginx",
    "if" : "ctx?.log?.file?.path?.contains('nginx')",
    "dataset": "nginx"
  }
}

dataset 和 namespace 选项可以包含单个值或用作回退的值列表。如果字段引用评估为 null,则不会出现在文档中,将使用下一个值或字段引用。如果字段引用评估为非 String 值,则处理器将失败。

在以下示例中,处理器将首先尝试解析 service.name 字段的值以确定 dataset 的值。如果该字段解析为 null、缺失或非字符串值,它将尝试列表中的下一个元素。在这种情况下,这是静态值 "generic"。 namespace 选项仅配置为单个静态值。

{
  "reroute": {
    "dataset": [
        "{{service.name}}",
        "generic"
    ],
    "namespace": "default"
  }
}