Skip to content

规则配置 ​

rules 段定义数据路由与处理规则。每个数据点在采集后按 priority 顺序求值匹配,命中则执行对应动作(转发、丢弃、告警、变换、镜像)。

yaml
rules:
  - name: high-temp-alert
    match: "tag == 'temperature' && value > 95"
    action: alert
    target: cloud-mqtt
    priority: 1

规则通用字段 ​

对应核心 RuleConfig 结构。

字段类型必填默认值说明
namestring是—规则名称,用于日志与统计引用
matchstring是—匹配表达式,见匹配表达式语法
actionstring是—命中后执行的动作类型
targetstring条件必填—目标传输名(单目标)
targetsstring[]条件必填—目标传输名列表(多目标;未设置时回退取 target)
priorityint否0优先级,数值越小优先级越高
continuebool否false命中后是否继续评估后续规则(见continue 标记)
transformobject否—数据变换配置,仅 transform 动作使用

INFO

规则按 priority 升序求值(数值小 = 优先级高),同优先级按配置文件中的声明顺序求值。默认情况下(continue: false),首个命中的规则执行其动作后,数据点即结束本次规则求值流程。设置 continue: true 后,规则命中执行动作但不停止,继续评估后续规则——这使得一个数据点可以触发多条规则(如"告警后继续正常转发")。


匹配表达式语法 ​

match 字段是一个类 C/Go 风格的布尔表达式,对每个 DataPoint 求值。表达式可引用数据点字段、字面量,并使用比较与逻辑运算符。

可用字段 ​

表达式可引用以下数据点字段:

字段类型说明
driverstring驱动实例名
devicestring设备名
groupstring标签分组
tagstring标签名
valueany数据值(按标签类型解释为数值或布尔)
typestring数据类型名(如 float32)
qualitystring数据质量:good / bad / uncertain
timestampint采集时刻的 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 / falsevalue == true

特殊匹配 ​

取值含义
ALL匹配所有数据点,常用于兜底规则
RULE-SET:name委托给名为 name 的外部规则提供者(rule-providers)匹配
SUB-RULE:name委托给名为 name 的子规则组(rule-groups)匹配

示例 ​

yaml
# 按标签名 + 数值阈值
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 ​

将数据点发送到指定的单个传输。最常用的动作。

yaml
- name: default-catch-all
  match: "ALL"
  action: forward
  target: mes-http-push
  priority: 999

drop ​

丢弃匹配的数据点,常用于过滤无效或噪声数据。

yaml
- name: drop-bad-quality
  match: "quality == 'bad'"
  action: drop
  priority: 1

alert ​

转发数据点到目标传输,同时触发核心告警回调(可通过 API 订阅告警事件)。用于越限、急停等需即时通知的场景。

yaml
- name: high-temp-alert
  match: "tag == 'temperature' && value > 95"
  action: alert
  target: cloud-mqtt
  priority: 1

INFO

alert 与 forward 的区别在于:alert 会额外在核心告警通道产生一条事件(告警以 规则名|驱动名|标签名 为身份聚合,记录值、质量、首末触发时间与触发次数),便于运维侧实时感知;数据点本身仍会正常发送到 target。

transform ​

对数据点执行变换后转发。变换规则定义在 transform 子对象中。

yaml
- 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。

yaml
- name: reactor-mirror
  match: "group == 'reactor'"
  action: mirror
  targets:
    - cloud-mqtt
    - mes-http-push
  priority: 10

WARNING

mirror 会将数据点复制 N 份(N = targets 长度),上游带宽与目标存储成本随之成倍增加。请仅在确有冗余或分流需求时使用。


target 与 targets ​

drop 之外的动作均接受 target(单目标)或 targets(多目标列表)任一形式:targets 未设置而 target 存在时按单元素列表处理,两者引用的传输名都必须存在于 transports。

动作使用字段说明
forward / alert / transformtarget(或 targets)目标传输,通常写 target
mirrortargets(或 target)传输名列表,冗余分发到每一项
drop无不需要目标
yaml
# 单目标
target: cloud-mqtt

# 多目标
targets:
  - cloud-mqtt
  - mes-http-push

WARNING

target / targets 引用了不存在的传输名时,配置校验直接失败(启动与 PUT /configs 均被拒绝),错误信息会指名规则与不存在的目标。请确保目标名与 transports[].name 完全一致。


priority ​

规则求值顺序由 priority 决定:

  • 数值越小,优先级越高,越先求值;
  • 同优先级按配置顺序求值:rules 列表中先声明的规则先求值,通用规则与 driver 域规则按声明顺序混排——不存在隐式的"通用规则优先",同优先级规则之间是否遮蔽完全由配置顺序决定(需要让某条规则先求值,就把它写在前面);
  • 首个命中的规则执行动作后,数据点结束本次规则流程;
  • 未命中任何规则的数据点将被丢弃,因此建议始终配置一条 match: "ALL" 的兜底规则。
yaml
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: 999

WARNING

未匹配任何规则的数据点会被丢弃。 CoreC 默认不转发(不同于代理工具的默认直连行为),强制显式声明路由意图。务必保留一条低优先级 ALL 兜底规则。


continue 标记 ​

continue 控制规则命中后是否继续评估后续规则:

continue行为
false(默认)命中即终止,不再评估后续规则(首次匹配即生效)
true命中后执行动作,然后继续按优先级评估后续规则

WARNING

drop 动作不可设置 continue: true——丢弃意味着停止处理,继续评估是矛盾的。配置校验会拒绝此组合。

典型用法 ​

告警 + 正常转发(最常见):alert 规则设 continue: true,数据告警后仍走兜底转发:

yaml
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

告警 + 丢弃(告警但不污染下游):

yaml
  - 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               # 再丢弃,终止

变换后继续路由(后续规则看到变换后的值):

yaml
  - 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 时生效。

字段类型必填默认值说明
expressionstring是—值变换表达式,对 value 求值后替换原值
tag-renamestring否—重命名后的标签名,留空则保持原名

expression ​

对数据点的 value 执行的表达式,可引用 value 与数值字面量,支持四则运算与括号:

运算符说明
+ - * /四则运算
( )括号分组

仅对数值类型的 value 求值:非数值点(bool/string/bytes)原样通过不做变换;表达式结果为 NaN/Inf(如除零)时保留原值并记录 warn 日志。

yaml
transform:
  expression: "value * 1.8 + 32"     # 摄氏转华氏
yaml
transform:
  expression: "(value - 0) * 100 / 65535"   # 16 位原始值转 0-100 百分比

tag-rename ​

变换后的数据点可重命名标签,便于下游区分原始量与工程量:

yaml
- 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_f

INFO

transform 先执行 expression 计算新值,再应用 tag-rename。若仅需重命名而不改值,可写 expression: "value"。


完整示例 ​

yaml
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

Released under the MIT License.