diff --git a/charts/README.md b/charts/README.md index 5e7d2adf..c70d90bb 100644 --- a/charts/README.md +++ b/charts/README.md @@ -79,6 +79,10 @@ Parameter | Description | Default `router.roundTrip.timeout` | HTTP transport request timeout | `50ms` `router.roundTrip.timeoutExponent` | The length of request timeout will multiply with timeoutExponent after each retry | `2` `router.roundTrip.maxRetries` | Max retries times of a failed request | `10` +`openTracing.enabled` | If true, OpenTracing is enabled | `false` +`openTracing.collectorEndpoint` | Jaeger collector endpoint | `` +`openTracing.samplingRate` | Probabilistic sampling rate | `0.5` +`otelCollectorEndpoint` | OpenTelemetry collector endpoint | None ### Extra configuration for `fission-all` diff --git a/charts/fission-all/templates/deployment.yaml b/charts/fission-all/templates/deployment.yaml index 27d3f82b..0e9c635a 100644 --- a/charts/fission-all/templates/deployment.yaml +++ b/charts/fission-all/templates/deployment.yaml @@ -334,10 +334,14 @@ spec: env: - name: FISSION_FUNCTION_NAMESPACE value: "{{ .Values.functionNamespace }}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: PPROF_ENABLED @@ -424,10 +428,14 @@ spec: value: {{ .Values.executor.podReadyTimeout | default false | quote }} - name: ENABLE_ISTIO value: "{{ .Values.enableIstio }}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: FETCHER_MINCPU value: {{ .Values.fetcher.resource.cpu.requests | quote }} - name: FETCHER_MINMEM @@ -504,10 +512,14 @@ spec: value: "{{ .Values.pullPolicy }}" - name: ENABLE_ISTIO value: "{{ .Values.enableIstio }}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: FETCHER_MINCPU value: {{ .Values.fetcher.resource.cpu.requests | quote }} - name: FETCHER_MINMEM @@ -550,10 +562,14 @@ spec: command: ["/fission-bundle"] args: ["--kubewatcher", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: PPROF_ENABLED @@ -694,6 +710,8 @@ spec: value: {{ .Values.debugEnv | quote }} - name: PPROF_ENABLED value: {{ .Values.pprof.enabled | quote }} + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} serviceAccountName: fission-svc {{- if .Values.extraCoreComponentPodConfig }} {{ toYaml .Values.extraCoreComponentPodConfig | indent 6 -}} @@ -827,10 +845,14 @@ spec: {{- else }} value: nats://{{ .Values.nats.hostaddress }} {{- end }} + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: PPROF_ENABLED @@ -880,10 +902,14 @@ spec: value: "{{.Values.kafka.brokers}}" - name: MESSAGE_QUEUE_KAFKA_VERSION value: "{{.Values.kafka.version}}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: PPROF_ENABLED @@ -972,10 +998,14 @@ spec: command: ["/fission-bundle"] args: ["--mqt", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: MESSAGE_QUEUE_TYPE value: azure-storage-queue - name: AZURE_STORAGE_ACCOUNT_NAME @@ -1026,10 +1056,14 @@ spec: args: ["--storageServicePort", "8000", "--storageType", "local"] {{- end }} env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: PRUNE_INTERVAL value: "{{.Values.pruneInterval}}" - name: DEBUG_ENV @@ -1119,10 +1153,14 @@ spec: command: ["/fission-bundle"] args: ["--mqt_keda", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: CONNECTOR_IMAGE_PULL_POLICY diff --git a/charts/fission-all/templates/fluentbit.yaml b/charts/fission-all/templates/fluentbit.yaml index e73191a1..ce917126 100644 --- a/charts/fission-all/templates/fluentbit.yaml +++ b/charts/fission-all/templates/fluentbit.yaml @@ -117,6 +117,8 @@ spec: fieldRef: apiVersion: v1 fieldPath: spec.nodeName + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} command: ["/fission-bundle"] args: ["--logger"] volumeMounts: @@ -158,6 +160,8 @@ spec: key: password - name: LOG_PATH value: /var/log/fission/*.log + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} {{- if .Values.logger.enableSecurityContext }} securityContext: privileged: true diff --git a/charts/fission-all/templates/router.yaml b/charts/fission-all/templates/router.yaml index b7fde4b2..60e852b4 100644 --- a/charts/fission-all/templates/router.yaml +++ b/charts/fission-all/templates/router.yaml @@ -55,8 +55,12 @@ spec: value: {{ .Values.router.svcAddressUpdateTimeout | default "30s" | quote }} - name: ROUTER_UNTAP_SERVICE_TIMEOUT value: {{ .Values.router.unTapServiceTimeout | default "3600s" | quote }} + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE value: {{ .Values.router.traceSamplingRate | default "0.5" | quote }} - name: USE_ENCODED_PATH diff --git a/charts/fission-all/values.yaml b/charts/fission-all/values.yaml index 5c07682e..850a56f7 100644 --- a/charts/fission-all/values.yaml +++ b/charts/fission-all/values.yaml @@ -340,9 +340,23 @@ prometheus: canaryDeployment: enabled: true -# Use these flags to enable opentracing, the variable is endpoint of Jaeger collector in the format shown below -#traceCollectorEndpoint: "http://jaeger-collector.jaeger.svc:14268/api/traces?format=jaeger.thrift" -#traceSamplingRate: 0.75 +# Use the following flags to enable OpenTracing. +# Note: OpenTracing support will be deprecated in an upcoming release. +# Please prefer using OpenTelemetry instead. +openTracing: + ## set this flag to true if you wish to enable OpenTracing + enabled: false + + ## if enabled is true, the variable is endpoint of Jaeger collector in the format shown below + #collectorEndpoint: "http://jaeger-collector.jaeger.svc:14268/api/traces?format=jaeger.thrift" + + ## uniformly sample traces with the given probabilistic sampling rate + #samplingRate: 0.75 + +# Use this flag to set the collector endpoint for OpenTelemetry. +# It is an alternate to OpenTracing. +# OpenTracing should be disabled (openTracing.enabled: false) if you are using OpenTelemetry. +# otelCollectorEndpoint: "otel-collector.observability.svc:4317" ## Message Queue Trigger Kind, KEDA: enable and configuration mqt_keda: diff --git a/charts/fission-core/templates/deployment.yaml b/charts/fission-core/templates/deployment.yaml index ef854b40..f2599c9a 100644 --- a/charts/fission-core/templates/deployment.yaml +++ b/charts/fission-core/templates/deployment.yaml @@ -140,10 +140,14 @@ spec: command: ["/fission-bundle"] args: ["--controllerPort", "8888"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: FISSION_FUNCTION_NAMESPACE value: "{{ .Values.functionNamespace }}" - name: POD_NAMESPACE @@ -215,10 +219,14 @@ spec: value: "{{ .Values.pullPolicy }}" - name: FETCHER_IMAGE_PULL_POLICY value: "{{ .Values.pullPolicy }}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: ADOPT_EXISTING_RESOURCES value: {{ .Values.executor.adoptExistingResources | default false | quote }} - name: POD_READY_TIMEOUT @@ -287,10 +295,14 @@ spec: value: "{{ .Values.pullPolicy }}" - name: BUILDER_IMAGE_PULL_POLICY value: "{{ .Values.pullPolicy }}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: ENABLE_ISTIO value: "{{ .Values.enableIstio }}" - name: FETCHER_MINCPU @@ -331,10 +343,14 @@ spec: command: ["/fission-bundle"] args: ["--kubewatcher", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} serviceAccountName: fission-svc {{- if .Values.extraCoreComponentPodConfig }} {{ toYaml .Values.extraCoreComponentPodConfig | indent 6 -}} @@ -365,10 +381,14 @@ spec: command: ["/fission-bundle"] args: ["--timer", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} serviceAccountName: fission-svc {{- if .Values.extraCoreComponentPodConfig }} {{ toYaml .Values.extraCoreComponentPodConfig | indent 6 -}} @@ -408,10 +428,14 @@ spec: env: - name: PRUNE_INTERVAL value: "{{.Values.pruneInterval}}" + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} {{- if and (.Values.persistence.enabled) (eq (.Values.persistence.storageType | default "local") "s3") }} - name: STORAGE_S3_ENDPOINT value: {{ .Values.persistence.s3.endPoint }} @@ -478,10 +502,14 @@ spec: command: ["/fission-bundle"] args: ["--mqt_keda", "--routerUrl", "http://router.{{ .Release.Namespace }}"] env: + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE - value: {{ .Values.traceSamplingRate | default "0.5" | quote }} + value: {{ .Values.openTracing.samplingRate | default "0.5" | quote }} - name: DEBUG_ENV value: {{ .Values.debugEnv | quote }} - name: CONNECTOR_IMAGE_PULL_POLICY diff --git a/charts/fission-core/templates/router.yaml b/charts/fission-core/templates/router.yaml index 7d11dcfa..431e7a13 100644 --- a/charts/fission-core/templates/router.yaml +++ b/charts/fission-core/templates/router.yaml @@ -55,8 +55,12 @@ spec: value: {{ .Values.router.svcAddressUpdateTimeout | default "30s" | quote }} - name: ROUTER_UNTAP_SERVICE_TIMEOUT value: {{ .Values.router.unTapServiceTimeout | default "3600s" | quote }} + - name: OTEL_COLLECTOR_ENDPOINT + value: "{{ .Values.otelCollectorEndpoint }}" + - name: OPENTRACING_ENABLED + value: {{ .Values.openTracing.enabled | default false | quote }} - name: TRACE_JAEGER_COLLECTOR_ENDPOINT - value: "{{ .Values.traceCollectorEndpoint }}" + value: "{{ .Values.openTracing.collectorEndpoint }}" - name: TRACING_SAMPLING_RATE value: {{ .Values.router.traceSamplingRate | default "0.5" | quote }} - name: USE_ENCODED_PATH diff --git a/charts/fission-core/values.yaml b/charts/fission-core/values.yaml index 41c84308..b2f1211d 100644 --- a/charts/fission-core/values.yaml +++ b/charts/fission-core/values.yaml @@ -229,9 +229,23 @@ prometheus: canaryDeployment: enabled: false -# Use these flags to enable opentracing, the variable is endpoint of Jaeger collector in the format shown below -#traceCollectorEndpoint: "http://jaeger-collector.jaeger.svc:14268/api/traces?format=jaeger.thrift" -#traceSamplingRate: 0.75 +# Use the following flags to enable OpenTracing. +# Note: OpenTracing support will be deprecated in an upcoming release. +# Please prefer using OpenTelemetry instead. +openTracing: + ## set this flag to true if you wish to enable OpenTracing + enabled: false + + ## if enabled is true, the variable is endpoint of Jaeger collector in the format shown below + #collectorEndpoint: "http://jaeger-collector.jaeger.svc:14268/api/traces?format=jaeger.thrift" + + ## uniformly sample traces with the given probabilistic sampling rate + #samplingRate: 0.75 + +# Use this flag to set the collector endpoint for OpenTelemetry. +# It is an alternate to OpenTracing. +# OpenTracing should be disabled (openTracing.enabled: false) if you are using OpenTelemetry. +# otelCollectorEndpoint: "otel-collector.observability.svc:4317" ## Message Queue Trigger Kind, KEDA: enable and configuration mqt_keda: diff --git a/cmd/fetcher/app/server.go b/cmd/fetcher/app/server.go index 96dc585a..77fb6885 100644 --- a/cmd/fetcher/app/server.go +++ b/cmd/fetcher/app/server.go @@ -24,43 +24,22 @@ import ( "log" "net/http" "os" + "strconv" "sync/atomic" - "contrib.go.opencensus.io/exporter/jaeger" "go.opencensus.io/plugin/ochttp" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel" "go.uber.org/zap" "github.com/fission/fission/pkg/fetcher" + otelUtils "github.com/fission/fission/pkg/utils/otel" + "github.com/fission/fission/pkg/utils/tracing" ) var ( readyToServe uint32 ) -func registerTraceExporter(collectorEndpoint string) error { - if collectorEndpoint == "" { - return nil - } - - serviceName := "Fission-Fetcher" - exporter, err := jaeger.NewExporter(jaeger.Options{ - CollectorEndpoint: collectorEndpoint, - Process: jaeger.Process{ - ServiceName: serviceName, - Tags: []jaeger.Tag{ - jaeger.BoolTag("fission", true), - }, - }, - }) - if err != nil { - return err - } - trace.RegisterExporter(exporter) - trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - return nil -} - func Run(logger *zap.Logger) { flag.Usage = fetcherUsage collectorEndpoint := flag.String("jaeger-collector-endpoint", "", "") @@ -85,11 +64,30 @@ func Run(logger *zap.Logger) { } } - go func() { - if err := registerTraceExporter(*collectorEndpoint); err != nil { - logger.Fatal("could not register trace exporter", zap.Error(err), zap.String("collector_endpoint", *collectorEndpoint)) + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + + if openTracingEnabled { + go func() { + if err := tracing.RegisterTraceExporter(logger, *collectorEndpoint, "Fission-Fetcher"); err != nil { + logger.Fatal("could not register trace exporter", zap.Error(err), zap.String("collector_endpoint", *collectorEndpoint)) + } + }() + } else { + shutdown, err := otelUtils.InitProvider(logger, "Fission-Fetcher") + if err != nil { + logger.Fatal("error initializing provider for OTLP", zap.Error(err)) } - }() + if shutdown != nil { + defer shutdown() + } + } + + tracer := otel.Tracer("fetcher") + ctx, span := tracer.Start(context.Background(), "fetcher/Run") + defer span.End() f, err := fetcher.MakeFetcher(logger, dir, *secretDir, *configDir) if err != nil { @@ -106,7 +104,6 @@ func Run(logger *zap.Logger) { logger.Fatal("error decoding specialize request", zap.Error(err)) } - ctx := context.Background() err = f.SpecializePod(ctx, specializeReq.FetchReq, specializeReq.LoadReq) if err != nil { logger.Fatal("error specializing function pod", zap.Error(err)) @@ -137,10 +134,14 @@ func Run(logger *zap.Logger) { }) logger.Info("fetcher ready to receive requests") - err = http.ListenAndServe(":8000", &ochttp.Handler{ - Handler: mux, - }) - if err != nil { + + var handler http.Handler + if openTracingEnabled { + handler = &ochttp.Handler{Handler: mux} + } else { + handler = otelUtils.GetHandlerWithOTEL(mux, "fission-fetcher", otelUtils.UrlsToIgnore("/healthz", "/readiness-healthz")) + } + if err = http.ListenAndServe(":8000", handler); err != nil { log.Fatal(err) } } diff --git a/cmd/fission-bundle/main.go b/cmd/fission-bundle/main.go index 62c60d26..23b8a772 100644 --- a/cmd/fission-bundle/main.go +++ b/cmd/fission-bundle/main.go @@ -23,9 +23,8 @@ import ( "os" "strconv" - "contrib.go.opencensus.io/exporter/jaeger" docopt "github.com/docopt/docopt-go" - "go.opencensus.io/trace" + "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -40,21 +39,23 @@ import ( "github.com/fission/fission/pkg/router" "github.com/fission/fission/pkg/storagesvc" "github.com/fission/fission/pkg/timer" + "github.com/fission/fission/pkg/utils/otel" "github.com/fission/fission/pkg/utils/profile" + "github.com/fission/fission/pkg/utils/tracing" ) -func runController(logger *zap.Logger, port int) { - controller.Start(logger, port, false) +func runController(logger *zap.Logger, port int, openTracingEnabled bool) { + controller.Start(logger, port, false, openTracingEnabled) logger.Fatal("controller exited") } -func runRouter(logger *zap.Logger, port int, executorUrl string) { - router.Start(logger, port, executorUrl) +func runRouter(logger *zap.Logger, port int, executorUrl string, openTracingEnabled bool) { + router.Start(logger, port, executorUrl, openTracingEnabled) logger.Fatal("router exited") } -func runExecutor(logger *zap.Logger, port int, functionNamespace, envBuilderNamespace string) { - err := executor.StartExecutor(logger, functionNamespace, envBuilderNamespace, port) +func runExecutor(logger *zap.Logger, port int, functionNamespace, envBuilderNamespace string, openTracingEnabled bool) { + err := executor.StartExecutor(logger, functionNamespace, envBuilderNamespace, port, openTracingEnabled) if err != nil { logger.Fatal("error starting executor", zap.Error(err)) } @@ -89,8 +90,8 @@ func runMQManager(logger *zap.Logger, routerURL string) { } } -func runStorageSvc(logger *zap.Logger, port int, storage storagesvc.Storage) { - err := storagesvc.Start(logger, storage, port) +func runStorageSvc(logger *zap.Logger, port int, storage storagesvc.Storage, openTracingEnabled bool) { + err := storagesvc.Start(logger, storage, port, openTracingEnabled) if err != nil { logger.Fatal("error starting storage service", zap.Error(err)) } @@ -125,13 +126,7 @@ func getStringArgWithDefault(arg interface{}, defaultValue string) string { } } -func registerTraceExporter(logger *zap.Logger, arguments map[string]interface{}) error { - collectorEndpoint := os.Getenv("TRACE_JAEGER_COLLECTOR_ENDPOINT") - if len(collectorEndpoint) == 0 { - logger.Info("skipping trace exporter registration") - return nil - } - +func getServiceName(arguments map[string]interface{}) string { serviceName := "Fission-Unknown" if arguments["--controllerPort"] != nil { @@ -154,26 +149,7 @@ func registerTraceExporter(logger *zap.Logger, arguments map[string]interface{}) serviceName = "Fission-Keda-MQTrigger" } - exporter, err := jaeger.NewExporter(jaeger.Options{ - CollectorEndpoint: collectorEndpoint, - Process: jaeger.Process{ - ServiceName: serviceName, - Tags: []jaeger.Tag{ - jaeger.BoolTag("fission", true), - }, - }, - }) - if err != nil { - return err - } - - samplingRate, err := strconv.ParseFloat(os.Getenv("TRACING_SAMPLING_RATE"), 32) - if err != nil { - return err - } - trace.RegisterExporter(exporter) - trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(samplingRate)}) - return nil + return serviceName } func main() { @@ -264,9 +240,24 @@ Options: logger.Fatal("Could not parse command line arguments", zap.Error(err)) } - err = registerTraceExporter(logger, arguments) + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) if err != nil { - logger.Fatal("Could not register trace exporter", zap.Error(err), zap.Any("argument", arguments)) + logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + + if openTracingEnabled { + err = tracing.RegisterTraceExporter(logger, os.Getenv("TRACE_JAEGER_COLLECTOR_ENDPOINT"), getServiceName(arguments)) + if err != nil { + logger.Fatal("Could not register trace exporter", zap.Error(err), zap.Any("argument", arguments)) + } + } else { + shutdown, err := otel.InitProvider(logger, getServiceName(arguments)) + if err != nil { + logger.Fatal("error initializing provider for OTLP", zap.Error(err), zap.Any("argument", arguments)) + } + if shutdown != nil { + defer shutdown() + } } functionNs := getStringArgWithDefault(arguments["--namespace"], "fission-function") @@ -278,17 +269,17 @@ Options: if arguments["--controllerPort"] != nil { port := getPort(logger, arguments["--controllerPort"]) - runController(logger, port) + runController(logger, port, openTracingEnabled) } if arguments["--routerPort"] != nil { port := getPort(logger, arguments["--routerPort"]) - runRouter(logger, port, executorUrl) + runRouter(logger, port, executorUrl, openTracingEnabled) } if arguments["--executorPort"] != nil { port := getPort(logger, arguments["--executorPort"]) - runExecutor(logger, port, functionNs, envBuilderNs) + runExecutor(logger, port, functionNs, envBuilderNs, openTracingEnabled) } if arguments["--kubewatcher"] == true { @@ -325,7 +316,7 @@ Options: } else if arguments["--storageType"] == string(storagesvc.StorageTypeLocal) { storage = storagesvc.NewLocalStorage("/fission") } - runStorageSvc(logger, port, storage) + runStorageSvc(logger, port, storage, openTracingEnabled) } select {} diff --git a/go.mod b/go.mod index 6341e45b..b9d52ef3 100644 --- a/go.mod +++ b/go.mod @@ -57,9 +57,15 @@ require ( github.com/ulikunitz/xz v0.5.9 // indirect github.com/wcharczuk/go-chart v2.0.1+incompatible go.opencensus.io v0.23.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0 + go.opentelemetry.io/otel v1.0.0-RC2 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC2 + go.opentelemetry.io/otel/sdk v1.0.0-RC2 + go.opentelemetry.io/otel/trace v1.0.0-RC2 go.uber.org/zap v1.18.1 golang.org/x/net v0.0.0-20210614182718-04defd469f4e golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect + google.golang.org/grpc v1.39.0 k8s.io/api v0.19.12 k8s.io/apiextensions-apiserver v0.19.12 k8s.io/apimachinery v0.19.12 diff --git a/go.sum b/go.sum index 27fddc59..d9f8ef54 100644 --- a/go.sum +++ b/go.sum @@ -14,7 +14,6 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= @@ -72,7 +71,6 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -135,6 +133,8 @@ github.com/bsm/sarama-cluster v2.1.15+incompatible h1:RkV6WiNRnqEEbp81druK8zYhmn github.com/bsm/sarama-cluster v2.1.15+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -153,6 +153,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= @@ -221,13 +222,15 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= @@ -357,7 +360,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= @@ -375,12 +377,11 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= 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= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -428,6 +429,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -435,18 +437,15 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.9.1 h1:9PZfAcVEvez4yhLH2TBU64/h/z4xlFI80cWXRrxuKuM= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.16.1 h1:IVQwpTGNRRIHafnTs2dQLIk4ENtneRIEEJWOVDqz99o= github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= @@ -455,7 +454,6 @@ github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -475,7 +473,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -546,7 +543,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -567,7 +563,6 @@ github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -584,7 +579,6 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -605,7 +599,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -670,7 +663,6 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nats-io/stan.go v0.9.0 h1:TB73Y31au++0sU0VmnBy2pYkSrwH0zUFNRB9YePHqC4= github.com/nats-io/stan.go v0.9.0/go.mod h1:0jEuBXKauB1HHJswHM/lx05K48TJ1Yxj6VIfM4k+aB4= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= @@ -735,7 +727,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -765,7 +756,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -783,7 +773,6 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= @@ -856,28 +845,49 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= 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/contrib v0.22.0 h1:0F7gDEjgb1WGn4ODIjaCAg75hmqF+UN0LiVgwxsCodc= +go.opentelemetry.io/contrib v0.22.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0 h1:WHjZguqT+3UjTgFum33hWZYybDVnx8u9q5/kQDfaGTs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.22.0/go.mod h1:o3MuU25bYroYnc2TOKe8mTk8f9X1oPFO6C5RCoPKtSU= +go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= +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/otlp/otlptrace v1.0.0-RC2 h1:Z/91DSYkOqnVuECrd+hxCU9lzeo5Fihjp28uq0Izfpw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0-RC2/go.mod h1:T+s8GKi1OqMwPuZ+ouDtZW4vWYpJuzIzh2Matq4Jo9k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC2 h1:PaSlrCE+hRbamroLGGgFDmzDamCxp7ID+hBvPmOhcSc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC2/go.mod h1:3shayJIFcDqHi9/GT2fAHyMI/bRgc6FO0CAkhaDkhi0= +go.opentelemetry.io/otel/internal/metric v0.22.0 h1:Q9bS02XRykSRIbggaU4hVF9oWOP9PyILu26zJWoKmk0= +go.opentelemetry.io/otel/internal/metric v0.22.0/go.mod h1:7qVuMihW/ktMonEfOvBXuh6tfMvvEyoIDgeJNRloYbQ= +go.opentelemetry.io/otel/metric v0.22.0 h1:/qv10BzznqEifrXBwsTT370OCN1PRgt+mnjzMwxJKrQ= +go.opentelemetry.io/otel/metric v0.22.0/go.mod h1:KcsUkBiYGW003DJ+ugd2aqIRIfjabD9jeOUXqsAtrq0= +go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= +go.opentelemetry.io/otel/oteltest v1.0.0-RC2 h1:xNKqMhlZYkASSyvF4JwObZFMq0jhFN3c3SP+2rCzVPk= +go.opentelemetry.io/otel/oteltest v1.0.0-RC2/go.mod h1:kiQ4tw5tAL4JLTbcOYwK1CWI1HkT5aiLzHovgOVnz/A= +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 v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= +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= +go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4= @@ -901,7 +911,6 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c h1:9HhBz5L/UjnK9XLtiZhYAdue5BVKep3PMmS2LuPDt8k= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -929,7 +938,6 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= @@ -941,7 +949,6 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -988,7 +995,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1005,7 +1011,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201203001011-0b49973bad19 h1:ZD+2Sd/BnevwJp8PSli8WgGAGzb9IZtxBsv1iZMYeEA= golang.org/x/oauth2 v0.0.0-20201203001011-0b49973bad19/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -1021,9 +1026,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1081,7 +1084,6 @@ golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 h1:kzM6+9dur93BcC2kVlYl34cHU+TYZLanmpSJHVMmL64= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1093,12 +1095,12 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1106,7 +1108,6 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1177,11 +1178,9 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201204162204-73cf035baebf h1:LJkCozzIEY51bepolJQN3tP938NA5mMucF2dDJ9AMNA= golang.org/x/tools v0.0.0-20201204162204-73cf035baebf/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= @@ -1208,7 +1207,6 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= @@ -1222,7 +1220,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -1266,6 +1263,7 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1287,7 +1285,10 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1297,17 +1298,16 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/DataDog/dd-trace-go.v1 v1.27.1/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -1318,7 +1318,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1335,14 +1334,11 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1355,7 +1351,6 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.19.12 h1:412/DHd7Vofk2RMb0+RHWYYZwmEOG5Kh54+T/kyi4Zg= k8s.io/api v0.19.12/go.mod h1:EK+KvSq2urA6+CjVdZyAHEphXoLq2K2eW6lxOzTKSaY= @@ -1385,7 +1380,6 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3 h1:4oyYo8NREp49LBBhKxEqCulFjg26rawYKrnCmg+Sr6c= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/pkg/controller/api.go b/pkg/controller/api.go index c239ac17..e731c41d 100644 --- a/pkg/controller/api.go +++ b/pkg/controller/api.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/gorilla/mux" + "go.opencensus.io/plugin/ochttp" "go.uber.org/zap" apiv1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -34,6 +35,7 @@ import ( ferror "github.com/fission/fission/pkg/error" "github.com/fission/fission/pkg/fission-cli/logdb" "github.com/fission/fission/pkg/info" + "github.com/fission/fission/pkg/utils/otel" ) var podNamespace string @@ -263,9 +265,16 @@ func (api *API) GetHandler() http.Handler { return r } -func (api *API) Serve(port int) { +func (api *API) Serve(port int, openTracingEnabled bool) { address := fmt.Sprintf(":%v", port) api.logger.Info("server started", zap.Int("port", port)) - err := http.ListenAndServe(address, api.GetHandler()) + + var handler http.Handler + if openTracingEnabled { + handler = &ochttp.Handler{Handler: api.GetHandler()} + } else { + handler = otel.GetHandlerWithOTEL(api.GetHandler(), "fission-controller", otel.UrlsToIgnore("/healthz")) + } + err := http.ListenAndServe(address, handler) api.logger.Fatal("done listening", zap.Error(err)) } diff --git a/pkg/controller/api_test.go b/pkg/controller/api_test.go index beb7ce6a..e003d82d 100644 --- a/pkg/controller/api_test.go +++ b/pkg/controller/api_test.go @@ -374,7 +374,7 @@ func TestMain(m *testing.M) { panicIf(err) - go Start(logger, 8888, true) + go Start(logger, 8888, true, true) time.Sleep(5 * time.Second) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 51fe20e2..e7a5b20c 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -24,7 +24,7 @@ import ( "github.com/fission/fission/pkg/crd" ) -func Start(logger *zap.Logger, port int, unitTestFlag bool) { +func Start(logger *zap.Logger, port int, unitTestFlag bool, openTracingEnabled bool) { cLogger := logger.Named("controller") fc, kc, apiExtClient, _, err := crd.MakeFissionClient() @@ -53,5 +53,5 @@ func Start(logger *zap.Logger, port int, unitTestFlag bool) { if err != nil { cLogger.Fatal("failed to start controller", zap.Error(err)) } - api.Serve(port) + api.Serve(port, openTracingEnabled) } diff --git a/pkg/executor/api.go b/pkg/executor/api.go index aa978e0b..4b41d59a 100644 --- a/pkg/executor/api.go +++ b/pkg/executor/api.go @@ -33,6 +33,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" ferror "github.com/fission/fission/pkg/error" "github.com/fission/fission/pkg/executor/client" + "github.com/fission/fission/pkg/utils/otel" ) func (executor *Executor) getServiceForFunctionAPI(w http.ResponseWriter, r *http.Request) { @@ -251,11 +252,17 @@ func (executor *Executor) GetHandler() http.Handler { } // Serve starts an HTTP server. -func (executor *Executor) Serve(port int) { +func (executor *Executor) Serve(port int, openTracingEnabled bool) { executor.logger.Info("starting executor API", zap.Int("port", port)) address := fmt.Sprintf(":%v", port) - err := http.ListenAndServe(address, &ochttp.Handler{ - Handler: executor.GetHandler(), - }) + + var handler http.Handler + if openTracingEnabled { + handler = &ochttp.Handler{Handler: executor.GetHandler()} + } else { + handler = otel.GetHandlerWithOTEL(executor.GetHandler(), "fission-executor", otel.UrlsToIgnore("/healthz")) + } + + err := http.ListenAndServe(address, handler) executor.logger.Fatal("done listening", zap.Error(err)) } diff --git a/pkg/executor/client/client.go b/pkg/executor/client/client.go index 06e6828a..280714b5 100644 --- a/pkg/executor/client/client.go +++ b/pkg/executor/client/client.go @@ -23,11 +23,14 @@ import ( "io/ioutil" "net/http" "net/url" + "os" + "strconv" "strings" "time" "github.com/pkg/errors" "go.opencensus.io/plugin/ochttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.uber.org/zap" "golang.org/x/net/context/ctxhttp" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -56,14 +59,24 @@ type ( // MakeClient initializes and returns a Client instance. func MakeClient(logger *zap.Logger, executorURL string) *Client { + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + + var hc *http.Client + if openTracingEnabled { + hc = &http.Client{Transport: &ochttp.Transport{}} + } else { + hc = &http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)} + } + c := &Client{ logger: logger.Named("executor_client"), executorURL: strings.TrimSuffix(executorURL, "/"), tappedByURL: make(map[string]TapServiceRequest), requestChan: make(chan TapServiceRequest, 100), - httpClient: &http.Client{ - Transport: &ochttp.Transport{}, - }, + httpClient: hc, } go c.service() return c diff --git a/pkg/executor/executor.go b/pkg/executor/executor.go index 1c9c229e..8bee46d6 100644 --- a/pkg/executor/executor.go +++ b/pkg/executor/executor.go @@ -255,7 +255,7 @@ func serveMetric(logger *zap.Logger) { // StartExecutor Starts executor and the executor components such as Poolmgr, // deploymgr and potential future executor types -func StartExecutor(logger *zap.Logger, functionNamespace string, envBuilderNamespace string, port int) error { +func StartExecutor(logger *zap.Logger, functionNamespace string, envBuilderNamespace string, port int, openTracingEnabled bool) error { fissionClient, kubernetesClient, _, metricsClient, err := crd.MakeFissionClient() if err != nil { return errors.Wrap(err, "failed to get kubernetes client") @@ -345,7 +345,7 @@ func StartExecutor(logger *zap.Logger, functionNamespace string, envBuilderNames } go reaper.CleanupRoleBindings(logger, kubernetesClient, fissionClient, functionNamespace, envBuilderNamespace, time.Minute*30) - go api.Serve(port) + go api.Serve(port, openTracingEnabled) go serveMetric(logger) return nil diff --git a/pkg/executor/executor_test.go b/pkg/executor/executor_test.go index 20a3301c..b40cc3ec 100644 --- a/pkg/executor/executor_test.go +++ b/pkg/executor/executor_test.go @@ -173,7 +173,7 @@ func TestExecutor(t *testing.T) { // create poolmgr port := 9999 - err = StartExecutor(logger, functionNs, "fission-builder", port) + err = StartExecutor(logger, functionNs, "fission-builder", port, true) if err != nil { log.Panicf("failed to start poolmgr: %v", err) } diff --git a/pkg/fetcher/client/client.go b/pkg/fetcher/client/client.go index ca6551f9..eb7ed97b 100644 --- a/pkg/fetcher/client/client.go +++ b/pkg/fetcher/client/client.go @@ -6,11 +6,14 @@ import ( "encoding/json" "io/ioutil" "net/http" + "os" + "strconv" "strings" "time" "github.com/pkg/errors" "go.opencensus.io/plugin/ochttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.uber.org/zap" "golang.org/x/net/context/ctxhttp" @@ -27,12 +30,22 @@ type ( ) func MakeClient(logger *zap.Logger, fetcherUrl string) *Client { + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + + var hc *http.Client + if openTracingEnabled { + hc = &http.Client{Transport: &ochttp.Transport{}} + } else { + hc = &http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)} + } + return &Client{ - logger: logger.Named("fetcher_client"), - url: strings.TrimSuffix(fetcherUrl, "/"), - httpClient: &http.Client{ - Transport: &ochttp.Transport{}, - }, + logger: logger.Named("fetcher_client"), + url: strings.TrimSuffix(fetcherUrl, "/"), + httpClient: hc, } } diff --git a/pkg/fetcher/config/config.go b/pkg/fetcher/config/config.go index 562819f6..cb90320f 100644 --- a/pkg/fetcher/config/config.go +++ b/pkg/fetcher/config/config.go @@ -282,6 +282,16 @@ func (cfg *Config) addFetcherToPodSpecWithCommand(podSpec *apiv1.PodSpec, mainCo }, }, }, + Env: []apiv1.EnvVar{ + { + Name: "OPENTRACING_ENABLED", + Value: os.Getenv("OPENTRACING_ENABLED"), + }, + { + Name: "OTEL_COLLECTOR_ENDPOINT", + Value: os.Getenv("OTEL_COLLECTOR_ENDPOINT"), + }, + }, } // Pod is removed from endpoints list for service when it's diff --git a/pkg/fetcher/fetcher.go b/pkg/fetcher/fetcher.go index b075e013..6ff4c1b7 100644 --- a/pkg/fetcher/fetcher.go +++ b/pkg/fetcher/fetcher.go @@ -25,12 +25,14 @@ import ( "net/http" "os" "path/filepath" + "strconv" "time" "github.com/mholt/archiver" "github.com/pkg/errors" uuid "github.com/satori/go.uuid" "go.opencensus.io/plugin/ochttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" k8serr "k8s.io/apimachinery/pkg/api/errors" @@ -102,6 +104,18 @@ func MakeFetcher(logger *zap.Logger, sharedVolumePath string, sharedSecretPath s return nil, errors.Wrap(err, "error reading pod namespace from downward volume") } + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + + var hc *http.Client + if openTracingEnabled { + hc = &http.Client{Transport: &ochttp.Transport{}} + } else { + hc = &http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)} + } + return &Fetcher{ logger: fLogger, sharedVolumePath: sharedVolumePath, @@ -113,9 +127,7 @@ func MakeFetcher(logger *zap.Logger, sharedVolumePath string, sharedSecretPath s Name: string(name), Namespace: string(namespace), }, - httpClient: &http.Client{ - Transport: &ochttp.Transport{}, - }, + httpClient: hc, }, nil } @@ -149,6 +161,8 @@ func (fetcher *Fetcher) VersionHandler(w http.ResponseWriter, r *http.Request) { } func (fetcher *Fetcher) FetchHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + if r.Method != "POST" { http.Error(w, "only POST is supported on this endpoint", http.StatusMethodNotAllowed) return @@ -175,14 +189,14 @@ func (fetcher *Fetcher) FetchHandler(w http.ResponseWriter, r *http.Request) { return } - pkg, err := fetcher.getPkgInformation(req) + pkg, err := fetcher.getPkgInformation(ctx, req) if err != nil { fetcher.logger.Error("error getting package information", zap.Error(err)) http.Error(w, err.Error(), http.StatusInternalServerError) return } - code, err := fetcher.Fetch(r.Context(), pkg, req) + code, err := fetcher.Fetch(ctx, pkg, req) if err != nil { fetcher.logger.Error("error fetching", zap.Error(err)) http.Error(w, err.Error(), code) @@ -190,7 +204,7 @@ func (fetcher *Fetcher) FetchHandler(w http.ResponseWriter, r *http.Request) { } fetcher.logger.Info("checking secrets/cfgmaps") - code, err = fetcher.FetchSecretsAndCfgMaps(req.Secrets, req.ConfigMaps) + code, err = fetcher.FetchSecretsAndCfgMaps(ctx, req.Secrets, req.ConfigMaps) if err != nil { fetcher.logger.Error("error fetching secrets and config maps", zap.Error(err)) http.Error(w, err.Error(), code) @@ -203,6 +217,8 @@ func (fetcher *Fetcher) FetchHandler(w http.ResponseWriter, r *http.Request) { } func (fetcher *Fetcher) SpecializeHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + if r.Method != "POST" { http.Error(w, fmt.Sprintf("only POST is supported on this endpoint, %v received", r.Method), http.StatusMethodNotAllowed) return @@ -223,7 +239,7 @@ func (fetcher *Fetcher) SpecializeHandler(w http.ResponseWriter, r *http.Request return } - err = fetcher.SpecializePod(r.Context(), req.FetchReq, req.LoadReq) + err = fetcher.SpecializePod(ctx, req.FetchReq, req.LoadReq) if err != nil { fetcher.logger.Error("error specializing pod", zap.Error(err)) http.Error(w, err.Error(), http.StatusInternalServerError) @@ -353,10 +369,10 @@ func (fetcher *Fetcher) Fetch(ctx context.Context, pkg *fv1.Package, req Functio // FetchSecretsAndCfgMaps fetches secrets and configmaps specified by user // It returns the HTTP code and error if any -func (fetcher *Fetcher) FetchSecretsAndCfgMaps(secrets []fv1.SecretReference, cfgmaps []fv1.ConfigMapReference) (int, error) { +func (fetcher *Fetcher) FetchSecretsAndCfgMaps(ctx context.Context, secrets []fv1.SecretReference, cfgmaps []fv1.ConfigMapReference) (int, error) { if len(secrets) > 0 { for _, secret := range secrets { - data, err := fetcher.kubeClient.CoreV1().Secrets(secret.Namespace).Get(context.TODO(), secret.Name, metav1.GetOptions{}) + data, err := fetcher.kubeClient.CoreV1().Secrets(secret.Namespace).Get(ctx, secret.Name, metav1.GetOptions{}) if err != nil { e := "error getting secret from kubeapi" @@ -400,7 +416,7 @@ func (fetcher *Fetcher) FetchSecretsAndCfgMaps(secrets []fv1.SecretReference, cf if len(cfgmaps) > 0 { for _, config := range cfgmaps { - data, err := fetcher.kubeClient.CoreV1().ConfigMaps(config.Namespace).Get(context.TODO(), config.Name, metav1.GetOptions{}) + data, err := fetcher.kubeClient.CoreV1().ConfigMaps(config.Namespace).Get(ctx, config.Name, metav1.GetOptions{}) if err != nil { e := "error getting configmap from kubeapi" @@ -450,6 +466,8 @@ func (fetcher *Fetcher) FetchSecretsAndCfgMaps(secrets []fv1.SecretReference, cf } func (fetcher *Fetcher) UploadHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + if r.Method != "POST" { http.Error(w, "only POST is supported on this endpoint", http.StatusMethodNotAllowed) return @@ -503,7 +521,7 @@ func (fetcher *Fetcher) UploadHandler(w http.ResponseWriter, r *http.Request) { fetcher.logger.Info("starting upload...") ssClient := storageSvcClient.MakeClient(req.StorageSvcUrl) - fileID, err := ssClient.Upload(r.Context(), dstFilepath, nil) + fileID, err := ssClient.Upload(ctx, dstFilepath, nil) if err != nil { e := "error uploading zip file" fetcher.logger.Error(e, zap.Error(err), zap.String("file", dstFilepath)) @@ -581,10 +599,10 @@ func (fetcher *Fetcher) unarchive(src string, dst string) error { } // getPkgInformation gets package information from k8s api server. -func (fetcher *Fetcher) getPkgInformation(req FunctionFetchRequest) (pkg *fv1.Package, err error) { +func (fetcher *Fetcher) getPkgInformation(ctx context.Context, req FunctionFetchRequest) (pkg *fv1.Package, err error) { maxRetries := 5 for i := 0; i < maxRetries; i++ { - pkg, err = fetcher.fissionClient.CoreV1().Packages(req.Package.Namespace).Get(context.TODO(), req.Package.Name, metav1.GetOptions{}) + pkg, err = fetcher.fissionClient.CoreV1().Packages(req.Package.Namespace).Get(ctx, req.Package.Name, metav1.GetOptions{}) if err == nil { return pkg, nil } @@ -618,7 +636,7 @@ func (fetcher *Fetcher) SpecializePod(ctx context.Context, fetchReq FunctionFetc fetcher.logger.Info("specialize request done", zap.Duration("elapsed_time", elapsed)) }() - pkg, err := fetcher.getPkgInformation(fetchReq) + pkg, err := fetcher.getPkgInformation(ctx, fetchReq) if err != nil { return errors.Wrap(err, "error getting package information") } @@ -628,7 +646,7 @@ func (fetcher *Fetcher) SpecializePod(ctx context.Context, fetchReq FunctionFetc return errors.Wrap(err, "error fetching deploy package") } - _, err = fetcher.FetchSecretsAndCfgMaps(fetchReq.Secrets, fetchReq.ConfigMaps) + _, err = fetcher.FetchSecretsAndCfgMaps(ctx, fetchReq.Secrets, fetchReq.ConfigMaps) if err != nil { return errors.Wrap(err, "error fetching secrets/configs") } @@ -691,6 +709,8 @@ func (fetcher *Fetcher) SpecializePod(ctx context.Context, fetchReq FunctionFetc // WsStartHandler is used to generate websocket events in Kubernetes func (fetcher *Fetcher) WsStartHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + if r.Method != "GET" { http.Error(w, "only GET is supported on this endpoint", http.StatusMethodNotAllowed) return @@ -700,7 +720,7 @@ func (fetcher *Fetcher) WsStartHandler(w http.ResponseWriter, r *http.Request) { klog.Errorf("Error creating recorder %s", err) http.Error(w, err.Error(), http.StatusInternalServerError) } - pods, err := fetcher.kubeClient.CoreV1().Pods(fetcher.Info.Namespace).List(context.TODO(), metav1.ListOptions{ + pods, err := fetcher.kubeClient.CoreV1().Pods(fetcher.Info.Namespace).List(ctx, metav1.ListOptions{ FieldSelector: "metadata.name=" + fetcher.Info.Name, }) if err != nil { @@ -721,6 +741,8 @@ func (fetcher *Fetcher) WsStartHandler(w http.ResponseWriter, r *http.Request) { // WsEndHandler is used to generate inactive events in Kubernetes func (fetcher *Fetcher) WsEndHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + if r.Method != "GET" { http.Error(w, "only GET is supported on this endpoint", http.StatusMethodNotAllowed) return @@ -730,7 +752,7 @@ func (fetcher *Fetcher) WsEndHandler(w http.ResponseWriter, r *http.Request) { klog.Errorf("Error creating recorder %s", err) http.Error(w, err.Error(), http.StatusInternalServerError) } - pods, err := fetcher.kubeClient.CoreV1().Pods(fetcher.Info.Namespace).List(context.TODO(), metav1.ListOptions{ + pods, err := fetcher.kubeClient.CoreV1().Pods(fetcher.Info.Namespace).List(ctx, metav1.ListOptions{ FieldSelector: "metadata.name=" + fetcher.Info.Name, }) if err != nil { diff --git a/pkg/router/functionHandler.go b/pkg/router/functionHandler.go index efffa700..7b19c079 100644 --- a/pkg/router/functionHandler.go +++ b/pkg/router/functionHandler.go @@ -32,6 +32,8 @@ import ( "github.com/pkg/errors" "go.opencensus.io/plugin/ochttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" k8stypes "k8s.io/apimachinery/pkg/types" @@ -40,8 +42,10 @@ import ( ferror "github.com/fission/fission/pkg/error" "github.com/fission/fission/pkg/error/network" executorClient "github.com/fission/fission/pkg/executor/client" + "github.com/fission/fission/pkg/router/util" "github.com/fission/fission/pkg/throttler" "github.com/fission/fission/pkg/utils" + otelUtils "github.com/fission/fission/pkg/utils/otel" ) const ( @@ -66,6 +70,7 @@ type ( svcAddrUpdateThrottler *throttler.Throttler functionTimeoutMap map[k8stypes.UID]int unTapServiceTimeout time.Duration + openTracingEnabled bool } tsRoundTripperParams struct { @@ -154,10 +159,11 @@ func (w *fakeCloseReadCloser) RealClose() error { // Earlier, GetServiceForFunction was called inside handler function and fission explicitly set http status code to 500 // if it returned an error. func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + ctx := req.Context() + // set the timeout for transport context roundTripper.addForwardedHostHeader(req) transport := roundTripper.getDefaultTransport() - ocRoundTripper := &ochttp.Transport{Base: transport} executingTimeout := roundTripper.funcHandler.tsRoundTripperParams.timeout @@ -220,7 +226,7 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re // trying to get new service url from cache/executor. if retryCounter == 0 { // get function service url from cache or executor - roundTripper.serviceURL, roundTripper.urlFromCache, err = roundTripper.funcHandler.getServiceEntry() + roundTripper.serviceURL, roundTripper.urlFromCache, err = roundTripper.funcHandler.getServiceEntry(ctx) if err != nil { // We might want a specific error code or header for fission failures as opposed to // user function bugs. @@ -249,9 +255,9 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re continue } if roundTripper.funcHandler.function.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypePoolmgr { - defer func(fn *fv1.Function, serviceURL *url.URL) { + defer func(ctx context.Context, fn *fv1.Function, serviceURL *url.URL) { go roundTripper.funcHandler.unTapService(fn, serviceURL) //nolint errcheck - }(roundTripper.funcHandler.function, roundTripper.serviceURL) + }(ctx, roundTripper.funcHandler.function, roundTripper.serviceURL) } // modify the request to reflect the service url @@ -309,8 +315,23 @@ func (roundTripper *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Re dumpReqFunc(newReq) } + // The otelhttp.NewTransport() does not work with WebSocket. + // This is probably because it modifies the response body. + // Until we find a better solution to handle websocket requests, we will continue to + // use ochttp.Transport(). We check if the request isWebsocketRequest() and use the + // ochttp.Transport() irrespective of open telemetry is enabled or not. + // Related issue: https://github.com/open-telemetry/opentelemetry-js-contrib/issues/12 + // forward the request to the function service - resp, err := ocRoundTripper.RoundTrip(newReq) + var resp *http.Response + if roundTripper.funcHandler.openTracingEnabled || util.IsWebsocketRequest(newReq) { + ocRoundTripper := &ochttp.Transport{Base: transport} + resp, err = ocRoundTripper.RoundTrip(newReq) + } else { + otelRoundTripper := otelhttp.NewTransport(transport) + resp, err = otelRoundTripper.RoundTrip(newReq) + } + if err == nil { // return response back to user if roundTripper.funcHandler.isDebugEnv { @@ -494,6 +515,10 @@ func (fh functionHandler) handler(responseWriter http.ResponseWriter, request *h rrt.closeContext() }() + // add attributes to current span + span := trace.SpanFromContext(request.Context()) + span.SetAttributes(otelUtils.GetAttributesForFunction(fh.function)...) + proxy.ServeHTTP(responseWriter, request) } @@ -657,7 +682,7 @@ func (fh functionHandler) getServiceEntryFromExecutor() (serviceUrl *url.URL, er } // getServiceEntryFromExecutor returns service url entry returns from executor -func (fh functionHandler) getServiceEntry() (svcURL *url.URL, cacheHit bool, err error) { +func (fh functionHandler) getServiceEntry(ctx context.Context) (svcURL *url.URL, cacheHit bool, err error) { if fh.function.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType == fv1.ExecutorTypePoolmgr { svcURL, err = fh.getServiceEntryFromExecutor() return svcURL, false, err diff --git a/pkg/router/httpTriggers.go b/pkg/router/httpTriggers.go index 21e589a0..830f1137 100644 --- a/pkg/router/httpTriggers.go +++ b/pkg/router/httpTriggers.go @@ -19,6 +19,8 @@ package router import ( "context" "net/http" + "os" + "strconv" "time" "github.com/gorilla/mux" @@ -33,6 +35,7 @@ import ( genInformer "github.com/fission/fission/pkg/generated/informers/externalversions" "github.com/fission/fission/pkg/throttler" "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/otel" ) // HTTPTriggerSet represents an HTTP trigger set @@ -110,6 +113,11 @@ func routerHealthHandler(w http.ResponseWriter, r *http.Request) { func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router { muxRouter := mux.NewRouter() + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + ts.logger.Fatal("error parsing OPENTRACING_ENABLED", zap.Error(err)) + } + // HTTP triggers setup by the user homeHandled := false for i := range ts.triggers { @@ -143,6 +151,7 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router svcAddrUpdateThrottler: ts.svcAddrUpdateThrottler, functionTimeoutMap: fnTimeoutMap, unTapServiceTimeout: ts.unTapServiceTimeout, + openTracingEnabled: openTracingEnabled, } // The functionHandler for HTTP trigger with fn reference type "FunctionReferenceTypeFunctionName", @@ -157,13 +166,24 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router fh.function = fn } } - var ht *mux.Route + var ht *mux.Route if trigger.Spec.Prefix != nil && *trigger.Spec.Prefix != "" { - ht = muxRouter.PathPrefix(*trigger.Spec.Prefix).HandlerFunc(fh.handler) + if openTracingEnabled { + ht = muxRouter.PathPrefix(*trigger.Spec.Prefix).HandlerFunc(fh.handler) + } else { + handler := otel.GetHandlerWithOTEL(http.HandlerFunc(fh.handler), *trigger.Spec.Prefix) + ht = muxRouter.PathPrefix(*trigger.Spec.Prefix).Handler(handler) + } } else { - ht = muxRouter.HandleFunc(trigger.Spec.RelativeURL, fh.handler) + if openTracingEnabled { + ht = muxRouter.HandleFunc(trigger.Spec.RelativeURL, fh.handler) + } else { + handler := otel.GetHandlerWithOTEL(http.HandlerFunc(fh.handler), trigger.Spec.RelativeURL) + ht = muxRouter.Handle(trigger.Spec.RelativeURL, handler) + } } + methods := trigger.Spec.Methods if len(trigger.Spec.Method) > 0 { present := false @@ -212,7 +232,14 @@ func (ts *HTTPTriggerSet) getRouter(fnTimeoutMap map[types.UID]int) *mux.Router functionTimeoutMap: fnTimeoutMap, unTapServiceTimeout: ts.unTapServiceTimeout, } - muxRouter.PathPrefix(utils.UrlForFunction(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace)).HandlerFunc(fh.handler) + + route := utils.UrlForFunction(fn.ObjectMeta.Name, fn.ObjectMeta.Namespace) + if openTracingEnabled { + muxRouter.PathPrefix(route).HandlerFunc(fh.handler) + } else { + otelHandler := otel.GetHandlerWithOTEL(http.HandlerFunc(fh.handler), route) + muxRouter.PathPrefix(route).Handler(otelHandler) + } } // Healthz endpoint for the router. diff --git a/pkg/router/router.go b/pkg/router/router.go index c248c615..42957694 100644 --- a/pkg/router/router.go +++ b/pkg/router/router.go @@ -53,11 +53,13 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "go.opencensus.io/plugin/ochttp" "go.opencensus.io/trace" + "go.opentelemetry.io/otel" "go.uber.org/zap" "github.com/fission/fission/pkg/crd" executorClient "github.com/fission/fission/pkg/executor/client" "github.com/fission/fission/pkg/throttler" + otelUtils "github.com/fission/fission/pkg/utils/otel" ) // request url ---[mux]---> Function(name,uid) ----[fmap]----> k8s service url @@ -80,36 +82,38 @@ func router(ctx context.Context, logger *zap.Logger, httpTriggerSet *HTTPTrigger } func serve(ctx context.Context, logger *zap.Logger, port int, tracingSamplingRate float64, - httpTriggerSet *HTTPTriggerSet, displayAccessLog bool) { + httpTriggerSet *HTTPTriggerSet, displayAccessLog bool, openTracingEnabled bool) { mr := router(ctx, logger, httpTriggerSet) url := fmt.Sprintf(":%v", port) - err := http.ListenAndServe(url, &ochttp.Handler{ - Handler: mr, - GetStartOptions: func(r *http.Request) trace.StartOptions { - // do not trace router healthz endpoint - if strings.Compare(r.URL.Path, "/router-healthz") == 0 { + var err error + if openTracingEnabled { + err = http.ListenAndServe(url, &ochttp.Handler{ + Handler: mr, + GetStartOptions: func(r *http.Request) trace.StartOptions { + // do not trace router healthz endpoint + if strings.Compare(r.URL.Path, "/router-healthz") == 0 { + return trace.StartOptions{ + Sampler: trace.NeverSample(), + } + } + if displayAccessLog { + reqMsg, err := httputil.DumpRequest(r, false) + if err != nil { + logger.Error("error dumping request", zap.Error(err)) + } + logger.Info("request dump", zap.String("request", string(reqMsg))) + } return trace.StartOptions{ - Sampler: trace.NeverSample(), + Sampler: trace.ProbabilitySampler(tracingSamplingRate), } - } - if displayAccessLog { - reqMsg, err := httputil.DumpRequest(r, false) - if err != nil { - logger.Error("error dumping request", zap.Error(err)) - } - logger.Info("request dump", zap.String("request", string(reqMsg))) - } - return trace.StartOptions{ - Sampler: trace.ProbabilitySampler(tracingSamplingRate), - } - }, - }) + }, + }) + } else { + err = http.ListenAndServe(url, otelUtils.GetHandlerWithOTEL(mr, "fission-router", otelUtils.UrlsToIgnore("/router-healthz"))) + } if err != nil { - logger.Error( - "HTTP server error", - zap.Error(err), - ) + logger.Error("HTTP server error", zap.Error(err)) } } @@ -122,7 +126,7 @@ func serveMetric(logger *zap.Logger) { } // Start starts a router -func Start(logger *zap.Logger, port int, executorURL string) { +func Start(logger *zap.Logger, port int, executorURL string, openTracingEnabled bool) { fmap := makeFunctionServiceMap(logger, time.Minute) fissionClient, kubeClient, _, _, err := crd.MakeFissionClient() @@ -252,7 +256,12 @@ func Start(logger *zap.Logger, port int, executorURL string) { go serveMetric(logger) logger.Info("starting router", zap.Int("port", port)) - ctx, cancel := context.WithCancel(context.Background()) + + tracer := otel.Tracer("router") + ctx, span := tracer.Start(context.Background(), "router/Start") + defer span.End() + + ctxWithCancel, cancel := context.WithCancel(ctx) defer cancel() - serve(ctx, logger, port, tracingSamplingRate, triggers, displayAccessLog) + serve(ctxWithCancel, logger, port, tracingSamplingRate, triggers, displayAccessLog, openTracingEnabled) } diff --git a/pkg/router/util/util.go b/pkg/router/util/util.go index 1cad7b57..104c1e64 100644 --- a/pkg/router/util/util.go +++ b/pkg/router/util/util.go @@ -17,6 +17,8 @@ limitations under the License. package util import ( + "net/http" + v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -100,3 +102,8 @@ func GetDeployLabels(trigger *fv1.HTTPTrigger) map[string]string { "triggerNamespace": trigger.ObjectMeta.Namespace, } } + +func IsWebsocketRequest(request *http.Request) bool { + return request.Header.Get("Upgrade") == "websocket" && + request.Header.Get("Connection") == "Upgrade" +} diff --git a/pkg/storagesvc/client/client.go b/pkg/storagesvc/client/client.go index 40814cf4..d245bb22 100644 --- a/pkg/storagesvc/client/client.go +++ b/pkg/storagesvc/client/client.go @@ -27,10 +27,13 @@ import ( "net/http" "net/url" "os" + "strconv" "strings" "github.com/pkg/errors" "go.opencensus.io/plugin/ochttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.uber.org/zap" "golang.org/x/net/context/ctxhttp" "github.com/fission/fission/pkg/storagesvc" @@ -45,11 +48,20 @@ type ( // Client creates a storage service client. func MakeClient(url string) *Client { + openTracingEnabled, err := strconv.ParseBool(os.Getenv("OPENTRACING_ENABLED")) + if err != nil { + fmt.Printf("error parsing OPENTRACING_ENABLED: %v\n", zap.Error(err)) + } + + var hc *http.Client + if openTracingEnabled { + hc = &http.Client{Transport: &ochttp.Transport{}} + } else { + hc = &http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)} + } return &Client{ - url: strings.TrimSuffix(url, "/") + "/v1", - httpClient: &http.Client{ - Transport: &ochttp.Transport{}, - }, + url: strings.TrimSuffix(url, "/") + "/v1", + httpClient: hc, } } diff --git a/pkg/storagesvc/client/storagesvc_test.go b/pkg/storagesvc/client/storagesvc_test.go index c5dedbc9..d71aa477 100644 --- a/pkg/storagesvc/client/storagesvc_test.go +++ b/pkg/storagesvc/client/storagesvc_test.go @@ -95,8 +95,7 @@ func startS3StorageService(endpoint, bucketName, subDir string) { os.Setenv("STORAGE_S3_REGION", minioRegion) storage := storagesvc.NewS3Storage() - _ = storagesvc.Start(logger, storage, port) - + _ = storagesvc.Start(logger, storage, port, true) } func TestS3StorageService(t *testing.T) { @@ -213,7 +212,7 @@ func TestLocalStorageService(t *testing.T) { localPath := fmt.Sprintf("/tmp/%v", testID) _ = os.Mkdir(localPath, os.ModePerm) storage := storagesvc.NewLocalStorage(localPath) - _ = storagesvc.Start(logger, storage, port) + _ = storagesvc.Start(logger, storage, port, true) time.Sleep(time.Second) client := MakeClient(fmt.Sprintf("http://localhost:%v/", port)) diff --git a/pkg/storagesvc/storagesvc.go b/pkg/storagesvc/storagesvc.go index 8b401b31..37e5b5bc 100644 --- a/pkg/storagesvc/storagesvc.go +++ b/pkg/storagesvc/storagesvc.go @@ -29,6 +29,8 @@ import ( "github.com/pkg/errors" "go.opencensus.io/plugin/ochttp" "go.uber.org/zap" + + "github.com/fission/fission/pkg/utils/otel" ) type ( @@ -132,7 +134,6 @@ func (ss *StorageService) uploadHandler(w http.ResponseWriter, r *http.Request) zap.String("filename", handler.Filename), ) } - } func (ss *StorageService) getIdFromRequest(r *http.Request) (string, error) { @@ -199,7 +200,7 @@ func MakeStorageService(logger *zap.Logger, storageClient *StowClient, port int) } } -func (ss *StorageService) Start(port int) { +func (ss *StorageService) Start(port int, openTracingEnabled bool) { r := mux.NewRouter() r.HandleFunc("/v1/archive", ss.uploadHandler).Methods("POST") r.HandleFunc("/v1/archive", ss.downloadHandler).Methods("GET") @@ -208,15 +209,19 @@ func (ss *StorageService) Start(port int) { address := fmt.Sprintf(":%v", port) - err := http.ListenAndServe(address, &ochttp.Handler{ - Handler: r, - }) - + var err error + if openTracingEnabled { + err = http.ListenAndServe(address, &ochttp.Handler{ + Handler: r, + }) + } else { + err = http.ListenAndServe(address, otel.GetHandlerWithOTEL(r, "fission-storagesvc", otel.UrlsToIgnore("/healthz"))) + } ss.logger.Fatal("done listening", zap.Error(err)) } // Start runs storage service -func Start(logger *zap.Logger, storage Storage, port int) error { +func Start(logger *zap.Logger, storage Storage, port int, openTracingEnabled bool) error { enablePruner := true // create a storage client storageClient, err := MakeStowClient(logger, storage) @@ -226,7 +231,7 @@ func Start(logger *zap.Logger, storage Storage, port int) error { // create http handlers storageService := MakeStorageService(logger, storageClient, port) - go storageService.Start(port) + go storageService.Start(port, openTracingEnabled) // enablePruner prevents storagesvc unit test from needing to talk to kubernetes if enablePruner { diff --git a/pkg/utils/otel/attributes.go b/pkg/utils/otel/attributes.go new file mode 100644 index 00000000..d985b8a0 --- /dev/null +++ b/pkg/utils/otel/attributes.go @@ -0,0 +1,24 @@ +package otel + +import ( + "go.opentelemetry.io/otel/attribute" + + fv1 "github.com/fission/fission/pkg/apis/core/v1" +) + +/* GetAttributesForFunction returns a set of attributes for a function. Attributes returned: + function-name + function-namespace + environment-name + environment-namespace + +These attributes are tags that can be used to filter traces. +*/ +func GetAttributesForFunction(fn *fv1.Function) []attribute.KeyValue { + return []attribute.KeyValue{ + {Key: "function-name", Value: attribute.StringValue(fn.Name)}, + {Key: "function-namespace", Value: attribute.StringValue(fn.Namespace)}, + {Key: "environment-name", Value: attribute.StringValue(fn.Spec.Environment.Name)}, + {Key: "environment-namespace", Value: attribute.StringValue(fn.Spec.Environment.Namespace)}, + } +} diff --git a/pkg/utils/otel/handler.go b/pkg/utils/otel/handler.go new file mode 100644 index 00000000..23030a18 --- /dev/null +++ b/pkg/utils/otel/handler.go @@ -0,0 +1,31 @@ +package otel + +import ( + "net/http" + "strings" + + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" +) + +func UrlsToIgnore(ignoreEndpoints ...string) func(r *http.Request) bool { + return func(r *http.Request) bool { + for _, ignore := range ignoreEndpoints { + if strings.HasPrefix(r.URL.Path, ignore) { + return false + } + } + return true + } +} + +func GetHandlerWithOTEL(h http.Handler, name string, filter ...otelhttp.Filter) http.Handler { + opts := []otelhttp.Option{ + otelhttp.WithMessageEvents(otelhttp.ReadEvents, otelhttp.WriteEvents), + } + + for _, f := range filter { + opts = append(opts, otelhttp.WithFilter(f)) + } + + return otelhttp.NewHandler(h, name, opts...) +} diff --git a/pkg/utils/otel/provider.go b/pkg/utils/otel/provider.go new file mode 100644 index 00000000..34335ec5 --- /dev/null +++ b/pkg/utils/otel/provider.go @@ -0,0 +1,61 @@ +package otel + +import ( + "context" + "os" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "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" + "go.uber.org/zap" + "google.golang.org/grpc" +) + +// Initializes an OTLP exporter, and configures the corresponding trace and metric providers. +func InitProvider(logger *zap.Logger, serviceName string) (func(), error) { + collectorEndpoint := os.Getenv("OTEL_COLLECTOR_ENDPOINT") + if collectorEndpoint == "" { + logger.Info("skipping trace exporter registration") + return nil, nil + } + + ctx := context.Background() + res, err := resource.New(ctx, + resource.WithAttributes( + semconv.ServiceNameKey.String(serviceName), + ), + ) + if err != nil { + return nil, err + } + + traceExporter, err := otlptracegrpc.New(ctx, + otlptracegrpc.WithInsecure(), + otlptracegrpc.WithEndpoint(collectorEndpoint), + otlptracegrpc.WithDialOption(grpc.WithBlock()), + ) + if err != nil { + return nil, err + } + + bsp := sdktrace.NewBatchSpanProcessor(traceExporter) + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithResource(res), + sdktrace.WithSpanProcessor(bsp), + ) + + otel.SetTracerProvider(tracerProvider) + otel.SetTextMapPropagator(propagation.TraceContext{}) + + // Shutdown will flush any remaining spans and shut down the exporter. + return func() { + err := tracerProvider.Shutdown(ctx) + if err != nil { + logger.Fatal("error shutting down trace provider", zap.Error(err)) + } + }, nil +} diff --git a/pkg/utils/tracing/tracing.go b/pkg/utils/tracing/tracing.go new file mode 100644 index 00000000..b330088b --- /dev/null +++ b/pkg/utils/tracing/tracing.go @@ -0,0 +1,45 @@ +package tracing + +import ( + "os" + "strconv" + "strings" + + "contrib.go.opencensus.io/exporter/jaeger" + "go.opencensus.io/trace" + "go.uber.org/zap" +) + +func RegisterTraceExporter(logger *zap.Logger, collectorEndpoint, serviceName string) error { + if len(collectorEndpoint) == 0 { + logger.Info("skipping trace exporter registration") + return nil + } + + exporter, err := jaeger.NewExporter(jaeger.Options{ + CollectorEndpoint: collectorEndpoint, + Process: jaeger.Process{ + ServiceName: serviceName, + Tags: []jaeger.Tag{ + jaeger.BoolTag("fission", true), + }, + }, + }) + if err != nil { + return err + } + + trace.RegisterExporter(exporter) + + if strings.EqualFold(serviceName, "Fission-Fetcher") { + trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) + } else { + samplingRate, err := strconv.ParseFloat(os.Getenv("TRACING_SAMPLING_RATE"), 32) + if err != nil { + return err + } + trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(samplingRate)}) + } + + return nil +}