观察者条件

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 条件来跳过在触发监视时执行监视操作。监视输入会被处理,记录会被添加到监视历史记录中,并且监视执行结束。此条件通常用于测试。

使用 never 条件

edit

对于never条件,没有属性需要指定。要使用它,您需要指定条件类型并将其与一个空对象关联:

"condition" : {
  "never" : {}
}

观察者比较条件

edit

使用 compare 条件来对监视负载中的值执行简单的比较。您可以在不启用动态脚本的情况下使用 compare 条件。

表83. 支持的比较运算符

Name Description

eq

当解析值等于给定值时返回true(适用于数字、字符串、列表、对象和值)

not_eq

当解析值不等于给定值时返回true(适用于数字、字符串、列表、对象和空值)

gt

当解析值大于给定值时返回true(适用于数字和字符串值)

gte

当解析值大于/等于给定值时返回true(适用于数字和字符串值)

lt

当解析值小于给定值时返回true(适用于数字和字符串值)

lte

当解析值小于/等于给定值时返回true(适用于数字和字符串值)

使用比较条件

edit

要使用 compare 条件,您需要在执行上下文中指定要评估的值、一个比较运算符,以及要与之比较的值。例如,以下 compare 条件在搜索结果中的总命中数大于或等于 5 时返回 true

{
  "condition" : {
    "compare" : {
      "ctx.payload.hits.total" : { 
        "gte" : 5 
      }
    }
  }
}

使用点表示法引用执行上下文中的值。

指定一个比较运算符和您想要比较的值。

在比较日期和时间时,您可以使用形式为<{expression}>的日期数学表达式。例如,以下表达式在监视器在过去五分钟内执行时返回true

{
  "condition" : {
    "compare" : {
      "ctx.execution_time" : {
        "gte" : "<{now-5m}>"
      }
    }
  }
}

您还可以通过将比较值指定为形式为 {{path}} 的路径,在执行上下文中比较两个值。例如,以下条件将 ctx.payload.aggregations.status.buckets.error.doc_countctx.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

ctx.watch_id

当前正在执行的监视器的ID。

ctx.execution_time

此手表的计时开始时间。

ctx.trigger.triggered_time

触发此监视器的时间。

ctx.trigger.scheduled_time

这个监视器应该被触发的时间。

ctx.metadata.*

与该观察相关的任何元数据。

ctx.payload.*

手表输入加载的有效载荷数据。

观察者数组比较条件

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

<数组路径>

数组在执行上下文中的路径,使用点表示法指定。例如,ctx.payload.aggregations.top_tweeters.buckets

<数组路径>.路径

要评估的每个数组元素中的字段路径。例如,doc_count。默认为空字符串。

..quantifier

比较需要多少匹配才能评估为truesomeall。默认为some——至少需要一个匹配。如果数组为空,当量词设置为all时,比较评估为true,当量词设置为some时,比较评估为false

..value

要比较的值。

观察器脚本条件

edit

一个评估脚本的监视条件。默认的脚本语言是painless。你可以使用任何Elasticsearch支持的脚本语言,只要该语言支持将表达式评估为布尔值。请注意,mustacheexpression语言的功能过于有限,无法用于此条件。有关更多信息,请参阅脚本

使用脚本条件

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。要将响应中的@timestampctx.execution_time进行比较,您需要将@timestamp字符串解析为ZonedDateTime。例如:

java.time.ZonedDateTime.parse(@timestamp)

您可以在监视上下文中引用以下变量:

Name Description

ctx.watch_id

当前正在执行的监视器的ID。

ctx.execution_time

此手表的计时开始时间。

ctx.trigger.triggered_time

触发此监视器的时间。

ctx.trigger.scheduled_time

这个监视器应该被触发的时间。

ctx.metadata.*

与该观察相关的任何元数据。

ctx.payload.*

手表输入加载的有效载荷数据。