From 69c0dff403debaab1dd6c302d9ea022835b6e47c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 2 Dec 2022 22:36:28 +0000 Subject: [PATCH] introduce options to reva tracer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- cmd/revad/runtime/runtime.go | 19 ++- .../storageprovider/storageprovider.go | 3 +- internal/http/services/owncloud/ocdav/copy.go | 4 +- .../http/services/owncloud/ocdav/delete.go | 7 +- internal/http/services/owncloud/ocdav/get.go | 4 +- internal/http/services/owncloud/ocdav/head.go | 4 +- .../http/services/owncloud/ocdav/locks.go | 6 +- .../http/services/owncloud/ocdav/mkcol.go | 4 +- internal/http/services/owncloud/ocdav/move.go | 4 +- .../http/services/owncloud/ocdav/ocdav.go | 6 +- .../owncloud/ocdav/ocdav_blackbox_test.go | 3 +- .../http/services/owncloud/ocdav/proppatch.go | 4 +- .../services/owncloud/ocdav/publicfile.go | 2 +- internal/http/services/owncloud/ocdav/put.go | 4 +- .../http/services/owncloud/ocdav/trashbin.go | 6 +- internal/http/services/owncloud/ocdav/tus.go | 4 +- .../http/services/owncloud/ocdav/versions.go | 4 +- pkg/micro/ocdav/option.go | 18 ++- pkg/micro/ocdav/service.go | 17 ++- pkg/rgrpc/todo/pool/pool.go | 18 ++- pkg/trace/trace.go | 124 +++++++++--------- 21 files changed, 153 insertions(+), 112 deletions(-) diff --git a/cmd/revad/runtime/runtime.go b/cmd/revad/runtime/runtime.go index 75ed887764f..d161a23b4ba 100644 --- a/cmd/revad/runtime/runtime.go +++ b/cmd/revad/runtime/runtime.go @@ -76,6 +76,7 @@ func RunWithOptions(mainConf map[string]interface{}, pidFile string, opts ...Opt type coreConf struct { MaxCPUs string `mapstructure:"max_cpus"` TracingEnabled bool `mapstructure:"tracing_enabled"` + TracingInsecure bool `mapstructure:"tracing_insecure"` TracingExporter string `mapstructure:"tracing_exporter"` TracingEndpoint string `mapstructure:"tracing_endpoint"` TracingCollector string `mapstructure:"tracing_collector"` @@ -150,9 +151,23 @@ func initServers(mainConf map[string]interface{}, log *zerolog.Logger, tp trace. func initTracing(conf *coreConf) trace.TracerProvider { if conf.TracingEnabled { - rtrace.InitDefaultTracerProvider(conf.TracingExporter, conf.TracingCollector, conf.TracingEndpoint) + opts := []rtrace.Option{ + rtrace.WithExporter(conf.TracingExporter), + rtrace.WithEndpoint(conf.TracingEndpoint), + rtrace.WithCollector(conf.TracingCollector), + rtrace.WithServiceName(conf.TracingServiceName), + } + if conf.TracingEnabled { + opts = append(opts, rtrace.WithEnabled()) + } + if conf.TracingInsecure { + opts = append(opts, rtrace.WithInsecure()) + } + tp := rtrace.NewTracerProvider(opts...) + rtrace.SetDefaultTracerProvider(tp) + return tp } - return rtrace.GetTracerProvider(conf.TracingEnabled, conf.TracingExporter, conf.TracingCollector, conf.TracingEndpoint, conf.TracingServiceName) + return rtrace.DefaultProvider() } func initCPUCount(conf *coreConf, log *zerolog.Logger) { diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index 5446cc264f5..f4100affe5a 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -42,7 +42,6 @@ import ( "github.com/cs3org/reva/v2/pkg/storage" "github.com/cs3org/reva/v2/pkg/storage/fs/registry" "github.com/cs3org/reva/v2/pkg/storagespace" - rtrace "github.com/cs3org/reva/v2/pkg/trace" "github.com/cs3org/reva/v2/pkg/utils" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" @@ -680,7 +679,7 @@ func (s *service) Move(ctx context.Context, req *provider.MoveRequest) (*provide } func (s *service) Stat(ctx context.Context, req *provider.StatRequest) (*provider.StatResponse, error) { - ctx, span := rtrace.DefaultProvider().Tracer(tracerName).Start(ctx, "stat") + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "stat") defer span.End() span.SetAttributes(attribute.KeyValue{ diff --git a/internal/http/services/owncloud/ocdav/copy.go b/internal/http/services/owncloud/ocdav/copy.go index ee4ff8f9466..f0316e4dd56 100644 --- a/internal/http/services/owncloud/ocdav/copy.go +++ b/internal/http/services/owncloud/ocdav/copy.go @@ -51,7 +51,7 @@ type copy struct { } func (s *svc) handlePathCopy(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "copy") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "copy") defer span.End() if r.Body != http.NoBody { @@ -302,7 +302,7 @@ func (s *svc) executePathCopy(ctx context.Context, client gateway.GatewayAPIClie } func (s *svc) handleSpacesCopy(w http.ResponseWriter, r *http.Request, spaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_copy") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_copy") defer span.End() if r.Body != http.NoBody { diff --git a/internal/http/services/owncloud/ocdav/delete.go b/internal/http/services/owncloud/ocdav/delete.go index efc4e7f6d71..c091000376a 100644 --- a/internal/http/services/owncloud/ocdav/delete.go +++ b/internal/http/services/owncloud/ocdav/delete.go @@ -28,6 +28,7 @@ import ( provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/net" "github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/spacelookup" + "github.com/cs3org/reva/v2/pkg/appctx" "github.com/cs3org/reva/v2/pkg/errtypes" rstatus "github.com/cs3org/reva/v2/pkg/rgrpc/status" "github.com/cs3org/reva/v2/pkg/utils" @@ -35,7 +36,7 @@ import ( func (s *svc) handlePathDelete(w http.ResponseWriter, r *http.Request, ns string) (status int, err error) { ctx := r.Context() - ctx, span := s.tracerProvider.Tracer(tracerName).Start(ctx, "path_delete") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(ctx, "path_delete") defer span.End() if r.Body != http.NoBody { @@ -57,7 +58,7 @@ func (s *svc) handlePathDelete(w http.ResponseWriter, r *http.Request, ns string } func (s *svc) handleDelete(ctx context.Context, w http.ResponseWriter, r *http.Request, ref *provider.Reference) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(ctx, "delete") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(ctx, "delete") defer span.End() req := &provider.DeleteRequest{Ref: ref} @@ -114,7 +115,7 @@ func (s *svc) handleDelete(ctx context.Context, w http.ResponseWriter, r *http.R func (s *svc) handleSpacesDelete(w http.ResponseWriter, r *http.Request, spaceID string) (status int, err error) { ctx := r.Context() - ctx, span := s.tracerProvider.Tracer(tracerName).Start(ctx, "spaces_delete") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(ctx, "spaces_delete") defer span.End() if r.Body != http.NoBody { diff --git a/internal/http/services/owncloud/ocdav/get.go b/internal/http/services/owncloud/ocdav/get.go index eb523b36f33..d1be97b8780 100644 --- a/internal/http/services/owncloud/ocdav/get.go +++ b/internal/http/services/owncloud/ocdav/get.go @@ -37,7 +37,7 @@ import ( ) func (s *svc) handlePathGet(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "get") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "get") defer span.End() fn := path.Join(ns, r.URL.Path) @@ -153,7 +153,7 @@ func copyHeader(dst, src http.Header) { } func (s *svc) handleSpacesGet(w http.ResponseWriter, r *http.Request, spaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_get") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_get") defer span.End() sublog := appctx.GetLogger(ctx).With().Str("path", r.URL.Path).Str("spaceid", spaceID).Str("handler", "get").Logger() diff --git a/internal/http/services/owncloud/ocdav/head.go b/internal/http/services/owncloud/ocdav/head.go index 9021b388573..0e90f3b7da8 100644 --- a/internal/http/services/owncloud/ocdav/head.go +++ b/internal/http/services/owncloud/ocdav/head.go @@ -41,7 +41,7 @@ import ( ) func (s *svc) handlePathHead(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "head") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "head") defer span.End() fn := path.Join(ns, r.URL.Path) @@ -96,7 +96,7 @@ func (s *svc) handleHead(ctx context.Context, w http.ResponseWriter, r *http.Req } func (s *svc) handleSpacesHead(w http.ResponseWriter, r *http.Request, spaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_head") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_head") defer span.End() sublog := appctx.GetLogger(ctx).With().Str("spaceid", spaceID).Str("path", r.URL.Path).Logger() diff --git a/internal/http/services/owncloud/ocdav/locks.go b/internal/http/services/owncloud/ocdav/locks.go index 02ddafe9f2b..d822b10556d 100644 --- a/internal/http/services/owncloud/ocdav/locks.go +++ b/internal/http/services/owncloud/ocdav/locks.go @@ -380,7 +380,7 @@ The LockManager also defaults to exclusive locks: } */ func (s *svc) handleLock(w http.ResponseWriter, r *http.Request, ns string) (retStatus int, retErr error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) defer span.End() span.SetAttributes(attribute.String("component", "ocdav")) @@ -400,7 +400,7 @@ func (s *svc) handleLock(w http.ResponseWriter, r *http.Request, ns string) (ret } func (s *svc) handleSpacesLock(w http.ResponseWriter, r *http.Request, spaceID string) (retStatus int, retErr error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) defer span.End() span.SetAttributes(attribute.String("component", "ocdav")) @@ -558,7 +558,7 @@ func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { } func (s *svc) handleUnlock(w http.ResponseWriter, r *http.Request, ns string) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), fmt.Sprintf("%s %v", r.Method, r.URL.Path)) defer span.End() span.SetAttributes(attribute.String("component", "ocdav")) diff --git a/internal/http/services/owncloud/ocdav/mkcol.go b/internal/http/services/owncloud/ocdav/mkcol.go index e99bc61733b..cdd00c15d7d 100644 --- a/internal/http/services/owncloud/ocdav/mkcol.go +++ b/internal/http/services/owncloud/ocdav/mkcol.go @@ -36,7 +36,7 @@ import ( ) func (s *svc) handlePathMkcol(w http.ResponseWriter, r *http.Request, ns string) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "mkcol") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "mkcol") defer span.End() fn := path.Join(ns, r.URL.Path) @@ -89,7 +89,7 @@ func (s *svc) handlePathMkcol(w http.ResponseWriter, r *http.Request, ns string) } func (s *svc) handleSpacesMkCol(w http.ResponseWriter, r *http.Request, spaceID string) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_mkcol") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_mkcol") defer span.End() sublog := appctx.GetLogger(ctx).With().Str("path", r.URL.Path).Str("spaceid", spaceID).Str("handler", "mkcol").Logger() diff --git a/internal/http/services/owncloud/ocdav/move.go b/internal/http/services/owncloud/ocdav/move.go index 172490fc9ad..6e0f4615ef9 100644 --- a/internal/http/services/owncloud/ocdav/move.go +++ b/internal/http/services/owncloud/ocdav/move.go @@ -39,7 +39,7 @@ import ( ) func (s *svc) handlePathMove(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "move") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "move") defer span.End() if r.Body != http.NoBody { @@ -104,7 +104,7 @@ func (s *svc) handlePathMove(w http.ResponseWriter, r *http.Request, ns string) } func (s *svc) handleSpacesMove(w http.ResponseWriter, r *http.Request, srcSpaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_move") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_move") defer span.End() if r.Body != http.NoBody { diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index bebc18070a0..9423ab1b844 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -41,7 +41,6 @@ import ( "github.com/cs3org/reva/v2/pkg/storage/favorite" "github.com/cs3org/reva/v2/pkg/storage/favorite/registry" "github.com/cs3org/reva/v2/pkg/storage/utils/templates" - rtrace "github.com/cs3org/reva/v2/pkg/trace" "github.com/cs3org/reva/v2/pkg/utils" "github.com/jellydator/ttlcache/v2" "github.com/mitchellh/mapstructure" @@ -199,11 +198,11 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) return nil, err } - return NewWith(conf, fm, ls, log, rtrace.DefaultProvider(), nil) + return NewWith(conf, fm, ls, log, nil) } // NewWith returns a new ocdav service -func NewWith(conf *Config, fm favorite.Manager, ls LockSystem, _ *zerolog.Logger, tp trace.TracerProvider, gwc gateway.GatewayAPIClient) (global.Service, error) { +func NewWith(conf *Config, fm favorite.Manager, ls LockSystem, _ *zerolog.Logger, gwc gateway.GatewayAPIClient) (global.Service, error) { s := &svc{ c: conf, webDavHandler: new(WebDavHandler), @@ -216,7 +215,6 @@ func NewWith(conf *Config, fm favorite.Manager, ls LockSystem, _ *zerolog.Logger favoritesManager: fm, LockSystem: ls, userIdentifierCache: ttlcache.NewCache(), - tracerProvider: tp, } _ = s.userIdentifierCache.SetTTL(60 * time.Second) diff --git a/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go b/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go index ada3d2dd52e..36afb330825 100644 --- a/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go +++ b/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go @@ -40,7 +40,6 @@ import ( "github.com/cs3org/reva/v2/pkg/utils" "github.com/cs3org/reva/v2/tests/cs3mocks/mocks" "github.com/stretchr/testify/mock" - "go.opentelemetry.io/otel/trace" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -139,7 +138,7 @@ var _ = Describe("ocdav", func() { handler, err = ocdav.NewWith(&ocdav.Config{ FilesNamespace: "/users/{{.Username}}", WebdavNamespace: "/users/{{.Username}}", - }, nil, ocdav.NewCS3LS(client), nil, trace.NewNoopTracerProvider(), client) + }, nil, ocdav.NewCS3LS(client), nil, client) Expect(err).ToNot(HaveOccurred()) userspace = &cs3storageprovider.StorageSpace{ diff --git a/internal/http/services/owncloud/ocdav/proppatch.go b/internal/http/services/owncloud/ocdav/proppatch.go index bfc5e16cd13..9358e6b8cdc 100644 --- a/internal/http/services/owncloud/ocdav/proppatch.go +++ b/internal/http/services/owncloud/ocdav/proppatch.go @@ -43,7 +43,7 @@ import ( ) func (s *svc) handlePathProppatch(w http.ResponseWriter, r *http.Request, ns string) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "proppatch") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "proppatch") defer span.End() fn := path.Join(ns, r.URL.Path) @@ -93,7 +93,7 @@ func (s *svc) handlePathProppatch(w http.ResponseWriter, r *http.Request, ns str } func (s *svc) handleSpacesProppatch(w http.ResponseWriter, r *http.Request, spaceID string) (status int, err error) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_proppatch") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_proppatch") defer span.End() sublog := appctx.GetLogger(ctx).With().Str("path", r.URL.Path).Str("spaceid", spaceID).Logger() diff --git a/internal/http/services/owncloud/ocdav/publicfile.go b/internal/http/services/owncloud/ocdav/publicfile.go index 44e28a27793..7b918268cdf 100644 --- a/internal/http/services/owncloud/ocdav/publicfile.go +++ b/internal/http/services/owncloud/ocdav/publicfile.go @@ -89,7 +89,7 @@ func (h *PublicFileHandler) Handler(s *svc) http.Handler { // ns is the namespace that is prefixed to the path in the cs3 namespace func (s *svc) handlePropfindOnToken(w http.ResponseWriter, r *http.Request, ns string, onContainer bool) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "token_propfind") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "token_propfind") defer span.End() tokenStatInfo := ctx.Value(tokenStatInfoKey{}).(*provider.ResourceInfo) diff --git a/internal/http/services/owncloud/ocdav/put.go b/internal/http/services/owncloud/ocdav/put.go index 4a94ad0a16f..a3643eccda3 100644 --- a/internal/http/services/owncloud/ocdav/put.go +++ b/internal/http/services/owncloud/ocdav/put.go @@ -105,7 +105,7 @@ func isContentRange(r *http.Request) bool { } func (s *svc) handlePathPut(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "put") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "put") defer span.End() fn := path.Join(ns, r.URL.Path) @@ -305,7 +305,7 @@ func (s *svc) handlePut(ctx context.Context, w http.ResponseWriter, r *http.Requ } func (s *svc) handleSpacesPut(w http.ResponseWriter, r *http.Request, spaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces_put") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces_put") defer span.End() sublog := appctx.GetLogger(ctx).With().Str("spaceid", spaceID).Str("path", r.URL.Path).Logger() diff --git a/internal/http/services/owncloud/ocdav/trashbin.go b/internal/http/services/owncloud/ocdav/trashbin.go index 763a229f7c5..3944546a036 100644 --- a/internal/http/services/owncloud/ocdav/trashbin.go +++ b/internal/http/services/owncloud/ocdav/trashbin.go @@ -177,7 +177,7 @@ func (h *TrashbinHandler) Handler(s *svc) http.Handler { } func (h *TrashbinHandler) listTrashbin(w http.ResponseWriter, r *http.Request, s *svc, ref *provider.Reference, refBase, key, itemPath string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "list_trashbin") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "list_trashbin") defer span.End() sublog := appctx.GetLogger(ctx).With().Logger() @@ -452,7 +452,7 @@ func (h *TrashbinHandler) itemToPropResponse(ctx context.Context, s *svc, spaceI } func (h *TrashbinHandler) restore(w http.ResponseWriter, r *http.Request, s *svc, ref, dst *provider.Reference, key, itemPath string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "restore") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "restore") defer span.End() sublog := appctx.GetLogger(ctx).With().Logger() @@ -573,7 +573,7 @@ func (h *TrashbinHandler) restore(w http.ResponseWriter, r *http.Request, s *svc // delete has only a key func (h *TrashbinHandler) delete(w http.ResponseWriter, r *http.Request, s *svc, ref *provider.Reference, key, itemPath string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "erase") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "erase") defer span.End() sublog := appctx.GetLogger(ctx).With().Interface("reference", ref).Str("key", key).Str("item_path", itemPath).Logger() diff --git a/internal/http/services/owncloud/ocdav/tus.go b/internal/http/services/owncloud/ocdav/tus.go index b792f034c89..374b8aca567 100644 --- a/internal/http/services/owncloud/ocdav/tus.go +++ b/internal/http/services/owncloud/ocdav/tus.go @@ -44,7 +44,7 @@ import ( ) func (s *svc) handlePathTusPost(w http.ResponseWriter, r *http.Request, ns string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "tus-post") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "tus-post") defer span.End() // read filename from metadata @@ -70,7 +70,7 @@ func (s *svc) handlePathTusPost(w http.ResponseWriter, r *http.Request, ns strin } func (s *svc) handleSpacesTusPost(w http.ResponseWriter, r *http.Request, spaceID string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "spaces-tus-post") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "spaces-tus-post") defer span.End() // read filename from metadata diff --git a/internal/http/services/owncloud/ocdav/versions.go b/internal/http/services/owncloud/ocdav/versions.go index fa47d2f8da8..eb6cae41e78 100644 --- a/internal/http/services/owncloud/ocdav/versions.go +++ b/internal/http/services/owncloud/ocdav/versions.go @@ -110,7 +110,7 @@ func (h *VersionsHandler) Handler(s *svc, rid *provider.ResourceId) http.Handler } func (h *VersionsHandler) doListVersions(w http.ResponseWriter, r *http.Request, s *svc, rid *provider.ResourceId) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "listVersions") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "listVersions") defer span.End() sublog := appctx.GetLogger(ctx).With().Interface("resourceid", rid).Logger() @@ -209,7 +209,7 @@ func (h *VersionsHandler) doListVersions(w http.ResponseWriter, r *http.Request, } func (h *VersionsHandler) doRestore(w http.ResponseWriter, r *http.Request, s *svc, rid *provider.ResourceId, key string) { - ctx, span := s.tracerProvider.Tracer(tracerName).Start(r.Context(), "restore") + ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "restore") defer span.End() sublog := appctx.GetLogger(ctx).With().Interface("resourceid", rid).Str("key", key).Logger() diff --git a/pkg/micro/ocdav/option.go b/pkg/micro/ocdav/option.go index 8c879917a79..0ccd280ff00 100644 --- a/pkg/micro/ocdav/option.go +++ b/pkg/micro/ocdav/option.go @@ -48,6 +48,7 @@ type Options struct { GatewayClient gateway.GatewayAPIClient TracingEnabled bool + TracingInsecure bool TracingExporter string TracingCollector string TracingEndpoint string @@ -206,15 +207,28 @@ func LockSystem(val ocdav.LockSystem) Option { } // Tracing enables tracing -func Tracing(exporter, endpoint, collector string) Option { +func Tracing(endpoint, collector string) Option { return func(o *Options) { o.TracingEnabled = true - o.TracingExporter = exporter o.TracingEndpoint = endpoint o.TracingCollector = collector } } +// WithTracingInsecure option +func WithTracingInsecure() Option { + return func(o *Options) { + o.TracingInsecure = true + } +} + +// WithTracingExporter option +func WithTracingExporter(exporter string) Option { + return func(o *Options) { + o.TracingExporter = exporter + } +} + // Version provides a function to set the Version config option. func Version(val string) Option { return func(o *Options) { diff --git a/pkg/micro/ocdav/service.go b/pkg/micro/ocdav/service.go index 8f19d611841..9c316e85e28 100644 --- a/pkg/micro/ocdav/service.go +++ b/pkg/micro/ocdav/service.go @@ -67,8 +67,7 @@ func Service(opts ...Option) (micro.Service, error) { server.Version(sopts.config.VersionString), ) - tp := rtrace.GetTracerProvider(sopts.TracingEnabled, sopts.TracingExporter, sopts.TracingCollector, sopts.TracingEndpoint, sopts.Name) - revaService, err := ocdav.NewWith(&sopts.config, sopts.FavoriteManager, sopts.lockSystem, &sopts.Logger, tp, sopts.GatewayClient) + revaService, err := ocdav.NewWith(&sopts.config, sopts.FavoriteManager, sopts.lockSystem, &sopts.Logger, sopts.GatewayClient) if err != nil { return nil, err } @@ -85,7 +84,19 @@ func Service(opts ...Option) (micro.Service, error) { // chi.RegisterMethod(ocdav.MethodMkcol) // chi.RegisterMethod(ocdav.MethodReport) r := chi.NewRouter() - + topts := []rtrace.Option{ + rtrace.WithExporter(sopts.TracingExporter), + rtrace.WithEndpoint(sopts.TracingEndpoint), + rtrace.WithCollector(sopts.TracingCollector), + rtrace.WithServiceName(sopts.Name), + } + if sopts.TracingEnabled { + topts = append(topts, rtrace.WithEnabled()) + } + if sopts.TracingInsecure { + topts = append(topts, rtrace.WithInsecure()) + } + tp := rtrace.NewTracerProvider(topts...) if err := useMiddlewares(r, &sopts, revaService, tp); err != nil { return nil, err } diff --git a/pkg/rgrpc/todo/pool/pool.go b/pkg/rgrpc/todo/pool/pool.go index d065953b050..cd506bf9d66 100644 --- a/pkg/rgrpc/todo/pool/pool.go +++ b/pkg/rgrpc/todo/pool/pool.go @@ -45,6 +45,7 @@ import ( "github.com/cs3org/reva/v2/pkg/sharedconf" rtrace "github.com/cs3org/reva/v2/pkg/trace" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" + "go.opentelemetry.io/otel/trace" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -77,8 +78,9 @@ const ( // ClientOptions represent additional options (e.g. tls settings) for the grpc clients type ClientOptions struct { - tlsMode TLSMode - caCert string + tlsMode TLSMode + caCert string + tracerProvider trace.TracerProvider } // Option is used to pass client options @@ -132,6 +134,7 @@ func (o *ClientOptions) init() error { return err } o.caCert = sharedOpt.CACertFile + o.tracerProvider = rtrace.DefaultProvider() return nil } @@ -149,6 +152,13 @@ func WithTLSCACert(v string) Option { } } +// WithTracerProvider allows to set the opentelemetry tracer provider for grpc clients +func WithTracerProvider(v trace.TracerProvider) Option { + return func(o *ClientOptions) { + o.tracerProvider = v + } +} + // NewConn creates a new connection to a grpc server // with open census tracing support. // TODO(labkode): make grpc tls configurable. @@ -194,7 +204,7 @@ func NewConn(endpoint string, opts ...Option) (*grpc.ClientConn, error) { ), grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor( otelgrpc.WithTracerProvider( - rtrace.DefaultProvider(), + options.tracerProvider, ), otelgrpc.WithPropagators( rtrace.Propagator, @@ -203,7 +213,7 @@ func NewConn(endpoint string, opts ...Option) (*grpc.ClientConn, error) { grpc.WithUnaryInterceptor( otelgrpc.UnaryClientInterceptor( otelgrpc.WithTracerProvider( - rtrace.DefaultProvider(), + options.tracerProvider, ), otelgrpc.WithPropagators( rtrace.Propagator, diff --git a/pkg/trace/trace.go b/pkg/trace/trace.go index 3a7ca2dee04..d78fdcc10af 100644 --- a/pkg/trace/trace.go +++ b/pkg/trace/trace.go @@ -34,6 +34,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "google.golang.org/grpc/credentials" "go.opentelemetry.io/otel/trace" ) @@ -52,54 +53,62 @@ type revaDefaultTracerProvider struct { provider trace.TracerProvider } -type ctxKey struct{} +// NewTracerProvider returns a new TracerProvider, configure for the specified service +func NewTracerProvider(opts ...Option) trace.TracerProvider { + options := Options{} -// ContextSetTracerProvider returns a copy of ctx with p associated. -func ContextSetTracerProvider(ctx context.Context, p trace.TracerProvider) context.Context { - if tp, ok := ctx.Value(ctxKey{}).(trace.TracerProvider); ok { - if tp == p { - return ctx - } + for _, o := range opts { + o(&options) + } + + if options.TransportCredentials == nil { + options.TransportCredentials = credentials.NewClientTLSFromCert(nil, "") + } + + if !options.Enabled { + return trace.NewNoopTracerProvider() + } + + // default to 'reva' as service name if not set + if options.ServiceName == "" { + options.ServiceName = "reva" } - return context.WithValue(ctx, ctxKey{}, p) -} -// ContextGetTracerProvider returns the TracerProvider associated with the ctx. -// If no TracerProvider is associated is associated, the global default TracerProvider -// is returned -func ContextGetTracerProvider(ctx context.Context) trace.TracerProvider { - if p, ok := ctx.Value(ctxKey{}).(trace.TracerProvider); ok { - return p + switch options.Exporter { + case "otlp": + return getOtlpTracerProvider(options) + default: + return getJaegerTracerProvider(options) } - return DefaultProvider() } -// InitDefaultTracerProvider initializes a global default TracerProvider at a package level. -func InitDefaultTracerProvider(exporter, collector, endpoint string) { +// SetDefaultTracerProvider sets the default trace provider +func SetDefaultTracerProvider(tp trace.TracerProvider) { defaultProvider.mutex.Lock() defer defaultProvider.mutex.Unlock() - if !defaultProvider.initialized { - switch exporter { - case "otlp": - defaultProvider.provider = getOtlpTracerProvider(true, endpoint, "reva default otlp provider") - default: - defaultProvider.provider = getJaegerTracerProvider(true, collector, endpoint, "reva default jaeger provider") - } - } + defaultProvider.provider = tp defaultProvider.initialized = true } -// GetTracerProvider returns a new TracerProvider, configure for the specified service -func GetTracerProvider(enabled bool, exporter, collector, endpoint, serviceName string) trace.TracerProvider { - switch exporter { - case "otlp": - return getOtlpTracerProvider(enabled, endpoint, serviceName) - default: - return getJaegerTracerProvider(enabled, collector, endpoint, serviceName) +// InitDefaultTracerProvider initializes a global default jaeger TracerProvider at a package level. +// +// Deprecated: Use NewTracerProvider and SetDefaultTracerProvider to properly initialize a tracer provider with options +func InitDefaultTracerProvider(collector, endpoint string) { + defaultProvider.mutex.Lock() + defer defaultProvider.mutex.Unlock() + if !defaultProvider.initialized { + defaultProvider.provider = getJaegerTracerProvider(Options{ + Enabled: true, + Collector: collector, + Endpoint: endpoint, + ServiceName: "reva default jaeger provider", + }) } + defaultProvider.initialized = true } // DefaultProvider returns the "global" default TracerProvider +// Currently used by the pool to get the global tracer func DefaultProvider() trace.TracerProvider { defaultProvider.mutex.RLock() defer defaultProvider.mutex.RUnlock() @@ -107,24 +116,15 @@ func DefaultProvider() trace.TracerProvider { } // getJaegerTracerProvider returns a new TracerProvider, configure for the specified service -func getJaegerTracerProvider(enabled bool, collector, endpoint, serviceName string) trace.TracerProvider { - if !enabled { - return trace.NewNoopTracerProvider() - } - - // default to 'reva' as service name if not set - if serviceName == "" { - serviceName = "reva" - } - +func getJaegerTracerProvider(options Options) trace.TracerProvider { var exp *jaeger.Exporter var err error - if endpoint != "" { + if options.Endpoint != "" { var agentHost string var agentPort string - agentHost, agentPort, err = parseAgentConfig(endpoint) + agentHost, agentPort, err = parseAgentConfig(options.Endpoint) if err != nil { panic(err) } @@ -140,8 +140,8 @@ func getJaegerTracerProvider(enabled bool, collector, endpoint, serviceName stri } } - if collector != "" { - exp, err = jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(collector))) + if options.Collector != "" { + exp, err = jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(options.Collector))) if err != nil { panic(err) } @@ -156,7 +156,7 @@ func getJaegerTracerProvider(enabled bool, collector, endpoint, serviceName stri sdktrace.WithBatcher(exp), sdktrace.WithResource(resource.NewWithAttributes( semconv.SchemaURL, - semconv.ServiceNameKey.String(serviceName), + semconv.ServiceNameKey.String(options.ServiceName), semconv.HostNameKey.String(hostname), )), ) @@ -187,27 +187,21 @@ func parseAgentConfig(ae string) (string, string, error) { } // getOtelTracerProvider returns a new TracerProvider, configure for the specified service -func getOtlpTracerProvider(enabled bool, endpoint string, serviceName string) trace.TracerProvider { - if !enabled { - return trace.NewNoopTracerProvider() - } +func getOtlpTracerProvider(options Options) trace.TracerProvider { - // default to 'reva' as service name if not set - if serviceName == "" { - serviceName = "reva" + opts := []otlptracegrpc.Option{ + otlptracegrpc.WithEndpoint(options.Endpoint), + } + if options.TransportCredentials != nil { + opts = append(opts, otlptracegrpc.WithTLSCredentials(options.TransportCredentials)) + } + if options.Insecure { + opts = append(opts, otlptracegrpc.WithInsecure()) } - - //secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, "")) - //if len(insecure) > 0 { - secureOption := otlptracegrpc.WithInsecure() - //} exporter, err := otlptrace.New( context.Background(), - otlptracegrpc.NewClient( - secureOption, - otlptracegrpc.WithEndpoint(endpoint), - ), + otlptracegrpc.NewClient(opts...), ) if err != nil { @@ -216,7 +210,7 @@ func getOtlpTracerProvider(enabled bool, endpoint string, serviceName string) tr resources, err := resource.New( context.Background(), resource.WithAttributes( - attribute.String("service.name", serviceName), + attribute.String("service.name", options.ServiceName), attribute.String("library.language", "go"), ), )