diff --git a/ocis-pkg/middleware/tracing.go b/ocis-pkg/middleware/tracing.go index 91b7c73f7a3..68f2c3af3d5 100644 --- a/ocis-pkg/middleware/tracing.go +++ b/ocis-pkg/middleware/tracing.go @@ -4,14 +4,19 @@ import ( "net/http" "github.com/owncloud/ocis/v2/ocis-pkg/tracing" + "go-micro.dev/v4/metadata" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" ) // GetOtelhttpMiddleware gets a new tracing middleware based on otelhttp // to trace the requests. +// This middleware will use the otelhttp middleware and then store the +// incoming data into the go-micro's metadata so it can be propagated through +// go-micro. func GetOtelhttpMiddleware(service string, tp trace.TracerProvider) func(http.Handler) http.Handler { - return otelhttp.NewMiddleware( + otelMid := otelhttp.NewMiddleware( service, otelhttp.WithTracerProvider(tp), otelhttp.WithPropagators(tracing.GetPropagator()), @@ -20,6 +25,35 @@ func GetOtelhttpMiddleware(service string, tp trace.TracerProvider) func(http.Ha return r.Method + " " + r.URL.Path }), ) + + httpToMicroMid := otelhttpToGoMicroGrpc() + + return func(next http.Handler) http.Handler { + return otelMid(httpToMicroMid(next)) + } +} + +func otelhttpToGoMicroGrpc() func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + propagator := tracing.GetPropagator() + + // based on go-micro plugin for opentelemetry + // inject telemetry data into go-micro's metadata + // in order to propagate the info to go-micro's calls + md := make(metadata.Metadata) + carrier := make(propagation.MapCarrier) + propagator.Inject(ctx, carrier) + for k, v := range carrier { + md.Set(k, v) + } + mdCtx := metadata.NewContext(ctx, md) + r = r.WithContext(mdCtx) + + next.ServeHTTP(w, r) + }) + } } // GetOtelhttpClient will get a new HTTP client that will use telemetry and diff --git a/services/webdav/pkg/service/v0/service.go b/services/webdav/pkg/service/v0/service.go index dc8a9b224e9..27949babaff 100644 --- a/services/webdav/pkg/service/v0/service.go +++ b/services/webdav/pkg/service/v0/service.go @@ -86,6 +86,7 @@ func NewService(opts ...Option) (Service, error) { // register method with chi before any routing is set up chi.RegisterMethod("REPORT") + m.Use(options.Middleware...) m.Route(options.Config.HTTP.Root, func(r chi.Router) { if !svc.config.DisablePreviews {