Watcher 脚本条件

编辑

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

使用脚本条件

编辑

以下代码片段配置了一个始终返回 true 的内联 script 条件

"condition" : {
  "script" : "return true"
}

此示例将脚本定义为一个简单的字符串。此格式实际上是定义 内联 脚本的快捷方式。脚本的正式定义是一个对象,它指定脚本类型以及可选的语言和参数值。如果省略了 lang 属性,则语言默认为 painless。Elasticsearch 支持两种类型的脚本,内联存储的

例如,以下代码片段显示了 inline 脚本的正式定义,它显式指定了语言并定义了一个脚本参数 result

"condition" : {
  "script" : {
    "source" : "return params.result",
    "lang" : "painless",
    "params" : {
      "result" : true
    }
  }
}

内联脚本

编辑

内联脚本是在条件本身中定义的脚本。以下代码片段显示了一个始终返回 true 的简单 painless 脚本的正式配置。

"condition" : {
  "script" : {
    "source" : "return true"
  }
}

存储的脚本

编辑

存储的脚本指的是已 存储 在 Elasticsearch 中的脚本。以下代码片段显示了如何通过其 id 引用脚本

"condition" : {
  "script" : {
    "id" : "my_script"
  }
}

内联 脚本一样,您也可以指定脚本语言和参数

"condition" : {
  "script" : {
    "id" : "my_script",
    "lang" : "javascript",
    "params" : { "color" : "red" }
  }
}

访问 watch 有效负载

编辑

脚本可以访问当前 watch 执行上下文,包括有效负载数据以及通过条件定义传递的任何参数。

例如,以下代码片段定义了一个 watch,它使用 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)

您可以在 watch 上下文中引用以下变量

名称 描述

ctx.watch_id

当前正在执行的 watch 的 ID。

ctx.execution_time

此 watch 开始执行的时间。

ctx.trigger.triggered_time

此 watch 被触发的时。

ctx.trigger.scheduled_time

此 watch 应该被触发的时。

ctx.metadata.*

与 watch 关联的任何元数据。

ctx.payload.*

watch 的输入加载的有效负载数据。