监控如何工作
How Watcher Works
当满足某些条件时,您添加监视以自动执行操作。条件通常基于您加载到监视中的数据,也称为监视有效载荷。这个有效载荷可以从不同的来源加载-从Elasticsearch,一个外部的http服务,甚至两者的组合。
例如,当在日志数据中进行搜索时,您可以配置一个监视发送电子邮件到sysadmin,表明在过去5分钟有多达503个错误。
本主题描述一个监视的元素和监视的运作方式。
Watch Definition
监视由触发器,输入,条件和动作组成。这些动作定义了一旦条件满足需要做什么。此外,您可以在执行操作之前定义条件和转换以处理和准备监视的有效载荷。
确定监视何时被检查,监控必须有触发器。
加载数据到监视的有效载荷。如果没有指定输入,则加载空载荷。
控制是否执行监控的操作。如果没有指定条件,默认条件为always。
处理监视有效载荷以准备监视操作。您可以在监视级别定义转换或定义特定于动作的转换
指定当监视条件满足时会发生什么。
例如,以下代码段显示了一个Put监视请求,它定义了一个查找日志错误事件的监视。
PUT _xpack/watcher/watch/log_errors
{
"metadata" : { 【1】
"color" : "red"
},
"trigger" : { 【2】
"schedule" : {
"interval" : "5m"
}
},
"input" : { 【3】
"search" : {
"request" : {
"indices" : "log-events",
"body" : {
"size" : 0,
"query" : { "match" : { "status" : "error" } }
}
}
}
},
"condition" : { 【4】
"compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
},
"transform" : { 【5】
"search" : {
"request" : {
"indices" : "log-events",
"body" : {
"query" : { "match" : { "status" : "error" } }
}
}
}
},
"actions" : { 【6】
"my_webhook" : {
"webhook" : {
"method" : "POST",
"host" : "mylisteninghost",
"port" : 9200,
"path" : "/{{watch_id}}",
"body" : "Encountered {{ctx.payload.hits.total}} errors"
}
},
"email_administrator" : {
"email" : {
"to" : "sys.admino@host.domain",
"subject" : "Encountered {{ctx.payload.hits.total}} errors",
"body" : "Too many error in the system, see attached data",
"attachments" : {
"attached_data" : {
"data" : {
"format" : "json"
}
}
},
"priority" : "high"
}
}
}
}
【1】:metadata:你可以将可选的静态数据附加到监视。
【2】:trigger:该计划每5分钟触发执行监视。
【3】:input:该输入在log-events索引中搜索错误并加载响应到监视有效载荷。
【4】:condition:该条件检查是否有超过5个错误事件(在搜索响应中点击)。假如有,所有操作都将继续执行。
【5】:transform:假如监视条件被满足,该变换通过使用默认搜索类型搜索错误将所有错误加载到监视的有效载荷中,query_then_fetch.所有的监视操作都可以访问这个有效载荷。
【6】:actions:这个监视有两个动作。my_webhook操作通知第三方系统有关问题。email_administrator操作向系统管理员发送高优先级电子邮件。包含错误的监视有效载荷附加到电子邮件。
Watch Execution
当您添加监视时,监视器会立即使用适当的触发引擎注册触发器。具体调度触发器的监视在调度程序触发引擎中注册。
调度器根据他们的计划跟踪时间并触发监视。调度器在主节点在运行,并绑定监控服务的生命周期。当监控服务停止时,调度程序也将停止。触发引擎使用单独的线程池来执行监控。
当一个监控被触发,监控队列将其排队执行。创建一个watch_record文档并添加到监控历史上,并且设置监控状态为awaits_execution。
当开始执行时,监视器创建一个监控执行上下文。该执行上下文提供脚本和模板访问监视元数据,有效载荷,监视ID,执行时间和触发信息。有关更多信息,请参阅监视执行上下文。
执行过程中,监视器:
1。将输入数据作为有效载荷加载在监视执行上下文中。这使得数据可用于执行过程中的所有后续步骤。该步骤由监视的输入控制。
2。评估监视条件以确定是否继续执行监控。如果条件满足(评估为真),处理进入下一步。如果不满足(评估为false),监视的执行将停止。
3。将转换应用于监视有效载荷(如果需要)。
4。执行授予条件的监视操作,并且监视不被限制。
当监控执行完成后,执行结果将记录在监控记录中。监控记录包括执行时间和持续时间,是否满足监视条件以及执行每个操作的状态。
下图显示了监视执行过程:

Watch Acknowledgment and Throttling(监视确认和限制)
监控支持基于时间和基于确认的限制。这使您能够防止对同一事件重复执行操作。
默认情况下,监控使用基于时间的限制,限制时间为5秒。这意味着,如果每秒执行一次监视,即使总是满足条件,它的动作最多也会每5秒执行一次。你可以根据每个动作或者监视级别配置限制周期。
基于确认的显示使您能告知监控只要满足条件,就不在发送关于监视的任何通知。一旦条件评估为false,确认将被清除,监控恢复正常执行监视操作。
有关更多详细新,请参阅“确认和限制一节”
Watch Active State
默认情况下,当你添加监视时,立即将其设置为活动状态,并使用相应的触发引擎注册,并根据其配置的触发器执行。
你也可以将监视设置为非活动状态。非活动监视未注册到触发引擎并且永远不会被触发。
要在创建监视时将监视设置为非活动状态,请将活动参数设置为非活动状态。要停用现有的监视,请使用停用监控API。要重新激活不活动的监视,请使用激活监视API。
注意: 即使处于非活动状态,也可以使用执行监控API强制执行监控
停用监控在各种情况下都很有用。例如,如果你有监视外部系统的监控,并且需要将该系统关闭以进行维护,则可以停用监控,以防止在维护窗口中错误的报告可用性问题。
停用监控还可以将其保留下来,以备将来使用,而无需从系统中删除它。
Scripts and Templates(脚本和模板)
定义监视时可以使用脚本和模板。脚本和模板可以引起监视执行上下文中的元素,包括监视有效载荷。执行上下文定义了您可以在脚本中使用的变量和目标中的参数占位符。
监控使用Elasticsearch脚本基础框架,支持内联,存储和基于文件的脚本。脚本和模板由Elasticsearch编译和缓存,以优化循环执行。还支持自动加载。有关更多信息,请参阅Elasticsearch引用中的脚本。
Watch Execution Context
以下代码片段显示了监控执行上下文的基本结构:
{
"ctx" : {
"metadata" : { ... }, 【1】
"payload" : { ... }, 【2】
"watch_id" : "<id>", 【3】
"execution_time" : "20150220T00:00:10Z", 【4】
"trigger" : { 【5】
"triggered_time" : "20150220T00:00:10Z",
"scheduled_time" : "20150220T00:00:00Z"
},
"vars" : { ... } 【6】
}
【1】在监控定义中指定的任何静态元数据
【2】当前监视的有效载荷
【3】执行监控的ID
【4】显示监控执行时间的时间戳
【5】有关触发事件的信息。对于一个计划触发器。这包含triggered_time(监视被触发的时间)和scheduled_time(监视被调度去触发的时间)。
【6】在执行期间可以由不同结构设置和访问的动态变量。这些变量的作用域是单个执行(即它们不会持续存在,并且不能在同一个监视的不同执行之间使用)
Using Scripts
你可以使用脚本定义条件和转换。默认脚本语言是Painless.
注意:5.0开始,Elasticsearch附带了新的Painless脚本语言。Painless被创建和专门设计用于Elasticsearch。除了提供广泛的功能集,其最大的特定是它被适当的沙箱并且安全的在系统的任何地方使用(包括监控),而无需启用动态脚本。
脚本可以引用监视执行上下文中的任何值或通过脚本参数显示传递的值。
例如,如果监视元数据包括颜色字段(例如,"metadata" : {"color": "red"}),则可以使用ctx.metadata.color变量访问其值。如果您作为条件或变换定义的一部分(例如,"params" : {"color": "red"})传入颜色参数,则可以通过颜色变量访问其值。
Using Templates
您可以使用模板来定义监视的动态内容。在执行时,模板从监视执行上下文中拉入数据。例如,你可以使用模板填充电子邮件操作的主题字段通过保存在监视有效载荷中的数据。模板还可以访问通过模板参数显示传递的值。
使用Mustache脚本语言指定模板。
例如,以下代码片段显示了模板如何在发送电子邮件中启动动态主题:
{
"actions" : {
"email_notification" : {
"email" : {
"subject" : "{{ctx.metadata.color}} alert"
}
}
}
}
Inline Templates and Scripts
要定义内联模板和脚本,您只需要直接在值字段中指定。例如,以下代码片段使用引用上下文元数据中颜色值的内联模板配置电子邮件操作的主题。
"actions" : {
"email_notification" : {
"email" : {
"subject" : "{{ctx.metadata.color}} alert"
}
}
}
}
对于脚本,您只需要将内联脚本指定为脚本字段的值。例如:
"condition" : {
"script" : "return true"
}
您还可以通过使用正式对象定义作为字段值来显示指定内联类型。例如:
"actions" : {
"email_notification" : {
"email" : {
"subject" : {
"inline" : "{{ctx.metadata.color}} alert"
}
}
}
}
脚本的正式对象定义将是:
"condition" : {
"script" : {
"inline": "return true"
}
}
Stored Templates and Scripts
假如您存储了您的模板和脚本,则您可以使用ID引用它们。
要引用一个存储的脚本或模板,您使用正式对象定义并在id字段中指定其id。例如,以下代码片段引用email_notification_subject模板:
{
...
"actions" : {
"email_notification" : {
"email" : {
"subject" : {
"id" : "email_notification_subject",
"params" : {
"color" : "red"
}
}
}
}
}
}
File-based Templates and Scripts
假如您将模板或脚本存储在$ES_HOME/config/scripts目录中,可以按名称引用它们。模板文件必须被存储为.mustache的扩展。必须使用适当的文件扩展名保存脚本,例如.painless。
注意:定期扫描config/scripts目录以进行更改。重新加载新的和更改的模板和脚本,并从预加载的脚本缓存中删除已删除的模板和脚本。有关更多信息,请参阅Elasticsearch参考中的自动脚本重加载。
要引用基于文件的存储或脚本,您可以使用正式对象定义,并在文件字段中指定其名称。例如,以下代码片段引用了脚本文件threshold_hits.painless:
"condition" : {
"script" : {
"file" : "threshold_hits",
"params" : {
"threshold" : 0
}
}
}
原文地址:https://www.elastic.co/guide/en/x-pack/5.0/how-watcher-works.html
浙公网安备 33010602011771号