Watermill OpenTelemetry集成
通过OpenTelemetry为Watermill带来分布式跟踪支持。
使用方法
对于发布者
package example
import (
"github.com/ThreeDotsLabs/watermill-googlecloud/pkg/googlecloud"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/garsue/watermillzap"
wotel "github.com/voi-oss/watermill-opentelemetry/pkg/opentelemetry"
"go.uber.org/zap"
)
type PublisherConfig struct {
Name string
GCPProjectID string
}
// NewPublisher instantiates a GCP Pub/Sub Publisher with tracing capabilities.
func NewPublisher(logger *zap.Logger, config PublisherConfig) (message.Publisher, error) {
publisher, err := googlecloud.NewPublisher(
googlecloud.PublisherConfig{ProjectID: config.GCPProjectID},
watermillzap.NewLogger(logger),
)
if err != nil {
return nil, err
}
if config.Name == "" {
return wotel.NewPublisherDecorator(publisher), nil
}
return wotel.NewNamedPublisherDecorator(config.Name, publisher), nil
}
对于订阅者
可以在路由器层面定义一个追踪中间件:
package example
import (
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
wotel "github.com/voi-oss/watermill-opentelemetry/pkg/opentelemetry"
)
func InitTracedRouter() (*message.Router, error) {
router, err := message.NewRouter(message.RouterConfig{}, watermill.NopLogger{})
if err != nil {
return nil, err
}
router.AddMiddleware(wotel.Trace())
return router, nil
}
另外,也可以对单个处理程序进行追踪:
package example
import (
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
wotel "github.com/voi-oss/watermill-opentelemetry/pkg/opentelemetry"
)
func InitRouter() (*message.Router, error) {
router, err := message.NewRouter(message.RouterConfig{}, watermill.NopLogger{})
if err != nil {
return nil, err
}
// subscriber definition omitted for clarity
subscriber := (message.Subscriber)(nil)
router.AddNoPublisherHandler(
"handler_name",
"subscribeTopic",
subscriber,
wotel.TraceNoPublishHandler(func(msg *message.Message) error {
return nil
}),
)
return router, nil
}