当前位置: 首页 > news >正文

cloudevents + jmespath 简单规则执行

cloudevents + jmespath 简单规则执行

实际上属于一个简单的业务场景,数据实体基于了cloudevents,但是希望进行里边数据的check,对于不用的check 结果会有一些action(比如发送通知等),以下是一个简单实现示例

参考代码

  • demo.js
import jmespath from "jmespath";
import { CloudEvent } from "cloudevents";const event = new CloudEvent({type: "com.example.sampletype",source: "/mycontext",data: { data1: 11, data2: 22, data3: 33 },
});function logRule1(value) {console.log(`Rule 1 triggered: data1 is ${JSON.stringify(value)}`);
}function logRule2(value) {console.log(`Rule 2 triggered: data2 is ${value}`);
}function logRule3(value) {console.log(`Rule 3 triggered: data3 is ${value}`);
}const actionFunctions = {logRule1,logRule2,logRule3,
};const rules = [{name: "Rule 1: data1 is greater than 10",query: "{data1: data.data1, data2: data.data2, data3: data.data3}",condition: "data.data1 > 10 && (data.data2 === 22)",action: "logRule1", isComplex: true,},{name: "Rule 2: data3 is equal to 33",query: "data.data3",condition: "=== 33",  action: "logRule3",}
];
rules.forEach((rule) => {const result = jmespath.search(event, rule.query);const conditionFunction = rule.isComplex ? new Function("data", `return ${rule.condition}`) : new Function("value", `return value ${rule.condition}`);if (result !== null && conditionFunction(result)) {const actionFunc = actionFunctions?.[rule.action];if (typeof actionFunc === "function") {actionFunc(result);} else {const actionFunction = new Function("value","return `" + rule.action + "`");console.log(actionFunction(result));}}
});
  • 代码简单说明 对于配置我们使用了直接的json 格式,不附带函数,函数是动态创建或者通过查找的,比如condtion的执行,里边包含了简单表达式以及复杂表达式,使用了一个独立的字段标识了,对于复杂格式,condition 必须使用data. 格式,对于数据的拼接我们直接使用了jmespath 可以方便的进行数据,当然直接将cloudevents 的data 传递也是可以的, 比如query 使用data

说明

以上是一个简单的玩法,核心是利用了jmespath 处理,以及动态函数创建,如果希望实现复杂的规则处理,可以使用一些其他引擎工具

参考资料

https://www.npmjs.com/package/jmespath

https://www.npmjs.com/package/cloudevents