创建模块
Shell
mkdir example-transform && cd example-transform
go mod init example-transform
go get github.com/punk-one/iot-rule-plugin-sdk@v1.0.0实现插件
main.go
package main
import sdk "github.com/punk-one/iot-rule-plugin-sdk"
type processor struct {
sdk.BasePlugin
ctx sdk.RuntimeContext
}
func (p *processor) Info() sdk.PluginInfo {
return sdk.PluginInfo{
ID: "example-transform",
Name: "Example Transform",
Version: "1.0.0",
Type: sdk.PluginTypeProcessor,
}
}
func (p *processor) Start(ctx sdk.RuntimeContext) error {
p.ctx = ctx
ctx.Logger().Info("example processor started")
return ctx.Health().Healthy("ready", nil)
}
func (p *processor) OnEvent(in sdk.Event) error {
p.ctx.Logger().Info("input received")
out := in.Clone() // 在这里编写转换逻辑
if out.Payload == nil {
out.Payload = map[string]interface{}{}
}
out.Payload["processed"] = true
return p.ctx.Emitter().Publish(out)
}
func main() {
sdk.ServeFactory(
func() sdk.Plugin { return &processor{} },
sdk.ServeOptions{},
)
}嵌入 BasePlugin 后只需覆写真正使用的方法。ServeFactory 为每个规则实例创建独立对象,同时同一种插件只需要一个包进程。
构建与 manifest
Shell
go test ./...
go vet ./...
go build -o example-transform .插件目录至少包含可执行产物和 manifest。manifest 声明 ID、名称、版本、类型、入口和配置 schema;ID 与版本必须与 Info() 一致。不要复制其他插件的共享代码,公共能力应进入 SDK。
输入与返回约定
OnEvent输入一个 SDK Event;不要保留并在调用结束后异步修改它。- 输出通过
Emitter().Publish返回,不使用全局变量跨实例共享业务状态。 - 无输出的过滤节点可以成功返回而不发布事件。
- 错误应返回给引擎;健康降级、指标与日志分别通过 RuntimeContext 上报。