Watcher 脚本条件编辑

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

使用脚本条件编辑

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

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

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

例如,以下代码段显示了显式指定语言并定义单个脚本参数 resultinline 脚本的正式定义

"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 执行上下文,包括负载数据,以及通过条件定义传递的任何参数。

例如,以下代码段定义了一个使用 search 输入 的 watch,并使用 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 的输入加载的负载数据。