Skip to content

Commit cedaeaa

Browse files
authored
Improve telemetry.Settings (#6275)
## Which problem is this PR solving? - Part of #5633 ## Description of the changes - Rename `telemetry.Setting` to `telemetry.Settings` - Create helpers `NoopSettings()` and `FromOtelComponent()` - Remove `LeveledMeterProvider` which is deprecated in OTEL - Use `telset` in more places - Pull out `Initialize()` from `storage.Factory` ## How was this change tested? - CI ## Checklist - [ ] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [ ] I have signed all commits - [ ] I have added unit tests for the new functionality - [ ] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: Yuri Shkuro <[email protected]>
1 parent 0e397f1 commit cedaeaa

File tree

23 files changed

+382
-241
lines changed

23 files changed

+382
-241
lines changed

cmd/all-in-one/main.go

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ import (
1414

1515
"github.com/spf13/cobra"
1616
"github.com/spf13/viper"
17-
"go.opentelemetry.io/collector/config/configtelemetry"
18-
"go.opentelemetry.io/otel/metric"
19-
"go.opentelemetry.io/otel/metric/noop"
17+
noopmetric "go.opentelemetry.io/otel/metric/noop"
2018
_ "go.uber.org/automaxprocs"
2119
"go.uber.org/zap"
2220

@@ -95,8 +93,16 @@ by default uses only in-memory database.`,
9593
logger.Fatal("Failed to initialize tracer", zap.Error(err))
9694
}
9795

96+
baseTelset := telemetry.Settings{
97+
Logger: svc.Logger,
98+
TracerProvider: tracer.OTEL,
99+
Metrics: baseFactory,
100+
MeterProvider: noopmetric.NewMeterProvider(),
101+
ReportStatus: telemetry.HCAdapter(svc.HC()),
102+
}
103+
98104
storageFactory.InitFromViper(v, logger)
99-
if err := storageFactory.Initialize(baseFactory, logger); err != nil {
105+
if err := storageFactory.Initialize(baseTelset.Metrics, baseTelset.Logger); err != nil {
100106
logger.Fatal("Failed to init storage factory", zap.Error(err))
101107
}
102108

@@ -159,20 +165,13 @@ by default uses only in-memory database.`,
159165
log.Fatal(err)
160166
}
161167

162-
telset := telemetry.Setting{
163-
Logger: svc.Logger,
164-
TracerProvider: tracer.OTEL,
165-
Metrics: queryMetricsFactory,
166-
ReportStatus: telemetry.HCAdapter(svc.HC()),
167-
LeveledMeterProvider: func(_ configtelemetry.Level) metric.MeterProvider {
168-
return noop.NewMeterProvider()
169-
},
170-
}
171168
// query
169+
queryTelset := baseTelset // copy
170+
queryTelset.Metrics = queryMetricsFactory
172171
querySrv := startQuery(
173172
svc, qOpts, qOpts.BuildQueryServiceOptions(storageFactory, logger),
174173
spanReader, dependencyReader, metricsQueryService,
175-
tm, telset,
174+
tm, queryTelset,
176175
)
177176

178177
svc.RunAndThen(func() {
@@ -222,7 +221,7 @@ func startQuery(
222221
depReader dependencystore.Reader,
223222
metricsQueryService querysvc.MetricsQueryService,
224223
tm *tenancy.Manager,
225-
telset telemetry.Setting,
224+
telset telemetry.Settings,
226225
) *queryApp.Server {
227226
spanReader = spanstoremetrics.NewReaderDecorator(spanReader, telset.Metrics)
228227
qs := querysvc.NewQueryService(spanReader, depReader, *queryOpts)

cmd/collector/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/jaegertracing/jaeger/cmd/internal/status"
2525
"github.com/jaegertracing/jaeger/pkg/config"
2626
"github.com/jaegertracing/jaeger/pkg/metrics"
27+
"github.com/jaegertracing/jaeger/pkg/telemetry"
2728
"github.com/jaegertracing/jaeger/pkg/tenancy"
2829
"github.com/jaegertracing/jaeger/pkg/version"
2930
ss "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider"
@@ -63,8 +64,12 @@ func main() {
6364
metricsFactory := baseFactory.Namespace(metrics.NSOptions{Name: "collector"})
6465
version.NewInfoMetrics(metricsFactory)
6566

67+
baseTelset := telemetry.NoopSettings()
68+
baseTelset.Logger = svc.Logger
69+
baseTelset.Metrics = baseFactory
70+
6671
storageFactory.InitFromViper(v, logger)
67-
if err := storageFactory.Initialize(baseFactory, logger); err != nil {
72+
if err := storageFactory.Initialize(baseTelset.Metrics, baseTelset.Logger); err != nil {
6873
logger.Fatal("Failed to init storage factory", zap.Error(err))
6974
}
7075
spanWriter, err := storageFactory.CreateSpanWriter()

cmd/ingester/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/jaegertracing/jaeger/cmd/internal/status"
2424
"github.com/jaegertracing/jaeger/pkg/config"
2525
"github.com/jaegertracing/jaeger/pkg/metrics"
26+
"github.com/jaegertracing/jaeger/pkg/telemetry"
2627
"github.com/jaegertracing/jaeger/pkg/version"
2728
"github.com/jaegertracing/jaeger/plugin/storage"
2829
"github.com/jaegertracing/jaeger/ports"
@@ -50,8 +51,12 @@ func main() {
5051
metricsFactory := baseFactory.Namespace(metrics.NSOptions{Name: "ingester"})
5152
version.NewInfoMetrics(metricsFactory)
5253

54+
baseTelset := telemetry.NoopSettings()
55+
baseTelset.Logger = svc.Logger
56+
baseTelset.Metrics = baseFactory
57+
5358
storageFactory.InitFromViper(v, logger)
54-
if err := storageFactory.Initialize(baseFactory, logger); err != nil {
59+
if err := storageFactory.Initialize(baseTelset.Metrics, baseTelset.Logger); err != nil {
5560
logger.Fatal("Failed to init storage factory", zap.Error(err))
5661
}
5762
spanWriter, err := storageFactory.CreateSpanWriter()

cmd/jaeger/internal/extension/jaegerquery/server.go

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"fmt"
1010

1111
"go.opentelemetry.io/collector/component"
12-
"go.opentelemetry.io/collector/component/componentstatus"
1312
"go.opentelemetry.io/collector/extension"
1413
"go.opentelemetry.io/collector/extension/extensioncapabilities"
1514

@@ -53,9 +52,29 @@ func (*server) Dependencies() []component.ID {
5352
}
5453

5554
func (s *server) Start(ctx context.Context, host component.Host) error {
56-
mf := otelmetrics.NewFactory(s.telset.MeterProvider)
57-
baseFactory := mf.Namespace(metrics.NSOptions{Name: "jaeger"})
58-
queryMetricsFactory := baseFactory.Namespace(metrics.NSOptions{Name: "query"})
55+
// TODO OTel-collector does not initialize the tracer currently
56+
// https://github.com/open-telemetry/opentelemetry-collector/issues/7532
57+
//nolint
58+
tracerProvider, err := jtracer.New("jaeger")
59+
if err != nil {
60+
return fmt.Errorf("could not initialize a tracer: %w", err)
61+
}
62+
// make sure to close the tracer if subsequent code exists with error
63+
success := false
64+
defer func(ctx context.Context) {
65+
if success {
66+
s.closeTracer = tracerProvider.Close
67+
} else {
68+
tracerProvider.Close(ctx)
69+
}
70+
}(ctx)
71+
72+
telset := telemetry.FromOtelComponent(s.telset, host)
73+
telset.TracerProvider = tracerProvider.OTEL
74+
telset.Metrics = telset.Metrics.
75+
Namespace(metrics.NSOptions{Name: "jaeger"}).
76+
Namespace(metrics.NSOptions{Name: "query"})
77+
5978
f, err := jaegerstorage.GetStorageFactory(s.config.Storage.TracesPrimary, host)
6079
if err != nil {
6180
return fmt.Errorf("cannot find primary storage %s: %w", s.config.Storage.TracesPrimary, err)
@@ -66,7 +85,7 @@ func (s *server) Start(ctx context.Context, host component.Host) error {
6685
return fmt.Errorf("cannot create span reader: %w", err)
6786
}
6887

69-
spanReader = spanstoremetrics.NewReaderDecorator(spanReader, queryMetricsFactory)
88+
spanReader = spanstoremetrics.NewReaderDecorator(spanReader, telset.Metrics)
7089

7190
depReader, err := f.CreateDependencyReader()
7291
if err != nil {
@@ -86,25 +105,6 @@ func (s *server) Start(ctx context.Context, host component.Host) error {
86105

87106
tm := tenancy.NewManager(&s.config.Tenancy)
88107

89-
// TODO OTel-collector does not initialize the tracer currently
90-
// https://github.com/open-telemetry/opentelemetry-collector/issues/7532
91-
//nolint
92-
tracerProvider, err := jtracer.New("jaeger")
93-
if err != nil {
94-
return fmt.Errorf("could not initialize a tracer: %w", err)
95-
}
96-
s.closeTracer = tracerProvider.Close
97-
telset := telemetry.Setting{
98-
Logger: s.telset.Logger,
99-
TracerProvider: tracerProvider.OTEL,
100-
Metrics: queryMetricsFactory,
101-
ReportStatus: func(event *componentstatus.Event) {
102-
componentstatus.ReportStatus(host, event)
103-
},
104-
LeveledMeterProvider: s.telset.LeveledMeterProvider,
105-
Host: host,
106-
}
107-
108108
s.server, err = queryApp.NewServer(
109109
ctx,
110110
// TODO propagate healthcheck updates up to the collector's runtime
@@ -122,6 +122,7 @@ func (s *server) Start(ctx context.Context, host component.Host) error {
122122
return fmt.Errorf("could not start jaeger-query: %w", err)
123123
}
124124

125+
success = true
125126
return nil
126127
}
127128

cmd/jaeger/internal/extension/jaegerquery/server_test.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ import (
1717
"go.opentelemetry.io/collector/component"
1818
"go.opentelemetry.io/collector/component/componenttest"
1919
"go.opentelemetry.io/collector/config/confignet"
20-
"go.opentelemetry.io/collector/config/configtelemetry"
21-
"go.opentelemetry.io/otel/metric"
2220
noopmetric "go.opentelemetry.io/otel/metric/noop"
21+
nooptrace "go.opentelemetry.io/otel/trace/noop"
2322
"go.uber.org/zap"
2423
"go.uber.org/zap/zaptest"
2524

@@ -134,7 +133,7 @@ func TestServerStart(t *testing.T) {
134133
expectedErr string
135134
}{
136135
{
137-
name: "Non-empty config with fake storage host",
136+
name: "Real server with non-empty config",
138137
config: &Config{
139138
Storage: Storage{
140139
TracesArchive: "jaeger_storage",
@@ -204,15 +203,16 @@ func TestServerStart(t *testing.T) {
204203

205204
for _, tt := range tests {
206205
t.Run(tt.name, func(t *testing.T) {
206+
// Despite using Noop Tracer below, query service also creates jtracer.
207+
// We want to prevent that tracer from sampling anything in this test.
208+
t.Setenv("OTEL_TRACES_SAMPLER", "always_off")
207209
telemetrySettings := component.TelemetrySettings{
208-
Logger: zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller())),
209-
LeveledMeterProvider: func(_ configtelemetry.Level) metric.MeterProvider {
210-
return noopmetric.NewMeterProvider()
211-
},
212-
MeterProvider: noopmetric.NewMeterProvider(),
210+
Logger: zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller())),
211+
MeterProvider: noopmetric.NewMeterProvider(),
212+
TracerProvider: nooptrace.NewTracerProvider(),
213213
}
214-
tt.config.HTTP.Endpoint = ":0"
215-
tt.config.GRPC.NetAddr.Endpoint = ":0"
214+
tt.config.HTTP.Endpoint = "localhost:0"
215+
tt.config.GRPC.NetAddr.Endpoint = "localhost:0"
216216
tt.config.GRPC.NetAddr.Transport = confignet.TransportTypeTCP
217217
server := newServer(tt.config, telemetrySettings)
218218
err := server.Start(context.Background(), host)
@@ -297,7 +297,9 @@ func TestServerAddArchiveStorage(t *testing.T) {
297297
t.Run(tt.name, func(t *testing.T) {
298298
logger, buf := testutils.NewLogger()
299299
telemetrySettings := component.TelemetrySettings{
300-
Logger: logger,
300+
Logger: logger,
301+
MeterProvider: noopmetric.NewMeterProvider(),
302+
TracerProvider: nooptrace.NewTracerProvider(),
301303
}
302304
server := newServer(tt.config, telemetrySettings)
303305
if tt.extension != nil {
@@ -347,7 +349,9 @@ func TestServerAddMetricsStorage(t *testing.T) {
347349
t.Run(tt.name, func(t *testing.T) {
348350
logger, buf := testutils.NewLogger()
349351
telemetrySettings := component.TelemetrySettings{
350-
Logger: logger,
352+
Logger: logger,
353+
MeterProvider: noopmetric.NewMeterProvider(),
354+
TracerProvider: nooptrace.NewTracerProvider(),
351355
}
352356
server := newServer(tt.config, telemetrySettings)
353357
if tt.extension != nil {

cmd/jaeger/internal/extension/jaegerstorage/extension.go

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,8 @@ import (
1010
"io"
1111

1212
"go.opentelemetry.io/collector/component"
13-
"go.opentelemetry.io/collector/config/configtelemetry"
1413
"go.opentelemetry.io/collector/extension"
15-
"go.opentelemetry.io/otel/metric"
1614

17-
"github.com/jaegertracing/jaeger/internal/metrics/otelmetrics"
1815
"github.com/jaegertracing/jaeger/pkg/metrics"
1916
"github.com/jaegertracing/jaeger/pkg/telemetry"
2017
"github.com/jaegertracing/jaeger/plugin/metrics/prometheus"
@@ -118,34 +115,26 @@ func newStorageExt(config *Config, telset component.TelemetrySettings) *storageE
118115
}
119116

120117
func (s *storageExt) Start(_ context.Context, host component.Host) error {
121-
baseFactory := otelmetrics.NewFactory(s.telset.MeterProvider)
122-
mf := baseFactory.Namespace(metrics.NSOptions{Name: "jaeger"})
118+
telset := telemetry.FromOtelComponent(s.telset, host)
119+
telset.Metrics = telset.Metrics.Namespace(metrics.NSOptions{Name: "jaeger"})
123120
for storageName, cfg := range s.config.TraceBackends {
124121
s.telset.Logger.Sugar().Infof("Initializing storage '%s'", storageName)
125122
var factory storage.Factory
126123
var err error = errors.New("empty configuration")
127124
switch {
128125
case cfg.Memory != nil:
129-
factory, err = memory.NewFactoryWithConfig(*cfg.Memory, mf, s.telset.Logger), nil
126+
factory, err = memory.NewFactoryWithConfig(*cfg.Memory, telset.Metrics, s.telset.Logger), nil
130127
case cfg.Badger != nil:
131-
factory, err = badger.NewFactoryWithConfig(*cfg.Badger, mf, s.telset.Logger)
128+
factory, err = badger.NewFactoryWithConfig(*cfg.Badger, telset.Metrics, s.telset.Logger)
132129
case cfg.GRPC != nil:
133-
telset := telemetry.Setting{
134-
Logger: s.telset.Logger,
135-
Host: host,
136-
Metrics: mf,
137-
LeveledMeterProvider: func(_ configtelemetry.Level) metric.MeterProvider {
138-
return s.telset.MeterProvider
139-
},
140-
}
141130
//nolint: contextcheck
142131
factory, err = grpc.NewFactoryWithConfig(*cfg.GRPC, telset)
143132
case cfg.Cassandra != nil:
144-
factory, err = cassandra.NewFactoryWithConfig(*cfg.Cassandra, mf, s.telset.Logger)
133+
factory, err = cassandra.NewFactoryWithConfig(*cfg.Cassandra, telset.Metrics, s.telset.Logger)
145134
case cfg.Elasticsearch != nil:
146-
factory, err = es.NewFactoryWithConfig(*cfg.Elasticsearch, mf, s.telset.Logger)
135+
factory, err = es.NewFactoryWithConfig(*cfg.Elasticsearch, telset.Metrics, s.telset.Logger)
147136
case cfg.Opensearch != nil:
148-
factory, err = es.NewFactoryWithConfig(*cfg.Opensearch, mf, s.telset.Logger)
137+
factory, err = es.NewFactoryWithConfig(*cfg.Opensearch, telset.Metrics, s.telset.Logger)
149138
}
150139
if err != nil {
151140
return fmt.Errorf("failed to initialize storage '%s': %w", storageName, err)

cmd/query/app/flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (qOpts *QueryOptions) InitFromViper(v *viper.Viper, logger *zap.Logger) (*Q
136136
}
137137

138138
// BuildQueryServiceOptions creates a QueryServiceOptions struct with appropriate adjusters and archive config
139-
func (qOpts *QueryOptions) BuildQueryServiceOptions(storageFactory storage.Factory, logger *zap.Logger) *querysvc.QueryServiceOptions {
139+
func (qOpts *QueryOptions) BuildQueryServiceOptions(storageFactory storage.BaseFactory, logger *zap.Logger) *querysvc.QueryServiceOptions {
140140
opts := &querysvc.QueryServiceOptions{}
141141
if !opts.InitArchiveStorage(storageFactory, logger) {
142142
logger.Info("Archive storage not initialized")

cmd/query/app/querysvc/query_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (qs QueryService) GetCapabilities() StorageCapabilities {
127127
}
128128

129129
// InitArchiveStorage tries to initialize archive storage reader/writer if storage factory supports them.
130-
func (opts *QueryServiceOptions) InitArchiveStorage(storageFactory storage.Factory, logger *zap.Logger) bool {
130+
func (opts *QueryServiceOptions) InitArchiveStorage(storageFactory storage.BaseFactory, logger *zap.Logger) bool {
131131
archiveFactory, ok := storageFactory.(storage.ArchiveFactory)
132132
if !ok {
133133
logger.Info("Archive storage not supported by the factory")

0 commit comments

Comments
 (0)