diff --git a/example/client-server-with-otel/client/main.go b/example/client-server-with-otel/client/main.go index e697bd9..e4af20b 100644 --- a/example/client-server-with-otel/client/main.go +++ b/example/client-server-with-otel/client/main.go @@ -21,9 +21,10 @@ func main() { app.Use( client.Module(), server.Module(), - otel.Module(), - otelclient.Module(), - otelserver.Module(), + otel.Module( + otelclient.WithClient(), + otelserver.WithServer(), + ), ) app.Provide( diff --git a/example/client-server-with-otel/server/main.go b/example/client-server-with-otel/server/main.go index 7492417..ae582fd 100644 --- a/example/client-server-with-otel/server/main.go +++ b/example/client-server-with-otel/server/main.go @@ -18,9 +18,10 @@ func main() { app.Use( server.Module(), - otel.Module(), - otelclient.Module(), - otelserver.Module(), + otel.Module( + otelclient.WithClient(), + otelserver.WithServer(), + ), ) app.Provide( diff --git a/example/consumer-with-otel/main.go b/example/consumer-with-otel/main.go index d50062e..d13ff08 100644 --- a/example/consumer-with-otel/main.go +++ b/example/consumer-with-otel/main.go @@ -17,8 +17,9 @@ func main() { ) app.Use( - otel.Module(), - otelkafka.Module(), + otel.Module( + otelkafka.WithKafka(), + ), kafka.Module(), ) diff --git a/example/server-with-newrelic/main.go b/example/server-with-newrelic/main.go index d7d4264..6331042 100644 --- a/example/server-with-newrelic/main.go +++ b/example/server-with-newrelic/main.go @@ -29,9 +29,10 @@ func main() { ) app.Use( - otel.Module(), + otel.Module( + otelserver.WithServer(), + ), orm.Module(postgresdriver.New()), - otelserver.Module(), server.Module(), swagger.Module(), diff --git a/example/server-with-otel/main.go b/example/server-with-otel/main.go index 389d7d3..d485940 100644 --- a/example/server-with-otel/main.go +++ b/example/server-with-otel/main.go @@ -20,8 +20,9 @@ func main() { ) app.Use( - otel.Module(), - otelserver.Module(), + otel.Module( + otelserver.WithServer(), + ), server.Module(), ) diff --git a/example/server-with-postgres/main.go b/example/server-with-postgres/main.go index 154a9d0..fd53540 100644 --- a/example/server-with-postgres/main.go +++ b/example/server-with-postgres/main.go @@ -23,9 +23,10 @@ func main() { ) app.Use( - otel.Module(), + otel.Module( + otelserver.WithServer(), + ), orm.Module(postgresdriver.New()), - otelserver.Module(), server.Module(), swagger.Module(), ) diff --git a/modules/otel/client/module.go b/modules/otel/client/module.go index 6134432..8078bce 100644 --- a/modules/otel/client/module.go +++ b/modules/otel/client/module.go @@ -5,15 +5,15 @@ import ( "github.com/Trendyol/chaki/module" clientcommon "github.com/Trendyol/chaki/modules/client/common" + otelmodule "github.com/Trendyol/chaki/modules/otel" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" ) -const ModuleName = "chaki-otel-client" - -func Module() *module.Module { - return module.New(ModuleName).Provide(newClientRoundTripperWrapper) +func WithClient() otelmodule.Option { + m := module.NewSubModule().Provide(newClientRoundTripperWrapper) + return otelmodule.WithSubModule(m) } func newClientRoundTripperWrapper(tp trace.TracerProvider, tmp propagation.TextMapPropagator) clientcommon.RoundTripperWrapper { diff --git a/modules/otel/kafka/module.go b/modules/otel/kafka/module.go index fa02822..13aeb99 100644 --- a/modules/otel/kafka/module.go +++ b/modules/otel/kafka/module.go @@ -7,22 +7,19 @@ import ( "github.com/Trendyol/chaki/module" "github.com/Trendyol/chaki/modules/kafka/consumer" "github.com/Trendyol/chaki/modules/kafka/producer" + otelmodule "github.com/Trendyol/chaki/modules/otel" "go.opentelemetry.io/otel/trace" ) -const moduleName = "chaki-otel-kafka" - -func Module() *module.Module { - m := module.New(moduleName) - - m.Provide( +func WithKafka() otelmodule.Option { + m := module.NewSubModule().Provide( newSpanBuilder, newConsumerInterceptor, newProducerInterceptor, newBatchConsumerInterceptor, ) - return m + return otelmodule.WithSubModule(m) } func newConsumerInterceptor(sb *spanBuilder) consumer.Interceptor { diff --git a/modules/otel/module.go b/modules/otel/module.go index 4a56a4e..29195c4 100644 --- a/modules/otel/module.go +++ b/modules/otel/module.go @@ -21,6 +21,8 @@ func Module(opts ...Option) *module.Module { startOtel, ) + m.Merge(o.subModules...) + return m } diff --git a/modules/otel/option.go b/modules/otel/option.go index b0b29e3..92f0cba 100644 --- a/modules/otel/option.go +++ b/modules/otel/option.go @@ -1,31 +1,41 @@ package otel -import "context" +import ( + "context" + + "github.com/Trendyol/chaki/module" +) type CloseFunc func(context.Context) error type InitFunc func() CloseFunc type options struct { - initFunc InitFunc + initFunc InitFunc + subModules []*module.SubModule } type Option interface { - Apply(*options) *options + Apply(*options) } -type withOption func(*options) *options +type withOption func(*options) -func (wf withOption) Apply(opts *options) *options { - return wf(opts) +func (wf withOption) Apply(opts *options) { + wf(opts) } var _ Option = withOption(nil) func WithInitFunc(f InitFunc) Option { - return withOption(func(o *options) *options { + return withOption(func(o *options) { o.initFunc = f - return o + }) +} + +func WithSubModule(sub ...*module.SubModule) Option { + return withOption(func(o *options) { + o.subModules = append(o.subModules, sub...) }) } @@ -33,7 +43,7 @@ func applyOptions(opts ...Option) *options { o := &options{} for _, opt := range opts { - o = opt.Apply(o) + opt.Apply(o) } return o diff --git a/modules/otel/server/module.go b/modules/otel/server/module.go index e812acb..429eb36 100644 --- a/modules/otel/server/module.go +++ b/modules/otel/server/module.go @@ -2,6 +2,7 @@ package otelserver import ( "github.com/Trendyol/chaki/module" + otelmodule "github.com/Trendyol/chaki/modules/otel" otelcommon "github.com/Trendyol/chaki/modules/otel/common" servercommon "github.com/Trendyol/chaki/modules/server/common" "github.com/gofiber/contrib/otelfiber/v2" @@ -9,10 +10,9 @@ import ( "go.opentelemetry.io/otel/trace" ) -const ModuleName = "chaki-otel-server" - -func Module() *module.Module { - return module.New(ModuleName).Provide(newMiddlewareGroup) +func WithServer() otelmodule.Option { + m := module.NewSubModule().Provide(newMiddlewareGroup) + return otelmodule.WithSubModule(m) } func newMiddlewareGroup() servercommon.MiddlewareGroup {