观察者条件
edit观察者条件
edit当触发器被触发时,其条件决定了是否执行触发器的操作。Watcher 支持以下条件类型:
-
always: 该条件始终评估为true,因此始终执行监视操作。 -
never: 该条件始终评估为false,因此永远不会执行监视操作。 -
compare: 对监视负载中的值执行简单比较,以确定是否执行监视操作。 -
array_compare: 将监视负载中的值数组与给定值进行比较,以确定是否执行监视操作。 -
script: 使用脚本来确定是否执行监视操作。
如果你从监视中省略条件定义,条件默认为always。
当评估一个条件时,它可以完全访问监视执行上下文,包括监视负载(ctx.payload.*)。脚本、
比较 和 数组比较
条件可以使用负载数据来确定是否满足必要的条件。
除了全局监视条件外,您还可以为每个操作配置条件。
观察者始终条件
edit使用 always 条件在每次触发监视时执行监视操作,除非它们被 限制。
条件 always 使您能够按照固定的时间表执行监视操作,
例如,“每周五中午,向
sys.admin@example.com 发送状态报告电子邮件。”
使用 always 条件
edit如果你从监视中省略条件定义,这是默认设置。
对于always条件,没有属性需要指定。要显式使用此条件,请指定条件类型并将其与一个空对象关联:
"condition" : {
"always" : {}
}
观察者从不条件
edit使用 never 条件来跳过在触发监视时执行监视操作。监视输入会被处理,记录会被添加到监视历史记录中,并且监视执行结束。此条件通常用于测试。
观察者比较条件
edit使用 compare 条件来对监视负载中的值执行简单的比较。您可以在不启用动态脚本的情况下使用 compare 条件。
表83. 支持的比较运算符
| Name | Description |
|---|---|
|
当解析值等于给定值时返回 |
|
当解析值不等于给定值时返回 |
|
当解析值大于给定值时返回 |
|
当解析值大于/等于给定值时返回 |
|
当解析值小于给定值时返回 |
|
当解析值小于/等于给定值时返回 |
使用比较条件
edit要使用 compare 条件,您需要在执行上下文中指定要评估的值、一个比较运算符,以及要与之比较的值。例如,以下 compare 条件在搜索结果中的总命中数大于或等于 5 时返回 true:
在比较日期和时间时,您可以使用形式为<{expression}>的日期数学表达式。例如,以下表达式在监视器在过去五分钟内执行时返回true:
{
"condition" : {
"compare" : {
"ctx.execution_time" : {
"gte" : "<{now-5m}>"
}
}
}
}
您还可以通过将比较值指定为形式为 {{path}} 的路径,在执行上下文中比较两个值。例如,以下条件将 ctx.payload.aggregations.status.buckets.error.doc_count 与 ctx.payload.aggregations.handled.buckets.true.doc_count 进行比较:
{
"condition" : {
"compare" : {
"ctx.payload.aggregations.status.buckets.error.doc_count" : {
"not_eq" : "{{ctx.payload.aggregations.handled.buckets.true.doc_count}}"
}
}
}
}
访问执行上下文中的值
edit您使用“点表示法”来访问执行上下文中的值。通过输入加载到执行上下文中的值以 ctx.payload 为前缀。
您可以使用基于零的数组索引来引用数组中的元素。
例如,要访问 ctx.payload.hits.hits 数组的第三个元素,请使用 ctx.payload.hits.hits.2。
| Name | Description |
|---|---|
|
当前正在执行的监视器的ID。 |
|
此手表的计时开始时间。 |
|
触发此监视器的时间。 |
|
这个监视器应该被触发的时间。 |
|
与该观察相关的任何元数据。 |
|
手表输入加载的有效载荷数据。 |
观察者数组比较条件
edit使用 array_compare 来比较执行上下文中的值数组与给定值。请参阅 表 83 以了解您可以使用的运算符。
使用数组比较条件
edit要使用 array_compare 条件,您需要在执行上下文中指定要评估的数组,一个
比较运算符,以及您要与之比较的值。可选地,您可以指定要评估的每个数组元素中的字段路径。
例如,以下 array_compare 条件在聚合中至少有一个桶的 doc_count 大于或等于 25 时返回 true:
{
"condition": {
"array_compare": {
"ctx.payload.aggregations.top_tweeters.buckets" : {
"path": "doc_count",
"gte": {
"value": 25
}
}
}
}
}
当使用包含点的字段名称时,此条件将不起作用,请改用脚本条件。
数组比较条件属性
edit| Name | Description |
|---|---|
|
数组在执行上下文中的路径,使用点表示法指定。例如, |
|
要评估的每个数组元素中的字段路径。例如, |
比较需要多少匹配才能评估为 |
|
要比较的值。 |
观察器脚本条件
edit一个评估脚本的监视条件。默认的脚本语言是painless。你可以使用任何Elasticsearch支持的脚本语言,只要该语言支持将表达式评估为布尔值。请注意,mustache和expression语言的功能过于有限,无法用于此条件。有关更多信息,请参阅脚本。
使用脚本条件
edit以下代码片段配置了一个内联的 script 条件,该条件总是返回 true:
"condition" : {
"script" : "return true"
}
此示例将脚本定义为一个简单的字符串。这种格式实际上是定义一个内联脚本的快捷方式。脚本的正式定义是一个指定脚本类型以及可选的语言和参数值的对象。如果省略了lang属性,语言默认为painless。Elasticsearch支持两种类型的脚本,内联和存储。
例如,以下代码片段展示了一个内联脚本的正式定义,该脚本明确指定了语言并定义了一个单一的脚本参数,结果:
"condition" : {
"script" : {
"source" : "return params.result",
"lang" : "painless",
"params" : {
"result" : true
}
}
}
内联脚本
edit内联脚本是直接定义在条件中的脚本。以下代码片段展示了简单 painless 脚本的正式配置,该脚本始终返回 true。
"condition" : {
"script" : {
"source" : "return true"
}
}
存储的脚本
edit存储的脚本指的是那些已经在Elasticsearch中存储的脚本。以下代码片段展示了如何通过其id引用一个脚本:
"condition" : {
"script" : {
"id" : "my_script"
}
}
与内联脚本一样,您也可以指定脚本语言和参数:
"condition" : {
"script" : {
"id" : "my_script",
"lang" : "javascript",
"params" : { "color" : "red" }
}
}
访问监视负载
edit脚本可以访问当前的监视执行上下文,包括有效载荷数据,以及通过条件定义传递的任何参数。
例如,以下代码片段定义了一个使用search输入的监视器,并使用script条件来检查命中次数是否超过指定的阈值:
{
"input" : {
"search" : {
"request": {
"indices" : "log-events",
"body" : {
"size" : 0,
"query" : { "match" : { "status" : "error" } }
}
}
}
},
"condition" : {
"script" : {
"source" : "return ctx.payload.hits.total > params.threshold",
"params" : {
"threshold" : 5
}
}
}
}
当您使用脚本条件来评估Elasticsearch响应时,请记住响应中的字段不再是它们原来的数据类型。例如,响应中的@timestamp是一个字符串,而不是DateTime。要将响应中的@timestamp与ctx.execution_time进行比较,您需要将@timestamp字符串解析为ZonedDateTime。例如:
java.time.ZonedDateTime.parse(@timestamp)
您可以在监视上下文中引用以下变量:
| Name | Description |
|---|---|
|
当前正在执行的监视器的ID。 |
|
此手表的计时开始时间。 |
|
触发此监视器的时间。 |
|
这个监视器应该被触发的时间。 |
|
与该观察相关的任何元数据。 |
|
手表输入加载的有效载荷数据。 |