From 28300f10cbd3ea5ed878b4118293a281a4947426 Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Thu, 3 Aug 2023 17:05:29 +0200 Subject: [PATCH 1/6] [service] Move TracerProvider initialization to service/telemetry package --- service/internal/proctelemetry/config.go | 53 --------- service/internal/proctelemetry/config_test.go | 91 --------------- service/internal/resource/config.go | 44 +++++++ service/service.go | 56 ++------- service/telemetry.go | 68 +---------- service/telemetry/span_processor.go | 57 ++++++++++ service/telemetry/span_processor_test.go | 107 ++++++++++++++++++ service/telemetry/telemetry.go | 13 ++- service/telemetry/tracer_provider.go | 65 +++++++++++ service/telemetry_test.go | 16 +-- 10 files changed, 302 insertions(+), 268 deletions(-) create mode 100644 service/internal/resource/config.go create mode 100644 service/telemetry/span_processor.go create mode 100644 service/telemetry/span_processor_test.go create mode 100644 service/telemetry/tracer_provider.go diff --git a/service/internal/proctelemetry/config.go b/service/internal/proctelemetry/config.go index ee20660e296..0612031a95f 100644 --- a/service/internal/proctelemetry/config.go +++ b/service/internal/proctelemetry/config.go @@ -22,12 +22,10 @@ import ( "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp" otelprom "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" - "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" "go.opentelemetry.io/otel/sdk/instrumentation" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/aggregation" "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/collector/obsreport" semconv "go.opentelemetry.io/collector/semconv/v1.18.0" @@ -62,7 +60,6 @@ var ( } errNoValidMetricExporter = errors.New("no valid metric exporter") - errNoValidSpanExporter = errors.New("no valid span exporter") ) func InitMetricReader(ctx context.Context, reader telemetry.MetricReader, asyncErrorChannel chan error) (sdkmetric.Reader, *http.Server, error) { @@ -83,56 +80,6 @@ func InitMetricReader(ctx context.Context, reader telemetry.MetricReader, asyncE return nil, nil, fmt.Errorf("unsupported metric reader type %v", reader) } -func InitSpanProcessor(_ context.Context, processor telemetry.SpanProcessor) (sdktrace.SpanProcessor, error) { - if processor.Batch != nil { - if processor.Batch.Exporter.Console != nil { - exp, err := stdouttrace.New( - stdouttrace.WithPrettyPrint(), - ) - if err != nil { - return nil, err - } - opts := []sdktrace.BatchSpanProcessorOption{} - if processor.Batch.ExportTimeout != nil { - if *processor.Batch.ExportTimeout < 0 { - return nil, fmt.Errorf("invalid export timeout %d", *processor.Batch.ExportTimeout) - } - opts = append(opts, sdktrace.WithExportTimeout(time.Millisecond*time.Duration(*processor.Batch.ExportTimeout))) - } - if processor.Batch.MaxExportBatchSize != nil { - if *processor.Batch.MaxExportBatchSize < 0 { - return nil, fmt.Errorf("invalid batch size %d", *processor.Batch.MaxExportBatchSize) - } - opts = append(opts, sdktrace.WithMaxExportBatchSize(*processor.Batch.MaxExportBatchSize)) - } - if processor.Batch.MaxQueueSize != nil { - if *processor.Batch.MaxQueueSize < 0 { - return nil, fmt.Errorf("invalid queue size %d", *processor.Batch.MaxQueueSize) - } - opts = append(opts, sdktrace.WithMaxQueueSize(*processor.Batch.MaxQueueSize)) - } - if processor.Batch.ScheduleDelay != nil { - if *processor.Batch.ScheduleDelay < 0 { - return nil, fmt.Errorf("invalid schedule delay %d", *processor.Batch.ScheduleDelay) - } - opts = append(opts, sdktrace.WithBatchTimeout(time.Millisecond*time.Duration(*processor.Batch.ScheduleDelay))) - } - return sdktrace.NewBatchSpanProcessor(exp, opts...), nil - } - return nil, errNoValidSpanExporter - } - return nil, fmt.Errorf("unsupported span processor type %v", processor) -} - -func InitTracerProvider(res *resource.Resource, options []sdktrace.TracerProviderOption) (*sdktrace.TracerProvider, error) { - opts := []sdktrace.TracerProviderOption{ - sdktrace.WithResource(res), - } - - opts = append(opts, options...) - return sdktrace.NewTracerProvider(opts...), nil -} - func InitOpenTelemetry(res *resource.Resource, options []sdkmetric.Option, disableHighCardinality bool) (*sdkmetric.MeterProvider, error) { opts := []sdkmetric.Option{ sdkmetric.WithResource(res), diff --git a/service/internal/proctelemetry/config_test.go b/service/internal/proctelemetry/config_test.go index 1a1fec4e4b6..3009b130457 100644 --- a/service/internal/proctelemetry/config_test.go +++ b/service/internal/proctelemetry/config_test.go @@ -344,94 +344,3 @@ func TestMetricReader(t *testing.T) { }) } } - -func TestSpanProcessor(t *testing.T) { - testCases := []struct { - name string - processor telemetry.SpanProcessor - args any - err error - }{ - { - name: "no processor", - err: errors.New("unsupported span processor type { }"), - }, - { - name: "batch processor invalid exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - Exporter: telemetry.SpanExporter{}, - }, - }, - err: errNoValidSpanExporter, - }, - { - name: "batch processor invalid batch size console exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - MaxExportBatchSize: intPtr(-1), - Exporter: telemetry.SpanExporter{ - Console: telemetry.Console{}, - }, - }, - }, - err: errors.New("invalid batch size -1"), - }, - { - name: "batch processor invalid export timeout console exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - ExportTimeout: intPtr(-2), - Exporter: telemetry.SpanExporter{ - Console: telemetry.Console{}, - }, - }, - }, - err: errors.New("invalid export timeout -2"), - }, - { - name: "batch processor invalid queue size console exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - MaxQueueSize: intPtr(-3), - Exporter: telemetry.SpanExporter{ - Console: telemetry.Console{}, - }, - }, - }, - err: errors.New("invalid queue size -3"), - }, - { - name: "batch processor invalid schedule delay console exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - ScheduleDelay: intPtr(-4), - Exporter: telemetry.SpanExporter{ - Console: telemetry.Console{}, - }, - }, - }, - err: errors.New("invalid schedule delay -4"), - }, - { - name: "batch processor console exporter", - processor: telemetry.SpanProcessor{ - Batch: &telemetry.BatchSpanProcessor{ - MaxExportBatchSize: intPtr(0), - ExportTimeout: intPtr(0), - MaxQueueSize: intPtr(0), - ScheduleDelay: intPtr(0), - Exporter: telemetry.SpanExporter{ - Console: telemetry.Console{}, - }, - }, - }, - }, - } - for _, tt := range testCases { - t.Run(tt.name, func(t *testing.T) { - _, err := InitSpanProcessor(context.Background(), tt.processor) - assert.Equal(t, tt.err, err) - }) - } -} diff --git a/service/internal/resource/config.go b/service/internal/resource/config.go new file mode 100644 index 00000000000..1f233ddde97 --- /dev/null +++ b/service/internal/resource/config.go @@ -0,0 +1,44 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package resource // import "go.opentelemetry.io/collector/service/internal/resource" + +import ( + "github.com/google/uuid" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/resource" + + "go.opentelemetry.io/collector/component" + semconv "go.opentelemetry.io/collector/semconv/v1.18.0" +) + +// New resource from telemetry configuration. +func New(buildInfo component.BuildInfo, resourceCfg map[string]*string) *resource.Resource { + var telAttrs []attribute.KeyValue + + for k, v := range resourceCfg { + // nil value indicates that the attribute should not be included in the telemetry. + if v != nil { + telAttrs = append(telAttrs, attribute.String(k, *v)) + } + } + + if _, ok := resourceCfg[semconv.AttributeServiceName]; !ok { + // AttributeServiceName is not specified in the config. Use the default service name. + telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceName, buildInfo.Command)) + } + + if _, ok := resourceCfg[semconv.AttributeServiceInstanceID]; !ok { + // AttributeServiceInstanceID is not specified in the config. Auto-generate one. + instanceUUID, _ := uuid.NewRandom() + instanceID := instanceUUID.String() + telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceInstanceID, instanceID)) + } + + if _, ok := resourceCfg[semconv.AttributeServiceVersion]; !ok { + // AttributeServiceVersion is not specified in the config. Use the actual + // build version. + telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceVersion, buildInfo.Version)) + } + return resource.NewWithAttributes(semconv.SchemaURL, telAttrs...) +} diff --git a/service/service.go b/service/service.go index 318f99a868c..980a807aa59 100644 --- a/service/service.go +++ b/service/service.go @@ -8,10 +8,7 @@ import ( "fmt" "runtime" - "github.com/google/uuid" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/sdk/resource" + sdkresource "go.opentelemetry.io/otel/sdk/resource" "go.uber.org/multierr" "go.uber.org/zap" @@ -24,10 +21,10 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/receiver" - semconv "go.opentelemetry.io/collector/semconv/v1.18.0" "go.opentelemetry.io/collector/service/extensions" "go.opentelemetry.io/collector/service/internal/graph" "go.opentelemetry.io/collector/service/internal/proctelemetry" + "go.opentelemetry.io/collector/service/internal/resource" "go.opentelemetry.io/collector/service/telemetry" ) @@ -95,25 +92,24 @@ func New(ctx context.Context, set Settings, cfg Config) (*Service, error) { if err != nil { return nil, fmt.Errorf("failed to get logger: %w", err) } - res := buildResource(set.BuildInfo, cfg.Telemetry) + res := resource.New(set.BuildInfo, cfg.Telemetry.Resource) pcommonRes := pdataFromSdk(res) + logger := srv.telemetry.Logger() + if err = srv.telemetryInitializer.initMetrics(res, logger, cfg.Telemetry, set.AsyncErrorChannel); err != nil { + return nil, fmt.Errorf("failed to initialize telemetry: %w", err) + } + srv.telemetrySettings = component.TelemetrySettings{ - Logger: srv.telemetry.Logger(), + Logger: logger, TracerProvider: srv.telemetry.TracerProvider(), - MeterProvider: noop.NewMeterProvider(), + MeterProvider: srv.telemetryInitializer.mp, MetricsLevel: cfg.Telemetry.Metrics.Level, // Construct telemetry attributes from build info and config's resource attributes. Resource: pcommonRes, } - if err = srv.telemetryInitializer.init(res, srv.telemetrySettings, cfg.Telemetry, set.AsyncErrorChannel); err != nil { - return nil, fmt.Errorf("failed to initialize telemetry: %w", err) - } - srv.telemetrySettings.MeterProvider = srv.telemetryInitializer.mp - srv.telemetrySettings.TracerProvider = srv.telemetryInitializer.tp - // process the configuration and initialize the pipeline if err = srv.initExtensionsAndPipeline(ctx, set, cfg); err != nil { // If pipeline initialization fails then shut down the telemetry server @@ -231,37 +227,7 @@ func getBallastSize(host component.Host) uint64 { return 0 } -func buildResource(buildInfo component.BuildInfo, cfg telemetry.Config) *resource.Resource { - var telAttrs []attribute.KeyValue - - for k, v := range cfg.Resource { - // nil value indicates that the attribute should not be included in the telemetry. - if v != nil { - telAttrs = append(telAttrs, attribute.String(k, *v)) - } - } - - if _, ok := cfg.Resource[semconv.AttributeServiceName]; !ok { - // AttributeServiceName is not specified in the config. Use the default service name. - telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceName, buildInfo.Command)) - } - - if _, ok := cfg.Resource[semconv.AttributeServiceInstanceID]; !ok { - // AttributeServiceInstanceID is not specified in the config. Auto-generate one. - instanceUUID, _ := uuid.NewRandom() - instanceID := instanceUUID.String() - telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceInstanceID, instanceID)) - } - - if _, ok := cfg.Resource[semconv.AttributeServiceVersion]; !ok { - // AttributeServiceVersion is not specified in the config. Use the actual - // build version. - telAttrs = append(telAttrs, attribute.String(semconv.AttributeServiceVersion, buildInfo.Version)) - } - return resource.NewWithAttributes(semconv.SchemaURL, telAttrs...) -} - -func pdataFromSdk(res *resource.Resource) pcommon.Resource { +func pdataFromSdk(res *sdkresource.Resource) pcommon.Resource { // pcommon.NewResource is the best way to generate a new resource currently and is safe to use outside of tests. // Because the resource is signal agnostic, and we need a net new resource, not an existing one, this is the only // method of creating it without exposing internal packages. diff --git a/service/telemetry.go b/service/telemetry.go index 70fe22bc637..29e3ead6adb 100644 --- a/service/telemetry.go +++ b/service/telemetry.go @@ -5,7 +5,6 @@ package service // import "go.opentelemetry.io/collector/service" import ( "context" - "errors" "net" "net/http" "strconv" @@ -17,19 +16,13 @@ import ( ocmetric "go.opencensus.io/metric" "go.opencensus.io/metric/metricproducer" "go.opencensus.io/stats/view" - "go.opentelemetry.io/contrib/propagators/b3" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" noopmetric "go.opentelemetry.io/otel/metric/noop" - "go.opentelemetry.io/otel/propagation" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/trace" "go.uber.org/multierr" "go.uber.org/zap" - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/internal/obsreportconfig" "go.opentelemetry.io/collector/service/internal/proctelemetry" @@ -39,21 +32,12 @@ import ( const ( zapKeyTelemetryAddress = "address" zapKeyTelemetryLevel = "level" - - // supported trace propagators - traceContextPropagator = "tracecontext" - b3Propagator = "b3" -) - -var ( - errUnsupportedPropagator = errors.New("unsupported trace propagator") ) type telemetryInitializer struct { views []*view.View ocRegistry *ocmetric.Registry mp metric.MeterProvider - tp trace.TracerProvider servers []*http.Server useOtel bool @@ -64,53 +48,24 @@ type telemetryInitializer struct { func newColTelemetry(useOtel bool, disableHighCardinality bool, extendedConfig bool) *telemetryInitializer { return &telemetryInitializer{ mp: noopmetric.NewMeterProvider(), - tp: trace.NewNoopTracerProvider(), useOtel: useOtel, disableHighCardinality: disableHighCardinality, extendedConfig: extendedConfig, } } -func (tel *telemetryInitializer) init(res *resource.Resource, settings component.TelemetrySettings, cfg telemetry.Config, asyncErrorChannel chan error) error { +func (tel *telemetryInitializer) initMetrics(res *resource.Resource, logger *zap.Logger, cfg telemetry.Config, asyncErrorChannel chan error) error { if cfg.Metrics.Level == configtelemetry.LevelNone || (cfg.Metrics.Address == "" && len(cfg.Metrics.Readers) == 0) { - settings.Logger.Info( - "Skipping telemetry setup.", + logger.Info( + "Skipping telemetry metrics setup.", zap.String(zapKeyTelemetryAddress, cfg.Metrics.Address), zap.String(zapKeyTelemetryLevel, cfg.Metrics.Level.String()), ) return nil } - settings.Logger.Info("Setting up own telemetry...") - - if tp, err := tel.initTraces(res, cfg); err == nil { - tel.tp = tp - } else { - return err - } - - if tp, err := textMapPropagatorFromConfig(cfg.Traces.Propagators); err == nil { - otel.SetTextMapPropagator(tp) - } else { - return err - } - - return tel.initMetrics(res, settings.Logger, cfg, asyncErrorChannel) -} - -func (tel *telemetryInitializer) initTraces(res *resource.Resource, cfg telemetry.Config) (trace.TracerProvider, error) { - opts := []sdktrace.TracerProviderOption{} - for _, processor := range cfg.Traces.Processors { - sp, err := proctelemetry.InitSpanProcessor(context.Background(), processor) - if err != nil { - return nil, err - } - opts = append(opts, sdktrace.WithSpanProcessor(sp)) - } - return proctelemetry.InitTracerProvider(res, opts) -} + logger.Info("Setting up metrics telemetry...") -func (tel *telemetryInitializer) initMetrics(res *resource.Resource, logger *zap.Logger, cfg telemetry.Config, asyncErrorChannel chan error) error { // Initialize the ocRegistry, still used by the process metrics. tel.ocRegistry = ocmetric.NewRegistry() if !tel.useOtel && !tel.extendedConfig { @@ -229,18 +184,3 @@ func sanitizePrometheusKey(str string) string { } return strings.Map(runeFilterMap, str) } - -func textMapPropagatorFromConfig(props []string) (propagation.TextMapPropagator, error) { - var textMapPropagators []propagation.TextMapPropagator - for _, prop := range props { - switch prop { - case traceContextPropagator: - textMapPropagators = append(textMapPropagators, propagation.TraceContext{}) - case b3Propagator: - textMapPropagators = append(textMapPropagators, b3.New()) - default: - return nil, errUnsupportedPropagator - } - } - return propagation.NewCompositeTextMapPropagator(textMapPropagators...), nil -} diff --git a/service/telemetry/span_processor.go b/service/telemetry/span_processor.go new file mode 100644 index 00000000000..adb78c8a3ec --- /dev/null +++ b/service/telemetry/span_processor.go @@ -0,0 +1,57 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry // import "go.opentelemetry.io/collector/service/telemetry" + +import ( + "context" + "errors" + "fmt" + "time" + + "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + sdktrace "go.opentelemetry.io/otel/sdk/trace" +) + +var errNoValidSpanExporter = errors.New("no valid span exporter") + +func newSpanProcessor(_ context.Context, processor SpanProcessor) (sdktrace.SpanProcessor, error) { + if processor.Batch != nil { + if processor.Batch.Exporter.Console != nil { + exp, err := stdouttrace.New( + stdouttrace.WithPrettyPrint(), + ) + if err != nil { + return nil, err + } + opts := []sdktrace.BatchSpanProcessorOption{} + if processor.Batch.ExportTimeout != nil { + if *processor.Batch.ExportTimeout < 0 { + return nil, fmt.Errorf("invalid export timeout %d", *processor.Batch.ExportTimeout) + } + opts = append(opts, sdktrace.WithExportTimeout(time.Millisecond*time.Duration(*processor.Batch.ExportTimeout))) + } + if processor.Batch.MaxExportBatchSize != nil { + if *processor.Batch.MaxExportBatchSize < 0 { + return nil, fmt.Errorf("invalid batch size %d", *processor.Batch.MaxExportBatchSize) + } + opts = append(opts, sdktrace.WithMaxExportBatchSize(*processor.Batch.MaxExportBatchSize)) + } + if processor.Batch.MaxQueueSize != nil { + if *processor.Batch.MaxQueueSize < 0 { + return nil, fmt.Errorf("invalid queue size %d", *processor.Batch.MaxQueueSize) + } + opts = append(opts, sdktrace.WithMaxQueueSize(*processor.Batch.MaxQueueSize)) + } + if processor.Batch.ScheduleDelay != nil { + if *processor.Batch.ScheduleDelay < 0 { + return nil, fmt.Errorf("invalid schedule delay %d", *processor.Batch.ScheduleDelay) + } + opts = append(opts, sdktrace.WithBatchTimeout(time.Millisecond*time.Duration(*processor.Batch.ScheduleDelay))) + } + return sdktrace.NewBatchSpanProcessor(exp, opts...), nil + } + return nil, errNoValidSpanExporter + } + return nil, fmt.Errorf("unsupported span processor type %v", processor) +} diff --git a/service/telemetry/span_processor_test.go b/service/telemetry/span_processor_test.go new file mode 100644 index 00000000000..6d3ab46015d --- /dev/null +++ b/service/telemetry/span_processor_test.go @@ -0,0 +1,107 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func intPtr(i int) *int { + return &i +} + +func TestSpanProcessor(t *testing.T) { + testCases := []struct { + name string + processor SpanProcessor + args any + err error + }{ + { + name: "no processor", + err: errors.New("unsupported span processor type { }"), + }, + { + name: "batch processor invalid exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + Exporter: SpanExporter{}, + }, + }, + err: errNoValidSpanExporter, + }, + { + name: "batch processor invalid batch size console exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + MaxExportBatchSize: intPtr(-1), + Exporter: SpanExporter{ + Console: Console{}, + }, + }, + }, + err: errors.New("invalid batch size -1"), + }, + { + name: "batch processor invalid export timeout console exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + ExportTimeout: intPtr(-2), + Exporter: SpanExporter{ + Console: Console{}, + }, + }, + }, + err: errors.New("invalid export timeout -2"), + }, + { + name: "batch processor invalid queue size console exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + MaxQueueSize: intPtr(-3), + Exporter: SpanExporter{ + Console: Console{}, + }, + }, + }, + err: errors.New("invalid queue size -3"), + }, + { + name: "batch processor invalid schedule delay console exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + ScheduleDelay: intPtr(-4), + Exporter: SpanExporter{ + Console: Console{}, + }, + }, + }, + err: errors.New("invalid schedule delay -4"), + }, + { + name: "batch processor console exporter", + processor: SpanProcessor{ + Batch: &BatchSpanProcessor{ + MaxExportBatchSize: intPtr(0), + ExportTimeout: intPtr(0), + MaxQueueSize: intPtr(0), + ScheduleDelay: intPtr(0), + Exporter: SpanExporter{ + Console: Console{}, + }, + }, + }, + }, + } + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + _, err := newSpanProcessor(context.Background(), tt.processor) + assert.Equal(t, tt.err, err) + }) + } +} diff --git a/service/telemetry/telemetry.go b/service/telemetry/telemetry.go index 00f9db630b0..2eff4ab9ac4 100644 --- a/service/telemetry/telemetry.go +++ b/service/telemetry/telemetry.go @@ -6,6 +6,7 @@ package telemetry // import "go.opentelemetry.io/collector/service/telemetry" import ( "context" + "go.opentelemetry.io/collector/component" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" "go.uber.org/multierr" @@ -35,19 +36,21 @@ func (t *Telemetry) Shutdown(ctx context.Context) error { // Settings holds configuration for building Telemetry. type Settings struct { + BuildInfo component.BuildInfo ZapOptions []zap.Option } // New creates a new Telemetry from Config. -func New(_ context.Context, set Settings, cfg Config) (*Telemetry, error) { +func New(ctx context.Context, set Settings, cfg Config) (*Telemetry, error) { logger, err := newLogger(cfg.Logs, set.ZapOptions) if err != nil { return nil, err } - tp := sdktrace.NewTracerProvider( - // needed for supporting the zpages extension - sdktrace.WithSampler(alwaysRecord()), - ) + tp, err := newTracerProvider(ctx, set, cfg) + if err != nil { + return nil, err + } + return &Telemetry{ logger: logger, tracerProvider: tp, diff --git a/service/telemetry/tracer_provider.go b/service/telemetry/tracer_provider.go new file mode 100644 index 00000000000..c56d578c905 --- /dev/null +++ b/service/telemetry/tracer_provider.go @@ -0,0 +1,65 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry // import "go.opentelemetry.io/collector/service/telemetry" + +import ( + "context" + "errors" + + "go.opentelemetry.io/contrib/propagators/b3" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/propagation" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + + "go.opentelemetry.io/collector/service/internal/resource" +) + +const ( + // supported trace propagators + traceContextPropagator = "tracecontext" + b3Propagator = "b3" +) + +var ( + errUnsupportedPropagator = errors.New("unsupported trace propagator") +) + +func textMapPropagatorFromConfig(props []string) (propagation.TextMapPropagator, error) { + var textMapPropagators []propagation.TextMapPropagator + for _, prop := range props { + switch prop { + case traceContextPropagator: + textMapPropagators = append(textMapPropagators, propagation.TraceContext{}) + case b3Propagator: + textMapPropagators = append(textMapPropagators, b3.New()) + default: + return nil, errUnsupportedPropagator + } + } + return propagation.NewCompositeTextMapPropagator(textMapPropagators...), nil +} + +func newTracerProvider(ctx context.Context, set Settings, cfg Config) (*sdktrace.TracerProvider, error) { + res := resource.New(set.BuildInfo, cfg.Resource) + opts := []sdktrace.TracerProviderOption{ + sdktrace.WithResource(res), + // needed for supporting the zpages extension + sdktrace.WithSampler(alwaysRecord()), + } + for _, processor := range cfg.Traces.Processors { + sp, err := newSpanProcessor(ctx, processor) + if err != nil { + return nil, err + } + opts = append(opts, sdktrace.WithSpanProcessor(sp)) + } + + if tp, err := textMapPropagatorFromConfig(cfg.Traces.Propagators); err == nil { + otel.SetTextMapPropagator(tp) + } else { + return nil, err + } + + return sdktrace.NewTracerProvider(opts...), nil +} diff --git a/service/telemetry_test.go b/service/telemetry_test.go index a4144e27890..daf2cb760be 100644 --- a/service/telemetry_test.go +++ b/service/telemetry_test.go @@ -23,6 +23,7 @@ import ( "go.opentelemetry.io/collector/internal/testutil" semconv "go.opentelemetry.io/collector/semconv/v1.18.0" "go.opentelemetry.io/collector/service/internal/proctelemetry" + "go.opentelemetry.io/collector/service/internal/resource" "go.opentelemetry.io/collector/service/telemetry" ) @@ -40,7 +41,7 @@ func TestBuildResource(t *testing.T) { // Check default config cfg := telemetry.Config{} - otelRes := buildResource(buildInfo, cfg) + otelRes := resource.New(buildInfo, cfg.Resource) res := pdataFromSdk(otelRes) assert.Equal(t, res.Attributes().Len(), 3) @@ -62,7 +63,7 @@ func TestBuildResource(t *testing.T) { semconv.AttributeServiceInstanceID: nil, }, } - otelRes = buildResource(buildInfo, cfg) + otelRes = resource.New(buildInfo, cfg.Resource) res = pdataFromSdk(otelRes) // Attributes should not exist since we nil-ified all. @@ -77,7 +78,7 @@ func TestBuildResource(t *testing.T) { semconv.AttributeServiceInstanceID: strPtr("c"), }, } - otelRes = buildResource(buildInfo, cfg) + otelRes = resource.New(buildInfo, cfg.Resource) res = pdataFromSdk(otelRes) assert.Equal(t, res.Attributes().Len(), 3) @@ -270,13 +271,8 @@ func TestTelemetryInit(t *testing.T) { }, } } - otelRes := buildResource(buildInfo, *tc.cfg) - res := pdataFromSdk(otelRes) - settings := component.TelemetrySettings{ - Logger: zap.NewNop(), - Resource: res, - } - err := tel.init(otelRes, settings, *tc.cfg, make(chan error)) + otelRes := resource.New(buildInfo, tc.cfg.Resource) + err := tel.initMetrics(otelRes, zap.NewNop(), *tc.cfg, make(chan error)) require.NoError(t, err) defer func() { require.NoError(t, tel.shutdown()) From 9842b6ed2c0ece34b19009f0f496f95ddec7eba8 Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Thu, 3 Aug 2023 19:20:59 +0200 Subject: [PATCH 2/6] make gotidy --- exporter/otlpexporter/go.mod | 4 ++++ exporter/otlpexporter/go.sum | 6 ++++++ exporter/otlphttpexporter/go.mod | 4 ++++ exporter/otlphttpexporter/go.sum | 5 +++++ extension/zpagesextension/go.mod | 4 ++++ extension/zpagesextension/go.sum | 6 ++++++ receiver/otlpreceiver/go.mod | 3 +++ receiver/otlpreceiver/go.sum | 6 ++++++ 8 files changed, 38 insertions(+) diff --git a/exporter/otlpexporter/go.mod b/exporter/otlpexporter/go.mod index e650be2e88a..c3b97bb444d 100644 --- a/exporter/otlpexporter/go.mod +++ b/exporter/otlpexporter/go.mod @@ -30,6 +30,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/knadh/koanf v1.5.0 // indirect @@ -50,8 +51,11 @@ require ( go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 // indirect go.opentelemetry.io/collector/processor v0.82.0 // indirect go.opentelemetry.io/collector/receiver v0.82.0 // indirect + go.opentelemetry.io/collector/semconv v0.82.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/trace v1.16.0 // indirect diff --git a/exporter/otlpexporter/go.sum b/exporter/otlpexporter/go.sum index 497d1ad304c..61d5d2db52a 100644 --- a/exporter/otlpexporter/go.sum +++ b/exporter/otlpexporter/go.sum @@ -117,6 +117,8 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= @@ -290,9 +292,13 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17 h1:mdcNStUIXngF/mH3xxAo4nbR4g65IXqLL1SvYMjz7JQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17/go.mod h1:N2Nw/UmmvQn0yCnaUzvsWzTWIeffYIdFteg6mxqCWII= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= diff --git a/exporter/otlphttpexporter/go.mod b/exporter/otlphttpexporter/go.mod index 570030c81ca..2550edbaafe 100644 --- a/exporter/otlphttpexporter/go.mod +++ b/exporter/otlphttpexporter/go.mod @@ -32,6 +32,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/knadh/koanf v1.5.0 // indirect @@ -54,9 +55,12 @@ require ( go.opentelemetry.io/collector/extension/auth v0.82.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 // indirect go.opentelemetry.io/collector/processor v0.82.0 // indirect + go.opentelemetry.io/collector/semconv v0.82.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/trace v1.16.0 // indirect diff --git a/exporter/otlphttpexporter/go.sum b/exporter/otlphttpexporter/go.sum index d2d4c81e0e2..6d25cb8dac0 100644 --- a/exporter/otlphttpexporter/go.sum +++ b/exporter/otlphttpexporter/go.sum @@ -728,6 +728,7 @@ github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3 github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= @@ -969,9 +970,13 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17/go.mod h1:N2Nw/UmmvQn0yCnaUzvsWzTWIeffYIdFteg6mxqCWII= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= diff --git a/extension/zpagesextension/go.mod b/extension/zpagesextension/go.mod index 8b873e17b04..ed5e84046f9 100644 --- a/extension/zpagesextension/go.mod +++ b/extension/zpagesextension/go.mod @@ -21,6 +21,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/knadh/koanf v1.5.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -31,7 +32,10 @@ require ( go.opentelemetry.io/collector/config/configtelemetry v0.82.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 // indirect go.opentelemetry.io/collector/pdata v1.0.0-rcv0014 // indirect + go.opentelemetry.io/collector/semconv v0.82.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/extension/zpagesextension/go.sum b/extension/zpagesextension/go.sum index 0d3125ffc94..400c7f532df 100644 --- a/extension/zpagesextension/go.sum +++ b/extension/zpagesextension/go.sum @@ -100,6 +100,8 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= @@ -256,10 +258,14 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3 go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/contrib/zpages v0.42.0 h1:hFscXKQ9PTjyIVmAr6zIV8cMoiEeR9lPIwPVqHi8+5Q= go.opentelemetry.io/contrib/zpages v0.42.0/go.mod h1:qRJBEfB0iwRKrYImq5qfwTolmY8HXvZBRucvhuTVQZw= go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= diff --git a/receiver/otlpreceiver/go.mod b/receiver/otlpreceiver/go.mod index 067261fe0b0..96563d60105 100644 --- a/receiver/otlpreceiver/go.mod +++ b/receiver/otlpreceiver/go.mod @@ -39,6 +39,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf v1.5.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect @@ -68,8 +69,10 @@ require ( go.opentelemetry.io/collector/processor v0.82.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect go.opentelemetry.io/otel v1.16.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.39.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/otel/sdk v1.16.0 // indirect go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect diff --git a/receiver/otlpreceiver/go.sum b/receiver/otlpreceiver/go.sum index dabaaa06029..ae721bfb1b0 100644 --- a/receiver/otlpreceiver/go.sum +++ b/receiver/otlpreceiver/go.sum @@ -187,6 +187,8 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -395,10 +397,14 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.1-0.20230612162650-64be7e574a17/go.mod h1:N2Nw/UmmvQn0yCnaUzvsWzTWIeffYIdFteg6mxqCWII= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= go.opentelemetry.io/otel/exporters/prometheus v0.39.0/go.mod h1:4jo5Q4CROlCpSPsXLhymi+LYrDXd2ObU5wbKayfZs7Y= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= From a3ce7682667abdc09d7b4206570884c61f3ee05c Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Fri, 11 Aug 2023 12:53:23 +0200 Subject: [PATCH 3/6] make fmt --- service/telemetry/telemetry.go | 1 + 1 file changed, 1 insertion(+) diff --git a/service/telemetry/telemetry.go b/service/telemetry/telemetry.go index 2eff4ab9ac4..07e460559f9 100644 --- a/service/telemetry/telemetry.go +++ b/service/telemetry/telemetry.go @@ -7,6 +7,7 @@ import ( "context" "go.opentelemetry.io/collector/component" + sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" "go.uber.org/multierr" From 632c29f36d3326a0345044dae75e60129499d993 Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Fri, 11 Aug 2023 13:04:44 +0200 Subject: [PATCH 4/6] Fix imports order --- service/telemetry/telemetry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/telemetry/telemetry.go b/service/telemetry/telemetry.go index 07e460559f9..509902c9640 100644 --- a/service/telemetry/telemetry.go +++ b/service/telemetry/telemetry.go @@ -6,13 +6,13 @@ package telemetry // import "go.opentelemetry.io/collector/service/telemetry" import ( "context" - "go.opentelemetry.io/collector/component" - sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" "go.uber.org/multierr" "go.uber.org/zap" "go.uber.org/zap/zapcore" + + "go.opentelemetry.io/collector/component" ) type Telemetry struct { From 7c3f0482273bb1f2dfe928cafdf197a7dffd82fc Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Tue, 29 Aug 2023 17:03:02 +0200 Subject: [PATCH 5/6] Move things around and expose as part of public API to avoid duplication --- service/internal/proctelemetry/config.go | 20 ++++---------------- service/telemetry/config.go | 8 ++++++++ service/telemetry/span_processor.go | 17 ++++++----------- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/service/internal/proctelemetry/config.go b/service/internal/proctelemetry/config.go index 9026342afa5..6d3b72cf5d0 100644 --- a/service/internal/proctelemetry/config.go +++ b/service/internal/proctelemetry/config.go @@ -11,7 +11,6 @@ import ( "net/http" "net/url" "os" - "strings" "time" "github.com/prometheus/client_golang/prometheus" @@ -39,10 +38,6 @@ const ( // http Instrumentation Name HTTPInstrumentation = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - - // supported protocols - protocolProtobufHTTP = "http/protobuf" - protocolProtobufGRPC = "grpc/protobuf" ) var ( @@ -197,9 +192,9 @@ func initPeriodicExporter(ctx context.Context, exporter telemetry.MetricExporter var err error var exp sdkmetric.Exporter switch exporter.Otlp.Protocol { - case protocolProtobufHTTP: + case telemetry.ProtocolProtobufHTTP: exp, err = initOTLPHTTPExporter(ctx, exporter.Otlp) - case protocolProtobufGRPC: + case telemetry.ProtocolProtobufGRPC: exp, err = initOTLPgRPCExporter(ctx, exporter.Otlp) default: return nil, nil, fmt.Errorf("unsupported protocol %s", exporter.Otlp.Protocol) @@ -212,18 +207,11 @@ func initPeriodicExporter(ctx context.Context, exporter telemetry.MetricExporter return nil, nil, errNoValidMetricExporter } -func normalizeEndpoint(endpoint string) string { - if !strings.HasPrefix(endpoint, "https://") && !strings.HasPrefix(endpoint, "http://") { - return fmt.Sprintf("http://%s", endpoint) - } - return endpoint -} - func initOTLPgRPCExporter(ctx context.Context, otlpConfig *telemetry.OtlpMetric) (sdkmetric.Exporter, error) { opts := []otlpmetricgrpc.Option{} if len(otlpConfig.Endpoint) > 0 { - u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint)) + u, err := url.ParseRequestURI(telemetry.NormalizeEndpoint(otlpConfig.Endpoint)) if err != nil { return nil, err } @@ -257,7 +245,7 @@ func initOTLPHTTPExporter(ctx context.Context, otlpConfig *telemetry.OtlpMetric) opts := []otlpmetrichttp.Option{} if len(otlpConfig.Endpoint) > 0 { - u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint)) + u, err := url.ParseRequestURI(telemetry.NormalizeEndpoint(otlpConfig.Endpoint)) if err != nil { return nil, err } diff --git a/service/telemetry/config.go b/service/telemetry/config.go index 514ae03278a..ef28031f9ef 100644 --- a/service/telemetry/config.go +++ b/service/telemetry/config.go @@ -13,6 +13,14 @@ import ( "go.opentelemetry.io/collector/internal/obsreportconfig" ) +// supported protocols for exporters +const ( + // ProtocolProtobufHTTP is the OTLP/HTTP with Protobuf encoding protocol + ProtocolProtobufHTTP = "http/protobuf" + // ProtocolProtobufGRPC is the OTLP/gRPC protocol + ProtocolProtobufGRPC = "grpc/protobuf" +) + // Config defines the configurable settings for service telemetry. type Config struct { Logs LogsConfig `mapstructure:"logs"` diff --git a/service/telemetry/span_processor.go b/service/telemetry/span_processor.go index c0ec90ed58e..9e0147a8b2b 100644 --- a/service/telemetry/span_processor.go +++ b/service/telemetry/span_processor.go @@ -19,13 +19,8 @@ import ( var errNoValidSpanExporter = errors.New("no valid span exporter") -const ( - // supported protocols - protocolProtobufHTTP = "http/protobuf" - protocolProtobufGRPC = "grpc/protobuf" -) - -func normalizeEndpoint(endpoint string) string { +// NormalizeEndpoint takes an HTTP(s) endpoint and adds the protocol prefix if missing. +func NormalizeEndpoint(endpoint string) string { if !strings.HasPrefix(endpoint, "https://") && !strings.HasPrefix(endpoint, "http://") { return fmt.Sprintf("http://%s", endpoint) } @@ -36,7 +31,7 @@ func initOTLPgRPCSpanExporter(ctx context.Context, otlpConfig *Otlp) (sdktrace.S opts := []otlptracegrpc.Option{} if len(otlpConfig.Endpoint) > 0 { - u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint)) + u, err := url.ParseRequestURI(NormalizeEndpoint(otlpConfig.Endpoint)) if err != nil { return nil, err } @@ -70,7 +65,7 @@ func initOTLPHTTPSpanExporter(ctx context.Context, otlpConfig *Otlp) (sdktrace.S opts := []otlptracehttp.Option{} if len(otlpConfig.Endpoint) > 0 { - u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint)) + u, err := url.ParseRequestURI(NormalizeEndpoint(otlpConfig.Endpoint)) if err != nil { return nil, err } @@ -148,9 +143,9 @@ func newSpanProcessor(ctx context.Context, processor SpanProcessor) (sdktrace.Sp var err error var exp sdktrace.SpanExporter switch processor.Batch.Exporter.Otlp.Protocol { - case protocolProtobufHTTP: + case ProtocolProtobufHTTP: exp, err = initOTLPHTTPSpanExporter(ctx, processor.Batch.Exporter.Otlp) - case protocolProtobufGRPC: + case ProtocolProtobufGRPC: exp, err = initOTLPgRPCSpanExporter(ctx, processor.Batch.Exporter.Otlp) default: return nil, fmt.Errorf("unsupported protocol %q", processor.Batch.Exporter.Otlp.Protocol) From f4d43a66e75a33bd0fd6a5889022641dfd12fb19 Mon Sep 17 00:00:00 2001 From: Pablo Baeyens Date: Fri, 3 Nov 2023 11:45:09 +0100 Subject: [PATCH 6/6] Revert changes to internal/tools/go.mod --- internal/tools/go.mod | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/tools/go.mod b/internal/tools/go.mod index 1108737f048..a1a0662c3e2 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -1,8 +1,6 @@ module go.opentelemetry.io/collector/internal/tools -go 1.21 - -toolchain go1.21.0 +go 1.20 require ( github.com/a8m/envsubst v1.4.2