From a3f7f566d74b90d42e5b1e814e95d7e40d8ff3f1 Mon Sep 17 00:00:00 2001 From: Rogee Date: Sun, 29 Dec 2024 17:38:37 +0800 Subject: [PATCH] feat: add tracing --- templates/project/providers/tracing/config.go | 47 +++++++++++++++ .../project/providers/tracing/provider.go | 57 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 templates/project/providers/tracing/config.go create mode 100644 templates/project/providers/tracing/provider.go diff --git a/templates/project/providers/tracing/config.go b/templates/project/providers/tracing/config.go new file mode 100644 index 0000000..60dfe40 --- /dev/null +++ b/templates/project/providers/tracing/config.go @@ -0,0 +1,47 @@ +package tracing + +import ( + "git.ipao.vip/rogeecn/atom/container" + "git.ipao.vip/rogeecn/atom/utils/opt" + "github.com/sirupsen/logrus" +) + +const DefaultPrefix = "Tracing" + +func DefaultProvider() container.ProviderContainer { + return container.ProviderContainer{ + Provider: Provide, + Options: []opt.Option{ + opt.Prefix(DefaultPrefix), + }, + } +} + +// 自定义的 Logger 实现 +type jaegerLogrus struct { + logger *logrus.Logger +} + +func (l *jaegerLogrus) Error(msg string) { + l.logger.Error(msg) +} + +func (l *jaegerLogrus) Infof(msg string, args ...interface{}) { + l.logger.Infof(msg, args...) +} + +type Config struct { + Name string + Reporter_LocalAgentHostPort string //: "127.0.0.1:6831", + Reporter_CollectorEndpoint string //: "http://127.0.0.1:14268/api/traces", +} + +func (c *Config) format() { + if c.Reporter_LocalAgentHostPort == "" { + c.Reporter_LocalAgentHostPort = "127.0.0.1:6831" + } + + if c.Reporter_CollectorEndpoint == "" { + c.Reporter_CollectorEndpoint = "http://127.0.0.1:14268/api/traces" + } +} diff --git a/templates/project/providers/tracing/provider.go b/templates/project/providers/tracing/provider.go new file mode 100644 index 0000000..d2766fe --- /dev/null +++ b/templates/project/providers/tracing/provider.go @@ -0,0 +1,57 @@ +package tracing + +import ( + "io" + "time" + + "git.ipao.vip/rogeecn/atom/container" + "git.ipao.vip/rogeecn/atom/utils/opt" + opentracing "github.com/opentracing/opentracing-go" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + config "github.com/uber/jaeger-client-go/config" +) + +func Provide(opts ...opt.Option) error { + o := opt.New(opts...) + var conf Config + if err := o.UnmarshalConfig(&conf); err != nil { + return err + } + conf.format() + return container.Container.Provide(func() (opentracing.Tracer, io.Closer, error) { + log := logrus.New() + log.SetFormatter(&logrus.TextFormatter{ + FullTimestamp: true, + TimestampFormat: "2006-01-02 15:04:05", + }) + + cfg := &config.Configuration{ + ServiceName: conf.Name, + Sampler: &config.SamplerConfig{ + Type: "const", + Param: 1, + }, + Reporter: &config.ReporterConfig{ + LogSpans: true, + LocalAgentHostPort: "127.0.0.1:6831", + CollectorEndpoint: "http://127.0.0.1:14268/api/traces", + BufferFlushInterval: 100 * time.Millisecond, + QueueSize: 1000, + }, + } + + // 使用自定义的 logger + jLogger := &jaegerLogrus{logger: log} + tracer, closer, err := cfg.NewTracer( + config.Logger(jLogger), + config.ZipkinSharedRPCSpan(true), + ) + if err != nil { + return nil, nil, errors.Wrapf(err, "无法初始化 Jaeger: %v", err) + } + opentracing.SetGlobalTracer(tracer) + + return tracer, closer, nil + }, o.DiOptions()...) +}