From 9f50776b1791ff107cf854bf761a8e7d6da8bd91 Mon Sep 17 00:00:00 2001 From: "A.Unger" Date: Fri, 6 Aug 2021 13:29:40 +0200 Subject: [PATCH] enable traces in proxy --- go.mod | 8 +-- go.sum | 8 --- ocis-pkg/middleware/tracing.go | 26 +++----- proxy/pkg/proxy/proxy.go | 24 ++++---- proxy/pkg/tracing/tracing.go | 109 ++++++++++++--------------------- 5 files changed, 63 insertions(+), 112 deletions(-) diff --git a/go.mod b/go.mod index aed64ba01..93e617108 100644 --- a/go.mod +++ b/go.mod @@ -66,10 +66,10 @@ require ( github.com/yaegashi/msgraph.go v0.1.4 go.etcd.io/etcd/pkg/v3 v3.5.0-pre // indirect go.opencensus.io v0.23.0 - go.opentelemetry.io/otel v1.0.0-RC2 // indirect - go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC2 // indirect - go.opentelemetry.io/otel/metric v0.20.0 // indirect - go.opentelemetry.io/otel/sdk v1.0.0-RC2 // indirect + go.opentelemetry.io/otel v1.0.0-RC2 + go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC2 + go.opentelemetry.io/otel/sdk v1.0.0-RC2 + go.opentelemetry.io/otel/trace v1.0.0-RC2 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 golang.org/x/net v0.0.0-20210614182718-04defd469f4e diff --git a/go.sum b/go.sum index 1d2ff75c2..3a619422d 100644 --- a/go.sum +++ b/go.sum @@ -508,7 +508,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -1166,19 +1165,12 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.0.0-RC2 h1:SHhxSjB+omnGZPgGlKe+QMp3MyazcOHdQ8qwo89oKbg= go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM= go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC2 h1:RF0nWsIDpDBe+s06lkLxUw9CWQUAhO6hBSxxB7dz45s= go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC2/go.mod h1:sZZqN3Vb0iT+NE6mZ1S7sNyH3t4PFk6ElK5TLGFBZ7E= -go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v1.0.0-RC2 h1:ROuteeSCBaZNjiT9JcFzZepmInDvLktR28Y6qKo8bCs= go.opentelemetry.io/otel/sdk v1.0.0-RC2/go.mod h1:fgwHyiDn4e5k40TD9VX243rOxXR+jzsWBZYA2P5jpEw= -go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.0.0-RC2 h1:dunAP0qDULMIT82atj34m5RgvsIK6LcsXf1c/MsYg1w= go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= diff --git a/ocis-pkg/middleware/tracing.go b/ocis-pkg/middleware/tracing.go index 882b8aab4..30d12c959 100644 --- a/ocis-pkg/middleware/tracing.go +++ b/ocis-pkg/middleware/tracing.go @@ -1,31 +1,21 @@ package middleware import ( - "context" "net/http" - "go.opencensus.io/plugin/ochttp/propagation/tracecontext" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel/propagation" +) + +var propagator = propagation.NewCompositeTextMapPropagator( + propagation.Baggage{}, + propagation.TraceContext{}, ) // Trace unpacks the request context looking for an existing trace id. func Trace(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - var ctx context.Context - var span *trace.Span - - tc := tracecontext.HTTPFormat{} - // reconstruct span context from request - if sc, ok := tc.SpanContextFromRequest(r); ok { - // if there is one, add it to the new span - ctx, span = trace.StartSpanWithRemoteParent(r.Context(), r.URL.String(), sc) - defer span.End() - } else { - // create a new span if there is no context - ctx, span = trace.StartSpan(r.Context(), r.URL.String()) - defer span.End() - } - + ctx := propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) + propagator.Inject(ctx, propagation.HeaderCarrier(r.Header)) next.ServeHTTP(w, r.WithContext(ctx)) }) } diff --git a/proxy/pkg/proxy/proxy.go b/proxy/pkg/proxy/proxy.go index 9193252e1..2430b2b43 100644 --- a/proxy/pkg/proxy/proxy.go +++ b/proxy/pkg/proxy/proxy.go @@ -2,6 +2,7 @@ package proxy import ( "crypto/tls" + "fmt" "net" "net/http" "net/http/httputil" @@ -10,21 +11,19 @@ import ( "strings" "time" - "github.com/owncloud/ocis/proxy/pkg/proxy/policy" - "go.opencensus.io/plugin/ochttp/propagation/tracecontext" - "go.opencensus.io/trace" - "github.com/owncloud/ocis/ocis-pkg/log" "github.com/owncloud/ocis/proxy/pkg/config" + "github.com/owncloud/ocis/proxy/pkg/proxy/policy" + proxytracing "github.com/owncloud/ocis/proxy/pkg/tracing" + "go.opentelemetry.io/otel/trace" ) -// MultiHostReverseProxy extends httputil to support multiple hosts with diffent policies +// MultiHostReverseProxy extends "httputil" to support multiple hosts with different policies type MultiHostReverseProxy struct { httputil.ReverseProxy Directors map[string]map[config.RouteType]map[string]func(req *http.Request) PolicySelector policy.Selector logger log.Logger - propagator tracecontext.HTTPFormat config *config.Config } @@ -214,17 +213,16 @@ func (p *MultiHostReverseProxy) AddHost(policy string, target *url.URL, rt confi } func (p *MultiHostReverseProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - var span *trace.Span + var ( + ctx = r.Context() + span trace.Span + ) - // Start root span. if p.config.Tracing.Enabled { - ctx, span = trace.StartSpan(ctx, r.URL.String()) + tracer := proxytracing.TraceProvider.Tracer("proxy") + ctx, span = tracer.Start(ctx, fmt.Sprintf("%s %v", r.Method, r.URL.Path)) defer span.End() - p.propagator.SpanContextToRequest(span.SpanContext(), r) } - - // Call upstream ServeHTTP p.ReverseProxy.ServeHTTP(w, r.WithContext(ctx)) } diff --git a/proxy/pkg/tracing/tracing.go b/proxy/pkg/tracing/tracing.go index c39ce48e1..4d6a7e5b3 100644 --- a/proxy/pkg/tracing/tracing.go +++ b/proxy/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/ocis-pkg/log" "github.com/owncloud/ocis/proxy/pkg/config" - "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("proxy")), + ), + ) + + 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")