diff --git a/accounts/pkg/command/server.go b/accounts/pkg/command/server.go index 7228316e9..5e0ce5f33 100644 --- a/accounts/pkg/command/server.go +++ b/accounts/pkg/command/server.go @@ -3,25 +3,18 @@ package command import ( "context" "strings" - "time" "github.com/owncloud/ocis/ocis-pkg/sync" - "contrib.go.opencensus.io/exporter/jaeger" - "contrib.go.opencensus.io/exporter/ocagent" - "contrib.go.opencensus.io/exporter/zipkin" "github.com/micro/cli/v2" "github.com/oklog/run" - openzipkin "github.com/openzipkin/zipkin-go" - zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http" "github.com/owncloud/ocis/accounts/pkg/config" "github.com/owncloud/ocis/accounts/pkg/flagset" "github.com/owncloud/ocis/accounts/pkg/metrics" "github.com/owncloud/ocis/accounts/pkg/server/grpc" "github.com/owncloud/ocis/accounts/pkg/server/http" svc "github.com/owncloud/ocis/accounts/pkg/service/v0" - "go.opencensus.io/stats/view" - "go.opencensus.io/trace" + "github.com/owncloud/ocis/accounts/pkg/tracing" ) // Server is the entry point for the server command. @@ -47,87 +40,13 @@ func Server(cfg *config.Config) *cli.Command { }, Action: func(c *cli.Context) error { logger := NewLogger(cfg) - if cfg.Tracing.Enabled { - switch t := cfg.Tracing.Type; t { - case "agent": - exporter, err := ocagent.NewExporter( - ocagent.WithReconnectionPeriod(5*time.Second), - ocagent.WithAddress(cfg.Tracing.Endpoint), - ocagent.WithServiceName(cfg.Tracing.Service), - ) - if err != nil { - logger.Error(). - Err(err). - Str("endpoint", cfg.Tracing.Endpoint). - Str("collector", cfg.Tracing.Collector). - Msg("Failed to create agent tracing") - return err - } - trace.RegisterExporter(exporter) - view.RegisterExporter(exporter) - case "jaeger": - exporter, err := jaeger.NewExporter( - jaeger.Options{ - AgentEndpoint: cfg.Tracing.Endpoint, - CollectorEndpoint: cfg.Tracing.Collector, - Process: jaeger.Process{ - ServiceName: cfg.Tracing.Service, - }, - }, - ) - if err != nil { - logger.Error(). - Err(err). - Str("endpoint", cfg.Tracing.Endpoint). - Str("collector", cfg.Tracing.Collector). - Msg("Failed to create jaeger tracing") - return err - } - trace.RegisterExporter(exporter) - case "zipkin": - endpoint, err := openzipkin.NewEndpoint( - cfg.Tracing.Service, - cfg.Tracing.Endpoint, - ) - if err != nil { - logger.Error(). - Err(err). - Str("endpoint", cfg.Tracing.Endpoint). - Str("collector", cfg.Tracing.Collector). - Msg("Failed to create zipkin tracing") - return err - } - exporter := zipkin.NewExporter( - zipkinhttp.NewReporter( - cfg.Tracing.Collector, - ), - endpoint, - ) - trace.RegisterExporter(exporter) - default: - logger.Warn(). - Str("type", t). - Msg("Unknown tracing backend") - } - trace.ApplyConfig( - trace.Config{ - DefaultSampler: trace.AlwaysSample(), - }, - ) - } else { - logger.Debug(). - Msg("Tracing is not enabled") + err := tracing.Configure(cfg, logger) + if err != nil { + return err } - var ( - gr = run.Group{} - ctx, cancel = func() (context.Context, context.CancelFunc) { - if cfg.Context == nil { - return context.WithCancel(context.Background()) - } - return context.WithCancel(cfg.Context) - }() - mtrcs = metrics.New() - ) + gr := run.Group{} + ctx, cancel := defineContext(cfg) + mtrcs := metrics.New() defer cancel() @@ -139,37 +58,33 @@ func Server(cfg *config.Config) *cli.Command { return err } - { - server := http.Server( - http.Logger(logger), - http.Name(cfg.Server.Name), - http.Context(ctx), - http.Config(cfg), - http.Metrics(mtrcs), - http.Handler(handler), - ) + httpServer := http.Server( + http.Config(cfg), + http.Logger(logger), + http.Name(cfg.Server.Name), + http.Context(ctx), + http.Metrics(mtrcs), + http.Handler(handler), + ) - gr.Add(server.Run, func(_ error) { - logger.Info().Str("server", "http").Msg("Shutting down server") - cancel() - }) - } + gr.Add(httpServer.Run, func(_ error) { + logger.Info().Str("server", "http").Msg("shutting down server") + cancel() + }) - { - server := grpc.Server( - grpc.Logger(logger), - grpc.Name(cfg.Server.Name), - grpc.Context(ctx), - grpc.Config(cfg), - grpc.Metrics(mtrcs), - grpc.Handler(handler), - ) + grpcServer := grpc.Server( + grpc.Config(cfg), + grpc.Logger(logger), + grpc.Name(cfg.Server.Name), + grpc.Context(ctx), + grpc.Metrics(mtrcs), + grpc.Handler(handler), + ) - gr.Add(server.Run, func(_ error) { - logger.Info().Str("server", "grpc").Msg("Shutting down server") - cancel() - }) - } + gr.Add(grpcServer.Run, func(_ error) { + logger.Info().Str("server", "grpc").Msg("shutting down server") + cancel() + }) if !cfg.Supervised { sync.Trap(&gr, cancel) @@ -179,3 +94,14 @@ func Server(cfg *config.Config) *cli.Command { }, } } + +// defineContext sets the context for the extension. If there is a context configured it will create a new child from it, +// if not, it will create a root context that can be cancelled. +func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) { + return func() (context.Context, context.CancelFunc) { + if cfg.Context == nil { + return context.WithCancel(context.Background()) + } + return context.WithCancel(cfg.Context) + }() +} diff --git a/accounts/pkg/tracing/tracing.go b/accounts/pkg/tracing/tracing.go new file mode 100644 index 000000000..d16ded696 --- /dev/null +++ b/accounts/pkg/tracing/tracing.go @@ -0,0 +1,90 @@ +package tracing + +import ( + "time" + + "contrib.go.opencensus.io/exporter/jaeger" + "contrib.go.opencensus.io/exporter/ocagent" + "contrib.go.opencensus.io/exporter/zipkin" + openzipkin "github.com/openzipkin/zipkin-go" + zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http" + "github.com/owncloud/ocis/accounts/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/log" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" +) + +func Configure(cfg *config.Config, logger log.Logger) error { + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + exporter, err := ocagent.NewExporter( + ocagent.WithReconnectionPeriod(5*time.Second), + ocagent.WithAddress(cfg.Tracing.Endpoint), + ocagent.WithServiceName(cfg.Tracing.Service), + ) + if err != nil { + logger.Error(). + Err(err). + Str("endpoint", cfg.Tracing.Endpoint). + Str("collector", cfg.Tracing.Collector). + Msg("Failed to create agent tracing") + return err + } + trace.RegisterExporter(exporter) + view.RegisterExporter(exporter) + case "jaeger": + exporter, err := jaeger.NewExporter( + jaeger.Options{ + AgentEndpoint: cfg.Tracing.Endpoint, + CollectorEndpoint: cfg.Tracing.Collector, + Process: jaeger.Process{ + ServiceName: cfg.Tracing.Service, + }, + }, + ) + if err != nil { + logger.Error(). + Err(err). + Str("endpoint", cfg.Tracing.Endpoint). + Str("collector", cfg.Tracing.Collector). + Msg("Failed to create jaeger tracing") + return err + } + trace.RegisterExporter(exporter) + case "zipkin": + endpoint, err := openzipkin.NewEndpoint( + cfg.Tracing.Service, + cfg.Tracing.Endpoint, + ) + if err != nil { + logger.Error(). + Err(err). + Str("endpoint", cfg.Tracing.Endpoint). + Str("collector", cfg.Tracing.Collector). + Msg("Failed to create zipkin tracing") + return err + } + exporter := zipkin.NewExporter( + zipkinhttp.NewReporter( + cfg.Tracing.Collector, + ), + endpoint, + ) + trace.RegisterExporter(exporter) + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + trace.ApplyConfig( + trace.Config{ + DefaultSampler: trace.AlwaysSample(), + }, + ) + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + return nil +}