SDK / Example

编写一个 Processor

这个示例记录输入,克隆事件,增加处理标记,再把结果交给下游。

创建模块

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 上报。