复合监控器
目录
关于复合监视器
警报插件的基本监视器类型旨在定义单个触发器类型。例如,按文档监视器可以根据查询与文档的匹配来触发警报,而按桶监视器可以根据针对数据源中聚合值的查询来触发警报。复合监视器按顺序组合多个监视器,根据多个标准分析数据源,然后使用它们的单个警报生成一个链式警报。这允许您获取关于数据源更精细的信息,并且不需要您手动协调各个监视器的调度。
复合监视器通过以下方式消除了基本监视器的限制:
- 复合监视器使您能够通过多种类型监视器生成的触发器组合来创建复杂查询。
- 它们能够定义一个规则和查询管道,作为单个执行运行。
- 它们向用户发送单个警报,而不是来自其工作流中各个监视器的多个警报。
- 它们通过按顺序运行多个监视器和多种类型的监视器,提供给定数据源的更完整视图,从而创建更集中的结果并减少结果中的噪音。
关键术语
下表中的关键术语描述了复合监视器的基本概念。有关所有类型监视器通用的附加术语,请参阅警报部分中的关键术语。
词项 | 定义 |
---|---|
复合监视器 | 复合监视器是一种支持在顺序工作流中执行多个监视器的监视器类型。它支持配置触发器以创建链式警报。 |
委托监视器 | 委托监视器根据其在复合监视器定义中的顺序依次执行。当委托监视器的触发条件满足时,它会生成一个审计警报。此审计警报随后成为复合监视器触发器的条件。复合监视器支持按查询、按桶和按文档监视器作为委托监视器。 |
工作流 ID | 工作流 ID 为所有委托监视器的整个工作流提供了一个标识符。它与复合监视器的监视器 ID 同义。 |
链式警报 | 当委托监视器生成审计警报时,链式警报从复合监视器触发器生成。链式警报触发条件支持使用逻辑运算符AND 、OR 和NOT ,以便您可以将多个函数组合成单个表达式。 |
审计警报 | 委托监视器以**审计**状态生成警报。用户不会收到每个单独审计警报的通知,也不需要确认它们。审计警报用于评估复合监视器中的链式警报触发条件。 |
执行 | 按复合监视器配置中定义的顺序,对所有委托监视器进行单次运行。 |
基本工作流
您通过在工作流中组合单个监视器来创建复合监视器,该工作流按定义的顺序执行每个监视器。当来自委托监视器的单个审计警报满足复合监视器的触发条件时,复合监视器会生成自己的链式警报。请考虑以下事件序列,以了解配置了两个委托监视器的简单复合监视器如何执行其工作流。在此示例中,当第一个监视器和第二个监视器都生成警报时,满足复合监视器的触发条件。
- 复合监视器启动执行并将其委托给第一个监视器。第一个监视器的触发条件满足,并生成一个审计警报。
- 复合监视器随后将执行委托给第二个监视器。第二个监视器的触发条件也满足,并生成自己的审计警报。
- 因为复合监视器的触发条件要求第一个和第二个监视器都生成审计警报,所以复合监视器随后触发一个链式警报。
- 如果在复合监视器的定义中配置了通知,用户将收到关于链式警报的通知。但是,他们不会收到由两个委托监视器生成的单个审计警报。
在这个简单的示例中,第一个监视器可能是一个按文档监视器,配置为使用三个不同的查询分析数据源,而第二个监视器可能是一个按桶监视器,按客户端 IP 聚合数据。通过组合每个委托监视器的要求,复合监视器集中了决定是否生成警报的标准。这可以提高警报的意义,同时消除不提供确定性值的无关警报。
使用 API 管理复合监视器
您可以使用 OpenSearch REST API 或OpenSearch Dashboards管理复合监视器。本节描述复合监视器的 API 功能。
创建复合监视器
此 API 允许您创建复合监视器。
POST _plugins/_alerting/workflows
请求正文字段
字段 | 类型 | 描述 |
---|---|---|
schedule | 对象 | 确定执行运行频率的调度。 |
schedule.period.interval | 数值 | 接受一个数值来设置执行的运行频率。 |
schedule.period.unit | 对象 | 间隔的时间单位:SECONDS (秒)、MINUTES (分)、HOURS (小时)、DAYS (天)。 |
inputs | 对象 | 接受输入以定义委托监视器,它们指定了委托监视器及其在执行序列中的顺序。 |
inputs.composite_input.sequence.delegates | 对象 | 复合监视器所依赖的单个监视器的设置。 |
inputs.composite_input.sequence.delegates.order | 数字 | 指定监视器在执行中运行的顺序。 |
inputs.composite_input.sequence.delegates.monitor_id | 字符串 | 监视器的唯一标识符。 |
enabled_time | 数字 | 监视器启用的时间。以纪元时间表示。 |
enabled | 布尔型 | 确定复合监视器是否启用的设置。将其设置为true 启用复合监视器。默认值为true 。 |
workflow_type | 字符串 | 对于复合监视器,设置为composite 。 |
triggers | 对象 | 单个警报触发器的详细信息。 |
triggers.chained_alert_trigger | 对象 | 每个单个警报触发器的详细信息。每个监视器的警报触发器都需要为其配置设置。 |
triggers.chained_alert_trigger.id | 字符串 | 警报触发器的唯一标识符。 |
triggers.chained_alert_trigger.name | 字符串 | 警报触发器的名称。 |
triggers.chained_alert_trigger.severity | 数字 | 警报严重性。1 = 最高;2 = 高;3 = 中;4 = 低;5 = 最低。 |
triggers.chained_alert_trigger.condition.script | 对象 | 确定触发警报条件的脚本详细信息。 |
triggers.chained_alert_trigger.condition.script.source | 字符串 | 定义触发警报条件的 Painless 脚本。 |
triggers.chained_alert_trigger.condition.script.lang | 字符串 | 输入painless 表示 Painless 脚本语言。 |
actions | 对象 | 提供配置警报通知的字段。 |
请求示例
POST _plugins/_alerting/workflows
{
"last_update_time": 1679468231835,
"owner": "alerting",
"type": "workflow",
"schedule": {
"period": {
"interval": 1,
"unit": "MINUTES"
}
},
"inputs": [{
"composite_input": {
"sequence": {
"delegates": [{
"order": 1,
"monitor_id": "grsbCIcBvEHfkjWFeCqb"
},
{
"order": 2,
"monitor_id": "agasbCIcBvEHfkjWFeCqa"
}
]
}
}
}],
"enabled_time": 1679468231835,
"enabled": true,
"workflow_type": "composite",
"name": "scale_up",
"triggers": [{
"chained_alert_trigger": {
"id": "m1ANDm2",
"name": "jnkjn",
"severity": "1",
"condition": {
"script": {
"source": "(monitor[id=grsbCIcBvEHfkjWFeCqb] && monitor[id=agasbCIcBvEHfkjWFeCqa])",
"lang": "painless"
}
}
},
"actions": [{
"name": "test-action",
"destination_id": "ld7912sBlQ5JUWWFThoW",
"message_template": {
"source": "This is my message body."
},
"throttle_enabled": true,
"throttle": {
"value": 27,
"unit": "MINUTES"
},
"subject_template": {
"source": "TheSubject"
}
}]
},
{
"chained_alert_trigger": {
"id": "m1ORm2",
"name": "jnkjn",
"severity": "1",
"condition": {
"script": {
"source": "(monitor[id=grsbCIcBvEHfkjWFeCqb] || monitor[id=agasbCIcBvEHfkjWFeCqa])",
"lang": "painless"
}
}
}
}
]
}
使用 Painless 脚本语言定义链式警报触发条件
复合监视器配置采用 Painless 脚本语言来定义生成链式警报的条件。条件应用于复合监视器的每次执行。您在请求的triggers.chained_alert_triggers.condition.script.source
字段中定义警报触发条件。使用 Painless 语法,您可以使用基本布尔运算符 AND、OR、NOT 和优先级对监视器之间的链接应用逻辑
- AND =
&&
- OR =
||
- NOT =
!
- 优先级 =
()
请参阅以下示例,了解它们如何在监视器定义中使用。
-
示例 1
monitor[id=1] && monitor[id=2]
当监视器 #1 和监视器 #2 都生成警报时,委托监视器的以下条件将触发复合监视器生成链式警报。
-
示例 2
monitor[id=1] || !monitor[id=2]
当监视器 #1 生成警报或监视器 #2 不生成警报时,以下条件将触发复合监视器生成链式警报。
-
示例 3
monitor[id=1] && (monitor[id=2] || monitor[id=3])
当监视器 #1 生成警报,并且监视器 #2 或监视器 #3 生成警报时,以下条件将触发复合监视器生成链式警报。
Painless 脚本中监视器 ID 的顺序不定义监视器的执行顺序。监视器执行顺序在请求的inputs.composite_input.sequence.delegates.order
字段中定义。
获取复合监视器
此 API 检索指定监视器上的信息。
GET _plugins/_alerting/workflows/<workflow_id>
路径参数
字段 | 类型 | 描述 |
---|---|---|
workflow_id | 字符串 | 复合监视器的工作流 ID。 |
更新复合监视器
此 API 更新复合监视器的详细信息。有关请求字段的描述,请参阅创建复合监视器。
请求示例
PUT _plugins/_alerting/workflows/<workflow_id>
{
"owner": "security_analytics",
"type": "workflow",
"schedule": {
"period": {
"interval": 1,
"unit": "MINUTES"
}
},
"inputs": [
{
"composite_input": {
"sequence": {
"delegates": [
{
"order": 1,
"monitor_id": "grsbCIcBvEHfkjWFeCqb"
},
{
"order": 2,
"monitor_id": "agasbCIcBvEHfkjWFeCqa"
}
]
}
}
}
],
"enabled_time": 1679468231835,
"enabled": true,
"workflow_type": "composite",
"name": "NTxdwApKbv"
}
删除复合监视器
DELETE _plugins/_alerting/workflows/<workflow_id>
执行复合监视器
此 API 启动复合监视器的工作流执行
POST /_plugins/_alerting/workflows/<workflow_id>/_execute
示例响应
{
"execution_id": "I0GXeIgBYKBG2nHoiHCL_2023-06-01T20:18:48.511884_a9c1d055-9b70-49c2-b32a-716cff1f562e",
"workflow_name": "scale_up",
"workflow_id": "I0GXeIgBYKBG2nHoiHCL",
"trigger_results": {
"m1ANDm2": {
"name": "jnkjn",
"triggered": true,
"action_results": {},
"error": null
},
"m1ORm2": {
"name": "jnkjn",
"triggered": true,
"action_results": {},
"error": null
}
},
"monitor_run_results": [{
"monitor_name": "test triggers",
"period_start": 1685650668501,
"period_end": 1685650728501,
"error": null,
"input_results": {
"results": [{
"bhjh": [
"OkGceIgBYKBG2nHoyHAn|test1",
"O0GceIgBYKBG2nHozHCW|test1"
],
"nkjkj": [
"OkGceIgBYKBG2nHoyHAn|test1",
"O0GceIgBYKBG2nHozHCW|test1"
],
"jknkjn": [
"OkGceIgBYKBG2nHoyHAn|test1",
"O0GceIgBYKBG2nHozHCW|test1"
]
}],
"error": null
},
"trigger_results": {
"NC3Dd4cBCDCIfBYtViLI": {
"name": "njkkj",
"triggeredDocs": [
"OkGceIgBYKBG2nHoyHAn|test1",
"O0GceIgBYKBG2nHozHCW|test1"
],
"action_results": {},
"error": null
}
}
},
{
"monitor_name": "test triggers 2",
"period_start": 1685650668501,
"period_end": 1685650728501,
"error": null,
"input_results": {
"results": [{
"bhjh": [
"PEGceIgBYKBG2nHo1HCw|test",
"PUGceIgBYKBG2nHo3HA8|test"
],
"nkjkj": [
"PEGceIgBYKBG2nHo1HCw|test",
"PUGceIgBYKBG2nHo3HA8|test"
],
"jknkjn": [
"PEGceIgBYKBG2nHo1HCw|test",
"PUGceIgBYKBG2nHo3HA8|test"
]
}],
"error": null
},
"trigger_results": {
"NC3Dd4cBCDCIfBYtViLI": {
"name": "njkkj",
"triggeredDocs": [
"PEGceIgBYKBG2nHo1HCw|test",
"PUGceIgBYKBG2nHo3HA8|test"
],
"action_results": {},
"error": null
}
}
}
],
"execution_start_time": "2023-06-01T20:18:48.511874Z",
"execution_end_time": "2023-06-01T20:18:53.682405Z",
"error": null
}
获取链式警报
此 API 返回复合监视器工作流中生成的链式警报数组
GET /_plugins/_alerting/workflows/alerts?workflowIds=<workflow_ids>&getAssociatedAlerts=true
查询参数
字段 | 类型 | 必需 | 描述 |
---|---|---|---|
workflowIds | 数组 | 否 | 当使用此参数时,它会返回由指定工作流创建的警报。 |
getAssociatedAlerts | 布尔型 | 否 | 当为true 时,响应会返回复合监视器用于创建链式警报的审计警报。默认值为false 。 |
示例响应
{
"alerts": [
{
"id": "PbQoZokBfd2ci_FqMGi6",
"version": 1,
"monitor_id": "",
"workflow_id": "G7QoZokBfd2ci_FqD2iZ",
"workflow_name": "scale_up",
"associated_alert_ids": [
"4e8256c5-529a-484c-bf7b-d3980c03e9a4",
"513a8cb3-44bc-4eee-8aac-131be10b399e"
],
"schema_version": -1,
"monitor_version": -1,
"monitor_name": "",
"execution_id": "G7QoZokBfd2ci_FqD2iZ_2023-07-17T23:20:55.244970_edd977d2-c02b-4cbe-8a79-2aa7991c4191",
"trigger_id": "m1ANDm2",
"trigger_name": "jnkjn",
"finding_ids": [],
"related_doc_ids": [],
"state": "ACTIVE",
"error_message": null,
"alert_history": [],
"severity": "1",
"action_execution_results": [],
"start_time": 1689636057269,
"last_notification_time": 1689636057270,
"end_time": null,
"acknowledged_time": null
},
{
"id": "PrQoZokBfd2ci_FqMGj8",
"version": 1,
"monitor_id": "",
"workflow_id": "G7QoZokBfd2ci_FqD2iZ",
"workflow_name": "scale_up",
"associated_alert_ids": [
"4e8256c5-529a-484c-bf7b-d3980c03e9a4",
"513a8cb3-44bc-4eee-8aac-131be10b399e"
],
"schema_version": -1,
"monitor_version": -1,
"monitor_name": "",
"execution_id": "G7QoZokBfd2ci_FqD2iZ_2023-07-17T23:20:55.244970_edd977d2-c02b-4cbe-8a79-2aa7991c4191",
"trigger_id": "m1ORm2",
"trigger_name": "jnkjn",
"finding_ids": [],
"related_doc_ids": [],
"state": "ACTIVE",
"error_message": null,
"alert_history": [],
"severity": "1",
"action_execution_results": [],
"start_time": 1689636057340,
"last_notification_time": 1689636057340,
"end_time": null,
"acknowledged_time": null
}
],
"associatedAlerts": [
{
"id": "4e8256c5-529a-484c-bf7b-d3980c03e9a4",
"version": -1,
"monitor_id": "DrQoZokBfd2ci_FqCWh8",
"workflow_id": "G7QoZokBfd2ci_FqD2iZ",
"workflow_name": "",
"associated_alert_ids": [],
"schema_version": 5,
"monitor_version": 1,
"monitor_name": "test triggers",
"execution_id": "G7QoZokBfd2ci_FqD2iZ_2023-07-17T23:20:55.244970_edd977d2-c02b-4cbe-8a79-2aa7991c4191",
"trigger_id": "NC3Dd4cBCDCIfBYtViLI",
"trigger_name": "njkkj",
"finding_ids": [
"277afca7-d5aa-46ed-8023-5449ece65d36"
],
"related_doc_ids": [
"H7QoZokBfd2ci_FqFmii|test1"
],
"state": "AUDIT",
"error_message": null,
"alert_history": [],
"severity": "1",
"action_execution_results": [],
"start_time": 1689636056410,
"last_notification_time": 1689636056410,
"end_time": null,
"acknowledged_time": null
},
{
"id": "513a8cb3-44bc-4eee-8aac-131be10b399e",
"version": -1,
"monitor_id": "EbQoZokBfd2ci_FqCmiR",
"workflow_id": "G7QoZokBfd2ci_FqD2iZ",
"workflow_name": "",
"associated_alert_ids": [],
"schema_version": 5,
"monitor_version": 1,
"monitor_name": "test triggers 2",
"execution_id": "G7QoZokBfd2ci_FqD2iZ_2023-07-17T23:20:55.244970_edd977d2-c02b-4cbe-8a79-2aa7991c4191",
"trigger_id": "NC3Dd4cBCDCIfBYtViLI",
"trigger_name": "njkkj",
"finding_ids": [
"6d185585-a077-4dde-8e43-b4c01b9f3102"
],
"related_doc_ids": [
"ILQoZokBfd2ci_FqGmhb|test"
],
"state": "AUDIT",
"error_message": null,
"alert_history": [],
"severity": "1",
"action_execution_results": [],
"start_time": 1689636056943,
"last_notification_time": 1689636056943,
"end_time": null,
"acknowledged_time": null
}
],
"totalAlerts": 2
}
请求正文字段
字段 | 类型 | 描述 |
---|---|---|
alerts | 数组 | 复合监视器生成的链式警报列表。 |
associatedAlerts | 数组 | 委托监视器生成的审计警报列表。 |
确认链式警报
获取警报后,您可以在一次调用中确认多个活动警报。如果警报已处于 ERROR、COMPLETED 或 ACKNOWLEDGED 状态,它将出现在失败数组中。
POST _plugins/_alerting/workflows/<workflow_id>/_acknowledge/alerts
{
"alerts": ["eQURa3gBKo1jAh6qUo49"]
}
请求正文字段
字段 | 类型 | 描述 |
---|---|---|
alerts | 数组 | 按 ID 列出的警报列表。结果包括系统已确认的警报以及系统未识别的警报。 |
示例响应
{
"success": [
"eQURa3gBKo1jAh6qUo49"
],
"failed": []
}
在 OpenSearch Dashboards 中创建复合监视器
首先导航到 OpenSearch Dashboards 中的**创建监视器**页面:**警报 > 监视器**,然后选择**创建监视器**。为监视器命名,然后选择**复合监视器**作为监视器类型。创建复合监视器工作流和触发器的步骤因您使用**可视化编辑器**还是**提取查询编辑器**而异。前者提供了定义复合监视器的基本 UI 选择器,而后者允许您使用脚本构建工作流和触发器条件。决定使用哪种方法后,请参阅相应的章节。
可视化编辑器
要使用可视化编辑器定义工作流和触发条件,请在**监视器定义方法**部分选择**可视化编辑器**单选按钮。如下图所示。
要在可视化编辑器中完成创建复合监视器,请按照以下步骤操作
- 在**频率**下拉列表中,选择**按间隔**、**每日**、**每周**、**每月**或**自定义 Cron 表达式**
- **按间隔** — 允许您根据指定的分钟、小时或天数重复运行调度。
- **每日** — 指定一天中的时间和时区。
- **每周** — 指定一周中的某一天、一天中的时间和时区。
- **每月** — 指定一个月中的某一天、一天中的时间和时区。
- **自定义 Cron 表达式** — 为调度创建自定义 Cron 表达式。使用**cron 表达式**链接获取创建这些表达式的帮助,或参阅Cron 表达式参考。
-
在**委托监视器**部分,通过在下拉列表中选择您想要包含在工作流中的单个监视器。在**可视化编辑器**中,您选择监视器的顺序决定了它们在工作流中的顺序。
选择**添加另一个监视器**以添加另一个下拉列表。最少需要两个委托监视器,最多允许总共 10 个。请记住,复合监视器支持按查询、按桶和按文档监视器作为委托监视器。
在每个下拉列表旁边,您可以选择查看监视器图标(
)以打开监视器详细信息窗口并查看其信息。
- 为复合监视器定义一个或多个触发器。在触发器部分中,选择添加触发器。添加触发器名称,然后定义触发器条件。
- 使用选择委托监视器标签打开如下图所示的弹出窗口。
- 使用选择委托监视器下拉列表选择上一步中定义的委托监视器。对于第一个委托监视器,如果您愿意,可以选择“NOT”作为运算符。在字段中填充监视器后,您可以使用列表右侧的垃圾桶图标(
)来移除监视器(如果需要)。
- 选择第一个监视器右侧的加号(
)以选择第二个委托监视器。选择第二个监视器后,选择运算符
AND
、OR
、AND NOT
或OR NOT
中的一个,将条件应用于两个监视器之间。应用运算符后,您可以再次选择该运算符以打开弹出窗口并更改选择。 - 选择告警的严重程度。选项包括1 (最高)、2 (高)、3 (中)、4 (低)和5 (最低)。
-
在通知部分中,从下拉列表中选择一个通知渠道。如果不存在任何渠道,选择下拉列表右侧的管理渠道标签以设置通知渠道。有关通知的更多信息,请参阅通知文档。您还可以选择添加通知为告警触发器指定其他通知。
通知对于所有监视器类型都是可选的。
- 要定义其他触发器,请选择添加另一个触发器。您最多可以有总共10个触发器。选择屏幕右侧的移除触发器以移除触发器。
- 完成监视器工作流并定义触发器后,选择屏幕右下角的创建。复合监视器已创建,并且监视器的详细信息窗口将打开。
提取查询编辑器
要使用提取查询编辑器定义工作流和触发器,请在监视器定义方法部分中选择提取查询编辑器单选按钮。如下图所示。
提取查询编辑器遵循与可视化编辑器相同的通用步骤,但它允许您使用API查询中的提取来构建复合监视器工作流和告警触发器。这使您能够创建可视化编辑器不支持的更高级配置。以下部分提供了这两个字段的内容示例。复合监视器创建的所有其他步骤与可视化编辑器中的步骤相同。
-
定义工作流
在定义工作流字段中,输入定义委托监视器及其在工作流中顺序的序列。以下示例显示了工作流中包含的委托监视器及其在序列中的顺序
{ "sequence": { "delegates": [ { "order": 1, "monitor_id": "0TgBZokB2ZtsLaRvXz70" }, { "order": 2, "monitor_id": "8jgBZokB2ZtsLaRv6z4N" } ] } }
工作流中包含的所有委托监视器都要求提供
monitor_id
和order
的值。 -
触发条件
在触发条件字段中,输入将用于定义监视器之间条件的监视器和运算符。此字段要求触发条件以Painless脚本语言格式化。要了解如何为触发条件形成这些脚本,请参阅使用 Painless 脚本定义链式告警触发条件。
以下示例显示了一个触发条件,该条件要求第一个监视器或第二个监视器生成审计告警,然后复合监视器才能生成链式告警
(monitor[id=8d36S4kB0DWOHH7wpkET] || monitor[id=4t36S4kB0DWOHH7wL0Hk])
查看监视器详情
创建复合监视器后,它将出现在监视器选项卡上的监视器列表中。类型列指示监视器的类型,包括复合监视器类型。与复合监视器的关联列提供了基本监视器作为委托监视器在多少个复合监视器中使用的计数。选择监视器名称列中的监视器以打开其详细信息窗口。
对于复合监视器,详细信息窗口的告警部分包括操作列,其中包含查看详细信息图标()。下图显示了操作列作为最右侧的最后一列。
选择此图标以打开告警详细信息窗口。此窗口显示了生成链式告警的执行过程中包含的所有审计告警,并包括生成审计告警的委托监视器。选择窗口右上角的X以关闭告警详细信息。
返回监视器详细信息窗口的告警部分后,您可以选择告警开始时间左侧的复选框以突出显示告警。突出显示告警后,您可以选择此部分右上角的确认。告警已确认,并且状态列中的状态从“活跃”更改为“已确认”。