From 0eb403d6581e40ff6ae4cad10b16f578de9c1508 Mon Sep 17 00:00:00 2001 From: "A.Unger" Date: Mon, 9 Aug 2021 15:52:06 +0200 Subject: [PATCH] replace go.opencensus.io with opentelemetry --- accounts/pkg/server/http/server.go | 1 + accounts/pkg/service/v0/accounts.go | 41 ++++++++++- accounts/pkg/tracing/tracing.go | 109 ++++++++++------------------ ocs/pkg/middleware/logtrace.go | 2 +- 4 files changed, 79 insertions(+), 74 deletions(-) diff --git a/accounts/pkg/server/http/server.go b/accounts/pkg/server/http/server.go index a71ca6f8f..af237d8b8 100644 --- a/accounts/pkg/server/http/server.go +++ b/accounts/pkg/server/http/server.go @@ -29,6 +29,7 @@ func Server(opts ...Option) http.Service { mux := chi.NewMux() mux.Use(middleware.RealIP) + mux.Use(middleware.TraceContext) mux.Use(middleware.RequestID) mux.Use(middleware.NoCache) mux.Use(middleware.Cors) diff --git a/accounts/pkg/service/v0/accounts.go b/accounts/pkg/service/v0/accounts.go index a40731fbd..d0e7c311f 100644 --- a/accounts/pkg/service/v0/accounts.go +++ b/accounts/pkg/service/v0/accounts.go @@ -12,10 +12,7 @@ import ( "strconv" "time" - "github.com/owncloud/ocis/ocis-pkg/sync" - "golang.org/x/crypto/bcrypt" - - "github.com/owncloud/ocis/ocis-pkg/log" + "go.opentelemetry.io/otel/attribute" merrors "github.com/asim/go-micro/v3/errors" "github.com/asim/go-micro/v3/metadata" @@ -24,11 +21,15 @@ import ( fieldmask_utils "github.com/mennanov/fieldmask-utils" "github.com/owncloud/ocis/accounts/pkg/proto/v0" "github.com/owncloud/ocis/accounts/pkg/storage" + accTracing "github.com/owncloud/ocis/accounts/pkg/tracing" + "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/ocis-pkg/middleware" "github.com/owncloud/ocis/ocis-pkg/roles" + "github.com/owncloud/ocis/ocis-pkg/sync" settings "github.com/owncloud/ocis/settings/pkg/proto/v0" settings_svc "github.com/owncloud/ocis/settings/pkg/service/v0" "github.com/rs/zerolog" + "golang.org/x/crypto/bcrypt" "google.golang.org/genproto/protobuf/field_mask" p "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" @@ -124,6 +125,14 @@ func (s Service) getInMemoryServiceUser() proto.Account { // ListAccounts implements the AccountsServiceHandler interface // the query contains account properties func (s Service) ListAccounts(ctx context.Context, in *proto.ListAccountsRequest, out *proto.ListAccountsResponse) (err error) { + ctx, span := accTracing.TraceProvider.Tracer("accounts").Start(ctx, "Accounts.ListAccounts") + defer span.End() + + span.SetAttributes( + attribute.KeyValue{Key: "page_size", Value: attribute.Int64Value(int64(in.PageSize))}, + attribute.KeyValue{Key: "page_token", Value: attribute.StringValue(in.PageToken)}, + ) + hasSelf := s.hasSelfManagementPermissions(ctx) hasManagement := s.hasAccountManagementPermissions(ctx) if !hasSelf && !hasManagement { @@ -269,6 +278,13 @@ func (s Service) findAccountsByQuery(ctx context.Context, query string) ([]strin // GetAccount implements the AccountsServiceHandler interface func (s Service) GetAccount(ctx context.Context, in *proto.GetAccountRequest, out *proto.Account) (err error) { + ctx, span := accTracing.TraceProvider.Tracer("accounts").Start(ctx, "Accounts.GetAccount") + defer span.End() + + span.SetAttributes( + attribute.KeyValue{Key: "account_id", Value: attribute.StringValue(in.Id)}, + ) + hasSelf := s.hasSelfManagementPermissions(ctx) hasManagement := s.hasAccountManagementPermissions(ctx) if !hasSelf && !hasManagement { @@ -317,6 +333,13 @@ func (s Service) GetAccount(ctx context.Context, in *proto.GetAccountRequest, ou // CreateAccount implements the AccountsServiceHandler interface func (s Service) CreateAccount(ctx context.Context, in *proto.CreateAccountRequest, out *proto.Account) (err error) { + ctx, span := accTracing.TraceProvider.Tracer("accounts").Start(ctx, "Accounts.CreateAccount") + defer span.End() + + span.SetAttributes( + attribute.KeyValue{Key: "account", Value: attribute.StringValue(in.Account.String())}, + ) + if !s.hasAccountManagementPermissions(ctx) { return merrors.Forbidden(s.id, "no permission for CreateAccount") } @@ -449,6 +472,13 @@ func (s Service) rollbackCreateAccount(ctx context.Context, acc *proto.Account) // read only fields are ignored // TODO how can we unset specific values? using the update mask func (s Service) UpdateAccount(ctx context.Context, in *proto.UpdateAccountRequest, out *proto.Account) (err error) { + ctx, span := accTracing.TraceProvider.Tracer("accounts").Start(ctx, "Accounts.UpdateAccount") + defer span.End() + + span.SetAttributes( + attribute.KeyValue{Key: "account", Value: attribute.StringValue(in.Account.String())}, + ) + hasSelf := s.hasSelfManagementPermissions(ctx) hasManagement := s.hasAccountManagementPermissions(ctx) if !hasSelf && !hasManagement { @@ -615,6 +645,9 @@ var updatableAccountPaths = map[string]struct{}{ // DeleteAccount implements the AccountsServiceHandler interface func (s Service) DeleteAccount(ctx context.Context, in *proto.DeleteAccountRequest, out *empty.Empty) (err error) { + ctx, span := accTracing.TraceProvider.Tracer("accounts").Start(ctx, "Accounts.DeleteAccount") + defer span.End() + if !s.hasAccountManagementPermissions(ctx) { return merrors.Forbidden(s.id, "no permission for DeleteAccount") } diff --git a/accounts/pkg/tracing/tracing.go b/accounts/pkg/tracing/tracing.go index d16ded696..5004b54fb 100644 --- a/accounts/pkg/tracing/tracing.go +++ b/accounts/pkg/tracing/tracing.go @@ -1,87 +1,58 @@ 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" + "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" +) + +var ( + // Propagator ensures the entire module uses the same trace propagation strategy. + Propagator propagation.TextMapPropagator + + // TraceProvider is the global trace provider for the proxy service. + TraceProvider *sdktrace.TracerProvider ) 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 + { + exp, err := jaeger.New( + jaeger.WithCollectorEndpoint( + jaeger.WithEndpoint(cfg.Tracing.Collector), + ), + ) + if err != nil { + panic(err) + } + + // set package level trace provider and propagator. + TraceProvider = sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exp), + sdktrace.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String("accounts")), + ), + ) + + Propagator = propagation.NewCompositeTextMapPropagator( + propagation.Baggage{}, + propagation.TraceContext{}, + ) } - trace.RegisterExporter(exporter) + case "agent": + fallthrough 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) + fallthrough default: - logger.Warn(). - Str("type", t). - Msg("Unknown tracing backend") + logger.Warn().Str("type", t).Msg("Unknown tracing backend") } - trace.ApplyConfig( - trace.Config{ - DefaultSampler: trace.AlwaysSample(), - }, - ) } else { logger.Debug(). Msg("Tracing is not enabled") diff --git a/ocs/pkg/middleware/logtrace.go b/ocs/pkg/middleware/logtrace.go index bea2d339d..d35bd2930 100644 --- a/ocs/pkg/middleware/logtrace.go +++ b/ocs/pkg/middleware/logtrace.go @@ -12,7 +12,7 @@ var propagator = propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, ) -// LogTrace unpacks the request context looking for an existing trace id. +// LogTrace Sets the initial trace in the ocs service. func LogTrace(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx, span := ocstracing.TraceProvider.Tracer("ocs").Start(r.Context(), r.URL.Path)