有效载荷转换

edit

有效载荷转换

edit

一个有效载荷转换处理并改变监视执行上下文中的有效载荷,以准备用于监视操作。Watcher支持三种类型的有效载荷转换:

有效载荷转换是可选的。当未定义任何转换时,操作可以访问由监视输入加载的有效载荷。

您可以在两个地方定义有效载荷转换:

  • 作为监视定义中的顶级结构。在这种情况下,负载在执行任何监视操作之前被转换。
  • 作为操作定义的一部分。在这种情况下,负载在该操作执行之前被转换。转换仅应用于该特定操作的负载。

如果所有操作都需要相同的负载视图,请在监视定义中定义一个负载转换。如果每个操作需要不同的负载视图,请在操作定义中定义不同的负载转换,以便每个操作都有其专用负载转换准备的负载。

以下示例定义了两个有效负载转换,一个在监视级别,另一个作为my_webhook操作定义的一部分。

{
  "trigger" : { ...}
  "input" : { ... },
  "condition" : { ... },
  "transform" : { 
    "search" : {
      "request": {
        "body" : { "query" : { "match_all" : {} } }
      }
    }
  },
  "actions" : {
    "my_webhook": {
      "transform" : { 
      	"script" : "return ctx.payload.hits"
      },
      "webhook" : {
      	"host" : "host.domain",
      	"port" : 8089,
      	"path" : "/notify/{{ctx.watch_id}}"
      }
    }
  ]
}

一个观察级别 transform

一个操作级别 transform

观察者搜索负载转换

edit

一个在集群上执行搜索并将当前监视执行上下文中的有效负载替换为返回的搜索响应的有效负载转换。以下代码片段展示了如何在监视级别定义一个简单的搜索转换:

{
  "transform" : {
    "search" : {
      "request" : {
        "body" : { "query" : { "match_all" : {} }}
      }
    }
  }
}

与其他基于搜索的构造一样,可以利用 Elasticsearch 支持的完整搜索 API。例如,以下搜索负载转换对所有事件索引执行搜索,匹配具有 error 优先级的事件:

{
  "transform" : {
    "search" : {
      "request" : {
        "indices" : [ "events-*" ],
        "body" : {
          "size" : 0,
          "query" : {
            "match" : { "priority" : "error"}
          }
        }
      }
    }
  }
}

下表列出了搜索负载转换的所有可用设置:

表89. 搜索负载转换设置

Name Required Default Description

request.search_type

查询然后获取

搜索 类型

request.indices

所有索引

一个或多个要搜索的索引。

request.body

match_all 查询

请求的主体。 请求体遵循 通常在REST _search请求主体中发送的相同结构。主体可以是静态文本 或包含mustache 模板

request.indices_options.expand_wildcards

打开

确定如何扩展索引通配符。一个由 openclosedhidden 组合而成的数组。或者一个值为 noneall。(参见 多目标语法)

request.indices_options.ignore_unavailable

一个布尔值,用于确定搜索是否应宽松地忽略不可用的索引(参见多目标语法

request.indices_options.allow_no_indices

一个布尔值,用于确定当没有索引被解析时,搜索是否应宽松地返回无结果(参见多目标语法

request.template

-

搜索模板的主体。更多信息请参见配置模板

timeout

30秒

等待搜索API调用返回的超时时间。如果在此时限内没有返回响应,搜索负载转换将超时并失败。此设置会覆盖默认的超时时间。

模板支持

edit

搜索负载转换支持mustache 模板。这可以作为主体定义的一部分,或者指向一个现有的模板(可以定义在文件中或存储为Elasticsearch中的脚本)。

例如,以下代码片段展示了一个搜索,该搜索引用了手表的预定时间:

{
  "transform" : {
    "search" : {
      "request" : {
        "indices" : [ "logstash-*" ],
        "body" : {
          "size" : 0,
          "query" : {
            "bool" : {
              "must" : {
                "match" : { "priority" : "error"}
              },
              "filter" : [
                {
                  "range" : {
                    "@timestamp" : {
                      "gte" : "{{ctx.trigger.scheduled_time}}||-30s",
                      "lte" : "{{ctx.trigger.triggered_time}}"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

模板的模型是提供的 template.params 设置与 标准监视执行上下文模型 的结合。

以下是使用引用所提供参数的模板的示例:

{
  "transform" : {
    "search" : {
      "request" : {
        "indices" : [ "logstash-*" ],
        "template" : {
          "source" : {
            "size" : 0,
            "query" : {
              "bool" : {
                "must" : {
                  "match" : { "priority" : "{{priority}}"}
                },
                "filter" : [
                  {
                    "range" : {
                      "@timestamp" : {
                        "gte" : "{{ctx.trigger.scheduled_time}}||-30s",
                        "lte" : "{{ctx.trigger.triggered_time}}"
                      }
                    }
                  }
                ]
              }
            },
            "params" : {
              "priority" : "error"
            }
          }
        }
      }
    }
  }
}

观察者脚本有效载荷转换

edit

一个在监视执行上下文中对当前载荷执行脚本并将其替换为新生成的载荷的载荷转换。以下代码片段展示了如何在监视级别定义一个简单的脚本载荷转换:

当与search payload transform结合使用时,script payload transform通常非常有用,脚本可以从搜索结果中提取出重要的数据,从而保持payload的最小化。这可以通过chain payload transform来实现。

{
  "transform" : {
    "script" : "return [ 'time' : ctx.trigger.scheduled_time ]" 
  }
}

一个简单的 painless 脚本,创建一个包含单个 time 字段的新负载,该字段保存预定的时间。

执行的脚本可能返回一个有效的模型,该模型等同于Java™ Map或JSON对象(您需要查阅特定脚本语言的文档以了解此构造是什么)。任何其他返回的值都将被分配并通过_value变量访问。

script 属性可以包含一个字符串值,在这种情况下,它将被视为内联脚本,并且将假定为默认的 Elasticsearch 脚本语言(如 Scripting 中所述)。您可以使用 Elasticsearch 支持的其他脚本语言。为此,您需要将 script 字段设置为一个描述脚本及其语言的对象。下表列出了可以配置的可能设置:

表90. 脚本负载转换设置

Name Required Default Description

内联

-

当使用内联脚本时,此字段包含脚本本身。

id

-

当引用存储的脚本时,此字段包含脚本的id。

lang

无痛

脚本语言

params

-

脚本可访问的附加参数/变量

在使用脚本的对象表示法时,必须定义inlineid字段中的一个(且仅一个)。

除了提供的 params,脚本还可以访问 标准监视执行上下文参数

观察者链有效载荷转换

edit

一个执行有序配置的payload transform链表,其中每个transform的输出作为链中下一个transform的输入。这个transform接受的payload作为链中第一个transform的输入,而链中最后一个transform的输出作为整个chain transform的输出。

您可以使用链式载荷转换来构建更复杂的转换,这些转换基于其他可用的转换。例如,您可以将search载荷转换和script载荷转换结合起来,如下面的代码片段所示:

"transform" : {
  "chain" : [ 
    {
      "search" : {  
        "request": {
          "indices" : [ "logstash-*" ],
          "body" : {
            "size" : 0,
            "query" : {
              "match" : { "priority" : "error" }
            }
          }
        }
      }
    },
    {
      "script" : "return [ 'error_count' : ctx.payload.hits.total ]"  
    }
  ]
}

The chain 有效载荷转换定义

链中的第一个转换(在这种情况下,是一个搜索负载转换)

链中的第二个也是最后一个转换(在这种情况下,是一个脚本 有效载荷转换)

此示例在集群上执行一个 count 搜索,以查找 error 事件。 搜索结果随后传递给第二个 script 有效负载转换。 script 有效负载转换提取总命中计数,并将其分配给 新生成的有效负载中的 error_count 字段。这个新有效负载是 chain 有效负载转换的输出,并替换监视执行上下文中的有效负载。