创建新告警或更新现有活动告警。
配置
基本设置
- Use message alarm data(使用消息告警数据):启用时,将消息数据解析为ThingsBoard Alarm对象,并从解析后的消息中提取告警配置而非使用节点配置。若消息无法解析为有效Alarm对象,消息经
Failure连接路由。 - Overwrite alarm details(覆盖告警详情):与 Use message alarm data 同时启用时,将执行详情脚本以生成告警
details字段的值。
告警配置
- Alarm type(告警类型):告警类型(如“General Alarm”、“High Temperature”)。支持模板化。
- Use alarm severity pattern(使用告警严重性模式):基于消息数据启用动态严重性,而非固定值。
- 启用 时:
- Alarm severity pattern(告警严重性模式):必须解析为以下有效严重性之一的模式:
CRITICAL、MAJOR、MINOR、WARNING或INDETERMINATE
- Alarm severity pattern(告警严重性模式):必须解析为以下有效严重性之一的模式:
- 禁用 时:
- Alarm severity(告警严重性):固定严重性等级。可选:Critical、Major、Minor、Warning 或 Indeterminate
- 启用 时:
告警详情脚本
用于生成告警 details 字段内容的脚本(TBEL或JavaScript)。脚本必须返回有效的JSON值,可以是:
- 原始值(数字、布尔、字符串)
- JSON数组
- JSON对象
脚本可访问以下变量:
msg:消息数据metadata:消息元数据msgType:消息类型metadata.prevAlarmDetails:更新现有告警时的先前告警详情(以JSON字符串提供)
传播设置
- Propagate alarm to related entities(向相关实体传播告警):通过配置的关系向父实体传播告警
- 启用后会出现 Relation types to propagate(要传播的关系类型) 字段
- 选择特定关系类型以限制传播路径,或留空以通过所有关系传播
- Propagate alarm to entity owner (Customer or Tenant)(向实体所有者传播告警):向实体的直接所有者传播告警
- Propagate alarm to entity owners hierarchy(向实体所有者层级传播告警):沿所有权链的所有层级向上传播告警
- Propagate alarm to Tenant(向租户传播告警):直接向租户级别传播告警,不考虑中间所有权
JSON Schema
消息处理算法
节点行为取决于 Use message alarm data 设置:
使用节点配置时(Use message alarm data = 禁用)
-
确定告警类型:处理配置的告警类型模式,用消息中的值替换占位符。
- 搜索现有告警:查询满足以下条件的活动(未清除)告警:
- 与传入消息发起者相同
- 告警类型与步骤1一致
- 创建或更新告警:
- 若不存在活动告警(新告警):
- 创建状态为
ACTIVE_UNACK的告警 - 从节点配置设置严重性(或启用 Use alarm severity pattern 时从模式设置)
- 应用节点配置中的传播设置
- 执行详情构建脚本生成
details字段 - 将告警开始时间和结束时间均设为元数据中
ts属性的值。若ts不存在,则设为消息创建时间戳。 - 将
isNewAlarm: true放入元数据并路由至Created连接 - 向发起者的根Rule Chain发送包含完整告警对象的
ENTITY_CREATED生命周期事件
- 创建状态为
- 若存在活动告警(更新):
- 保持现有告警状态不变
- 从节点配置设置严重性(或启用 Use alarm severity pattern 时从模式设置)
- 用节点配置中的值更新现有传播设置
- 执行详情构建脚本生成
details字段的值 - 将告警结束时间更新为当前服务器时间
- 将
isExistingAlarm: true放入元数据并路由至Updated连接 - 向发起者的根Rule Chain发送包含完整告警对象的
ENTITY_UPDATED生命周期事件
- 若不存在活动告警(新告警):
使用消息告警数据时(Use message alarm data = 启用)
- 将消息解析为告警:尝试将消息数据反序列化为ThingsBoard Alarm对象
- 若解析失败,路由至
Failure连接 - 用当前租户ID覆盖解析后告警中的
tenantId - 若解析后告警中
originator为null,默认使用消息发起者
- 若解析失败,路由至
-
提取告警类型:使用解析后告警的
type字段 -
搜索现有告警:同上,使用解析后的告警类型
- 创建或更新告警:
- 若不存在活动告警(新告警):
- 使用解析后告警的所有字段(严重性、传播设置等)
- 详情处理取决于 Overwrite alarm details:
- 启用:执行详情构建脚本,替换解析后的详情
- 禁用:直接使用解析后告警的
details字段
- 路由至
Created连接 - 向发起者的根Rule Chain发送包含完整告警对象的
ENTITY_CREATED生命周期事件
- 若存在活动告警(更新):
- 用解析后消息中的值更新现有告警:
severitypropagatepropagateToOwnerpropagateToOwnerHierarchypropagateToTenantpropagateRelationTypes
- 详情处理取决于 Overwrite alarm details:
- 启用:使用
prevAlarmDetails执行详情构建脚本 - 禁用:用解析后告警的
details替换
- 启用:使用
- 将告警结束时间更新为当前服务器时间
- 路由至
Updated连接 - 向发起者的根Rule Chain发送包含完整告警对象的
ENTITY_UPDATED生命周期事件
- 用解析后消息中的值更新现有告警:
- 若不存在活动告警(新告警):
输出连接
Created- 新告警已成功创建
- 消息数据替换为已创建的告警对象
- 元数据包含
isNewAlarm: true - 消息类型更改为
ALARM
Updated- 现有告警已成功更新
- 消息数据替换为已更新的告警对象
- 元数据包含
isExistingAlarm: true - 消息类型更改为
ALARM
Failure- 告警严重性模式解析为无效值
- 脚本执行错误
- 消息解析错误(使用消息告警数据时)
示例
示例1 — 创建新告警
传入消息
类型:POST_TELEMETRY_REQUEST
数据:
1
2
3
{
"temperature": 45.5
}
元数据:
1
{}
发起者:DEVICE
节点配置
1
2
3
4
5
6
{
"scriptLang": "TBEL",
"alarmDetailsBuildTbel": "return {\n temperature: msg.temperature\n};",
"alarmType": "High Temperature",
"severity": "CRITICAL"
}
系统状态
发起者设备不存在活动“High Temperature”告警。
传出消息
数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"id": {
"entityType": "ALARM",
"id": "f66e9b38-6f0e-4dc7-ad57-1cb4e014b6fc"
},
"createdTime": 1757429087089,
"tenantId": {
"entityType": "TENANT",
"id": "9c4bad70-10ac-11f0-ad7c-897c5310f06b"
},
"customerId": null,
"type": "High Temperature",
"originator": {
"entityType": "DEVICE",
"id": "3bc2eb60-8d77-11f0-8a6c-59050cd4204f"
},
"severity": "CRITICAL",
"acknowledged": false,
"cleared": false,
"assigneeId": null,
"startTs": 1757429087063,
"endTs": 1757429087063,
"ackTs": 0,
"clearTs": 0,
"assignTs": 0,
"propagate": false,
"propagateToOwner": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"originatorName": "device",
"originatorLabel": "device",
"assignee": null,
"name": "High Temperature",
"status": "ACTIVE_UNACK",
"details": {
"temperature": 45.5
}
}
元数据:
1
2
3
{
"isNewAlarm": "true"
}
经 Created 连接路由。
结果
发生以下操作:
- 新告警已创建:为设备在数据库中创建了严重性为CRITICAL的“High Temperature”告警。
- 详情已生成:详情构建脚本执行并将
{"temperature": 45.5}存入告警的details字段。 - 消息已转换:原始遥测消息替换为包含完整告警对象的
ALARM消息。消息经Created连接路由,元数据标志为isNewAlarm: true。 - 已触发生命周期事件:新告警的
ENTITY_CREATED生命周期事件自动发送至设备的根Rule Chain。
示例2 — 更新现有告警
传入消息
类型:POST_TELEMETRY_REQUEST
数据:
1
2
3
{
"temperature": 47.2
}
元数据:
1
{}
发起者:DEVICE
节点配置
1
2
3
4
5
6
{
"scriptLang": "TBEL",
"alarmDetailsBuildTbel": "return {\n temperature: msg.temperature\n};",
"alarmType": "High Temperature",
"severity": "CRITICAL"
}
系统状态
发起者设备存在活动“High Temperature”告警:
- 状态:
ACTIVE_UNACK - 详情:
{"temperature": 45.5} - 开始时间:1757429087063
- 结束时间:1757429087063
传出消息
数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"id": {
"entityType": "ALARM",
"id": "f66e9b38-6f0e-4dc7-ad57-1cb4e014b6fc"
},
"createdTime": 1757429087089,
"tenantId": {
"entityType": "TENANT",
"id": "9c4bad70-10ac-11f0-ad7c-897c5310f06b"
},
"customerId": null,
"type": "High Temperature",
"originator": {
"entityType": "DEVICE",
"id": "3bc2eb60-8d77-11f0-8a6c-59050cd4204f"
},
"severity": "CRITICAL",
"acknowledged": false,
"cleared": false,
"assigneeId": null,
"startTs": 1757429087063,
"endTs": 1757429195123,
"ackTs": 0,
"clearTs": 0,
"assignTs": 0,
"propagate": false,
"propagateToOwner": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"originatorName": "device",
"originatorLabel": "device",
"assignee": null,
"name": "High Temperature",
"status": "ACTIVE_UNACK",
"details": {
"temperature": 47.2
}
}
元数据:
1
2
3
{
"isExistingAlarm": "true"
}
经 Updated 连接路由。
结果
发生以下操作:
- 现有告警已更新:数据库中的活动“High Temperature”告警已更新。告警状态保持
ACTIVE_UNACK(未变)。 - 详情已重新生成:详情构建脚本通过
metadata.prevAlarmDetails访问先前详情后执行。更新温度读数,结果为{"temperature": 47.2}。 - 结束时间已更新:告警的
endTs更新为当前系统时间(1757429195123),时间戳保持原始创建时间。 - 消息已转换:原始遥测消息替换为包含已更新告警对象的
ALARM消息。消息经Updated连接路由,元数据标志为isExistingAlarm: true。 - 已触发生命周期事件:已更新告警的
ENTITY_UPDATED生命周期事件自动发送至设备的根Rule Chain。