规则配置
rules 段定义数据路由与处理规则。每个数据点在采集后按 priority 顺序求值匹配,命中则执行对应动作(转发、丢弃、告警、变换、镜像)。
rules:
- name: high-temp-alert
match: "tag == 'temperature' && value > 95"
action: alert
target: cloud-mqtt
priority: 1规则通用字段
对应核心 RuleConfig 结构。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
name | string | 是 | — | 规则名称,用于日志与统计引用 |
match | string | 是 | — | 匹配表达式,见匹配表达式语法 |
action | string | 是 | — | 命中后执行的动作类型 |
target | string | 条件必填 | — | 目标传输名(单目标) |
targets | string[] | 条件必填 | — | 目标传输名列表(多目标;未设置时回退取 target) |
priority | int | 否 | 0 | 优先级,数值越小优先级越高 |
continue | bool | 否 | false | 命中后是否继续评估后续规则(见continue 标记) |
transform | object | 否 | — | 数据变换配置,仅 transform 动作使用 |
INFO
规则按 priority 升序求值(数值小 = 优先级高),同优先级按配置文件中的声明顺序求值。默认情况下(continue: false),首个命中的规则执行其动作后,数据点即结束本次规则求值流程。设置 continue: true 后,规则命中执行动作但不停止,继续评估后续规则——这使得一个数据点可以触发多条规则(如"告警后继续正常转发")。
匹配表达式语法
match 字段是一个类 C/Go 风格的布尔表达式,对每个 DataPoint 求值。表达式可引用数据点字段、字面量,并使用比较与逻辑运算符。
可用字段
表达式可引用以下数据点字段:
| 字段 | 类型 | 说明 |
|---|---|---|
driver | string | 驱动实例名 |
device | string | 设备名 |
group | string | 标签分组 |
tag | string | 标签名 |
value | any | 数据值(按标签类型解释为数值或布尔) |
type | string | 数据类型名(如 float32) |
quality | string | 数据质量:good / bad / uncertain |
timestamp | int | 采集时刻的 Unix 毫秒时间戳——可做时间窗规则,如夜班抑制(UTC 22:00–06:00):timestamp % 86400000 >= 79200000 || timestamp % 86400000 < 21600000 |
运算符
| 类别 | 运算符 | 说明 |
|---|---|---|
| 比较 | == != > >= < <= | 数值与字符串均支持;字符串的大小比较按字典序 |
| 正则 | =~ !~ | 正则匹配 / 不匹配(RE2),左操作数为字符串字段 |
| 字符串 | contains suffix prefix | 包含 / 后缀 / 前缀匹配,如 tag contains 'motor' |
| 范围 | in | 数值区间检查(闭区间),如 value in 50..100 |
| 逻辑 | && || ! | 与、或、非 |
| 分组 | ( ) | 括号改变优先级 |
字面量
| 类型 | 写法 | 示例 |
|---|---|---|
| 字符串 | 单引号包裹 | 'temperature' |
| 数值 | 数字字面量 | 95、0.2、-10 |
| 布尔 | true / false | value == true |
特殊匹配
| 取值 | 含义 |
|---|---|
ALL | 匹配所有数据点,常用于兜底规则 |
RULE-SET:name | 委托给名为 name 的外部规则提供者(rule-providers)匹配 |
SUB-RULE:name | 委托给名为 name 的子规则组(rule-groups)匹配 |
示例
# 按标签名 + 数值阈值
match: "tag == 'temperature' && value > 95"
# 按分组
match: "group == 'reactor'"
# 按驱动 + 质量
match: "driver == 'plc-modbus' && quality != 'good'"
# 布尔标签
match: "tag == 'emergency_stop' && value == true"
# 复合条件
match: "(group == 'sensors' || group == 'reactor') && value > 80"
# 正则匹配
match: "tag =~ '^reactor_.*'"
# 字符串包含 / 前缀
match: "tag contains 'motor' && driver prefix 'siemens'"
# 数值区间
match: "value in 50..200"
# 委托外部规则集
match: "RULE-SET:safety-rules"
# 兜底
match: "ALL"TIP
字符串比较使用单引号 '...'。表达式中的 &&、|| 在 YAML 中无需转义,但若整行表达式含特殊字符,建议用双引号包裹整个 match 值。
动作类型(action)
action | 说明 | 需要的字段 |
|---|---|---|
forward | 转发到单个目标传输 | target |
drop | 丢弃该数据点,不再传输 | 无 |
alert | 转发到目标传输并触发告警回调 | target |
transform | 对数据点做变换后转发 | target + transform |
mirror | 镜像转发到多个目标传输 | targets |
forward
将数据点发送到指定的单个传输。最常用的动作。
- name: default-catch-all
match: "ALL"
action: forward
target: mes-http-push
priority: 999drop
丢弃匹配的数据点,常用于过滤无效或噪声数据。
- name: drop-bad-quality
match: "quality == 'bad'"
action: drop
priority: 1alert
转发数据点到目标传输,同时触发核心告警回调(可通过 API 订阅告警事件)。用于越限、急停等需即时通知的场景。
- name: high-temp-alert
match: "tag == 'temperature' && value > 95"
action: alert
target: cloud-mqtt
priority: 1INFO
alert 与 forward 的区别在于:alert 会额外在核心告警通道产生一条事件(告警以 规则名|驱动名|标签名 为身份聚合,记录值、质量、首末触发时间与触发次数),便于运维侧实时感知;数据点本身仍会正常发送到 target。
transform
对数据点执行变换后转发。变换规则定义在 transform 子对象中。
- name: celsius-to-fahrenheit
match: "tag == 'temperature'"
action: transform
target: cloud-mqtt
priority: 5
transform:
expression: "value * 1.8 + 32"
tag-rename: "temperature_f"mirror
将同一数据点复制并分别发送到 targets 列表中的每个传输,实现多目的地冗余分发。
mirror 与 forward 的实现关系
forward 与 mirror 在引擎内部走完全相同的执行路径,且两者都接受 target(单目标)或 targets(多目标列表)——区别只在语义意图:mirror 表达"冗余分发到多个目的地",forward 表达"常规转发"。写 action: forward + targets: [...] 与写 action: mirror 效果一致;mirror 保留为意图标记(以及与多目标语义的兼容别名)。需要"命中后继续评估后续规则"时给两者配 continue: true。
- name: reactor-mirror
match: "group == 'reactor'"
action: mirror
targets:
- cloud-mqtt
- mes-http-push
priority: 10WARNING
mirror 会将数据点复制 N 份(N = targets 长度),上游带宽与目标存储成本随之成倍增加。请仅在确有冗余或分流需求时使用。
target 与 targets
drop 之外的动作均接受 target(单目标)或 targets(多目标列表)任一形式:targets 未设置而 target 存在时按单元素列表处理,两者引用的传输名都必须存在于 transports。
| 动作 | 使用字段 | 说明 |
|---|---|---|
forward / alert / transform | target(或 targets) | 目标传输,通常写 target |
mirror | targets(或 target) | 传输名列表,冗余分发到每一项 |
drop | 无 | 不需要目标 |
# 单目标
target: cloud-mqtt
# 多目标
targets:
- cloud-mqtt
- mes-http-pushWARNING
target / targets 引用了不存在的传输名时,配置校验直接失败(启动与 PUT /configs 均被拒绝),错误信息会指名规则与不存在的目标。请确保目标名与 transports[].name 完全一致。
priority
规则求值顺序由 priority 决定:
- 数值越小,优先级越高,越先求值;
- 同优先级按配置顺序求值:
rules列表中先声明的规则先求值,通用规则与driver域规则按声明顺序混排——不存在隐式的"通用规则优先",同优先级规则之间是否遮蔽完全由配置顺序决定(需要让某条规则先求值,就把它写在前面); - 首个命中的规则执行动作后,数据点结束本次规则流程;
- 未命中任何规则的数据点将被丢弃,因此建议始终配置一条
match: "ALL"的兜底规则。
rules:
- name: critical-alert # priority: 1 最先求值
match: "tag == 'emergency_stop' && value == true"
action: alert
target: cloud-mqtt
priority: 1
- name: reactor-mirror # priority: 10
match: "group == 'reactor'"
action: mirror
targets: [cloud-mqtt, mes-http-push]
priority: 10
- name: default-catch-all # priority: 999 兜底
match: "ALL"
action: forward
target: mes-http-push
priority: 999WARNING
未匹配任何规则的数据点会被丢弃。 CoreC 默认不转发(不同于代理工具的默认直连行为),强制显式声明路由意图。务必保留一条低优先级 ALL 兜底规则。
continue 标记
continue 控制规则命中后是否继续评估后续规则:
continue | 行为 |
|---|---|
false(默认) | 命中即终止,不再评估后续规则(首次匹配即生效) |
true | 命中后执行动作,然后继续按优先级评估后续规则 |
WARNING
drop 动作不可设置 continue: true——丢弃意味着停止处理,继续评估是矛盾的。配置校验会拒绝此组合。
典型用法
告警 + 正常转发(最常见):alert 规则设 continue: true,数据告警后仍走兜底转发:
rules:
- name: high-temp-alert
match: "tag == 'temperature' && value > 95"
action: alert
target: cloud-mqtt
priority: 1
continue: true # 告警后继续
- name: default-catch-all
match: "ALL"
action: forward
target: mes-http-push
priority: 999告警 + 丢弃(告警但不污染下游):
- name: bad-quality-alert
match: "quality == 'bad'"
action: alert
target: ops-notify
priority: 1
continue: true # 先告警
- name: bad-quality-drop
match: "quality == 'bad'"
action: drop
priority: 2 # 再丢弃,终止变换后继续路由(后续规则看到变换后的值):
- name: adc-to-celsius
match: "tag == 'temp_adc'"
action: transform
target: cloud-mqtt
priority: 10
transform:
expression: "value / 65535 * 150 - 20"
tag-rename: temp_celsius
continue: true # 变换后继续,后续规则发布的是 °C 值transform + continue 的匹配限制
continue: true 的 transform 规则修改 point 后,后续规则的发布数据看到变换后的值,但后续规则的匹配条件已在原始值上求值完毕。例如 transform 将 tag 改为 temp_celsius 后,match: "tag == 'temp_celsius'" 的规则不会因此命中——它在原始 tag 上求值。需要基于变换后值路由时,后续规则用 match: "ALL" 兜底即可。
transform(数据变换)
transform 子对象定义数据变换规则,对应核心 TransformConfig 结构。仅 action: transform 时生效。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
expression | string | 是 | — | 值变换表达式,对 value 求值后替换原值 |
tag-rename | string | 否 | — | 重命名后的标签名,留空则保持原名 |
expression
对数据点的 value 执行的表达式,可引用 value 与数值字面量,支持四则运算与括号:
| 运算符 | 说明 |
|---|---|
+ - * / | 四则运算 |
( ) | 括号分组 |
仅对数值类型的 value 求值:非数值点(bool/string/bytes)原样通过不做变换;表达式结果为 NaN/Inf(如除零)时保留原值并记录 warn 日志。
transform:
expression: "value * 1.8 + 32" # 摄氏转华氏transform:
expression: "(value - 0) * 100 / 65535" # 16 位原始值转 0-100 百分比tag-rename
变换后的数据点可重命名标签,便于下游区分原始量与工程量:
- name: temp-unit-convert
match: "tag == 'temperature'"
action: transform
target: cloud-mqtt
priority: 5
transform:
expression: "value * 1.8 + 32"
tag-rename: "temperature_f" # 下游收到的 tag 名变为 temperature_fINFO
transform 先执行 expression 计算新值,再应用 tag-rename。若仅需重命名而不改值,可写 expression: "value"。
完整示例
rules:
# 1. 高温告警:转发到云 MQTT 并触发告警,然后继续正常转发
- name: high-temp-alert
match: "tag == 'temperature' && value > 95"
action: alert
target: cloud-mqtt
priority: 1
continue: true # 告警后继续评估后续规则
# 2. 急停告警:高优先级
- name: emergency-stop-alert
match: "tag == 'emergency_stop' && value == true"
action: alert
target: cloud-mqtt
priority: 2
# 3. 丢弃坏质量数据
- name: drop-bad-quality
match: "quality == 'bad'"
action: drop
priority: 3
# 4. 温度单位换算后转发
- name: celsius-to-fahrenheit
match: "tag == 'temperature'"
action: transform
target: cloud-mqtt
priority: 5
transform:
expression: "value * 1.8 + 32"
tag-rename: "temperature_f"
# 5. 反应器数据镜像到 MQTT 与 MES 双通道
- name: reactor-mirror
match: "group == 'reactor'"
action: mirror
targets:
- cloud-mqtt
- mes-http-push
priority: 10
# 6. 兜底:其余全部转发到 MES HTTP
- name: default-catch-all
match: "ALL"
action: forward
target: mes-http-push
priority: 999