Skip to content

Commit 88777f5

Browse files
authored
[metrics][storage] Move metrics reader decorator to metrics storage factory (#6287)
## Which problem is this PR solving? - Towards #6219 ## Description of the changes - This PR moves the decoration of the metrics readers with the metrics factory to inside the storage factory itself rather than handling it a higher level (ex. all-in-one, query server/extension) - For v2, the namespacing of the metrics has been moved from the query extension to the storage extension. - For v1, the namespacing of the metrics has been moved from the various binaries to the metrics storage meta-factory. - 🛑 This PR contains the following breaking changes: - In v1, metrics related to the metrics reader that were being published under `jaeger_query` will now be published under `jaeger_storage` with the `kind` and `role=metricstore` tags. - In v2, metrics related to the metrics reader that were being published under `jaeger_metricstore` will now be published under `jaeger_storage` with the `name`, `kind`, and `role=metricstore` tags. ## How was this change tested? - CI ## Checklist - [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [x] I have signed all commits - [x] I have added unit tests for the new functionality - [x] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: Mahad Zaryab <[email protected]>
1 parent beef883 commit 88777f5

File tree

13 files changed

+82
-59
lines changed

13 files changed

+82
-59
lines changed

cmd/all-in-one/main.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"github.com/jaegertracing/jaeger/plugin/storage"
4040
"github.com/jaegertracing/jaeger/ports"
4141
"github.com/jaegertracing/jaeger/storage/dependencystore"
42-
"github.com/jaegertracing/jaeger/storage/metricsstore/metricstoremetrics"
4342
"github.com/jaegertracing/jaeger/storage/spanstore"
4443
)
4544

@@ -118,7 +117,7 @@ by default uses only in-memory database.`,
118117
logger.Fatal("Failed to create dependency reader", zap.Error(err))
119118
}
120119

121-
metricsQueryService, err := createMetricsQueryService(metricsReaderFactory, v, logger, queryMetricsFactory)
120+
metricsQueryService, err := createMetricsQueryService(metricsReaderFactory, v, baseTelset)
122121
if err != nil {
123122
logger.Fatal("Failed to create metrics reader", zap.Error(err))
124123
}
@@ -238,20 +237,18 @@ func startQuery(
238237
func createMetricsQueryService(
239238
metricsReaderFactory *metricsPlugin.Factory,
240239
v *viper.Viper,
241-
logger *zap.Logger,
242-
metricsReaderMetricsFactory metrics.Factory,
240+
telset telemetry.Settings,
243241
) (querysvc.MetricsQueryService, error) {
244-
if err := metricsReaderFactory.Initialize(logger); err != nil {
242+
if err := metricsReaderFactory.Initialize(telset); err != nil {
245243
return nil, fmt.Errorf("failed to init metrics reader factory: %w", err)
246244
}
247245

248246
// Ensure default parameter values are loaded correctly.
249-
metricsReaderFactory.InitFromViper(v, logger)
247+
metricsReaderFactory.InitFromViper(v, telset.Logger)
250248
reader, err := metricsReaderFactory.CreateMetricsReader()
251249
if err != nil {
252250
return nil, fmt.Errorf("failed to create metrics reader: %w", err)
253251
}
254252

255-
// Decorate the metrics reader with metrics instrumentation.
256-
return metricstoremetrics.NewReaderDecorator(reader, metricsReaderMetricsFactory), nil
253+
return reader, nil
257254
}

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,12 @@ import (
1515
"github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/jaegerstorage"
1616
queryApp "github.com/jaegertracing/jaeger/cmd/query/app"
1717
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
18-
"github.com/jaegertracing/jaeger/internal/metrics/otelmetrics"
1918
"github.com/jaegertracing/jaeger/pkg/jtracer"
2019
"github.com/jaegertracing/jaeger/pkg/metrics"
2120
"github.com/jaegertracing/jaeger/pkg/telemetry"
2221
"github.com/jaegertracing/jaeger/pkg/tenancy"
2322
"github.com/jaegertracing/jaeger/plugin/metrics/disabled"
2423
"github.com/jaegertracing/jaeger/storage/metricsstore"
25-
"github.com/jaegertracing/jaeger/storage/metricsstore/metricstoremetrics"
2624
)
2725

2826
var (
@@ -156,10 +154,7 @@ func (s *server) createMetricReader(host component.Host) (metricsstore.Reader, e
156154
return nil, fmt.Errorf("cannot create metrics reader %w", err)
157155
}
158156

159-
// Decorate the metrics reader with metrics instrumentation.
160-
mf := otelmetrics.NewFactory(s.telset.MeterProvider)
161-
mf = mf.Namespace(metrics.NSOptions{Name: "jaeger_metricstore"})
162-
return metricstoremetrics.NewReaderDecorator(metricsReader, mf), nil
157+
return metricsReader, nil
163158
}
164159

165160
func (s *server) Shutdown(ctx context.Context) error {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
2727
"github.com/jaegertracing/jaeger/internal/grpctest"
2828
"github.com/jaegertracing/jaeger/pkg/metrics"
29+
"github.com/jaegertracing/jaeger/pkg/telemetry"
2930
"github.com/jaegertracing/jaeger/pkg/testutils"
3031
"github.com/jaegertracing/jaeger/storage"
3132
"github.com/jaegertracing/jaeger/storage/dependencystore"
@@ -73,7 +74,7 @@ type fakeMetricsFactory struct {
7374
}
7475

7576
// Initialize implements storage.MetricsFactory.
76-
func (fmf fakeMetricsFactory) Initialize(*zap.Logger) error {
77+
func (fmf fakeMetricsFactory) Initialize(telemetry.Settings) error {
7778
if fmf.name == "need-initialize-error" {
7879
return errors.New("test-error")
7980
}

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,13 @@ func newStorageExt(config *Config, telset component.TelemetrySettings) *storageE
117117
func (s *storageExt) Start(_ context.Context, host component.Host) error {
118118
telset := telemetry.FromOtelComponent(s.telset, host)
119119
telset.Metrics = telset.Metrics.Namespace(metrics.NSOptions{Name: "jaeger"})
120-
getMetricsFactory := func(name, kind string) metrics.Factory {
120+
scopedMetricsFactory := func(name, kind, role string) metrics.Factory {
121121
return telset.Metrics.Namespace(metrics.NSOptions{
122122
Name: "storage",
123123
Tags: map[string]string{
124124
"name": name,
125125
"kind": kind,
126+
"role": role,
126127
},
127128
})
128129
}
@@ -134,35 +135,35 @@ func (s *storageExt) Start(_ context.Context, host component.Host) error {
134135
case cfg.Memory != nil:
135136
factory, err = memory.NewFactoryWithConfig(
136137
*cfg.Memory,
137-
getMetricsFactory(storageName, "memory"),
138+
scopedMetricsFactory(storageName, "memory", "tracestore"),
138139
s.telset.Logger,
139140
), nil
140141
case cfg.Badger != nil:
141142
factory, err = badger.NewFactoryWithConfig(
142143
*cfg.Badger,
143-
getMetricsFactory(storageName, "badger"),
144+
scopedMetricsFactory(storageName, "badger", "tracestore"),
144145
s.telset.Logger)
145146
case cfg.GRPC != nil:
146147
grpcTelset := telset
147-
grpcTelset.Metrics = getMetricsFactory(storageName, "grpc")
148+
grpcTelset.Metrics = scopedMetricsFactory(storageName, "grpc", "tracestore")
148149
//nolint: contextcheck
149150
factory, err = grpc.NewFactoryWithConfig(*cfg.GRPC, grpcTelset)
150151
case cfg.Cassandra != nil:
151152
factory, err = cassandra.NewFactoryWithConfig(
152153
*cfg.Cassandra,
153-
getMetricsFactory(storageName, "cassandra"),
154+
scopedMetricsFactory(storageName, "cassandra", "tracestore"),
154155
s.telset.Logger,
155156
)
156157
case cfg.Elasticsearch != nil:
157158
factory, err = es.NewFactoryWithConfig(
158159
*cfg.Elasticsearch,
159-
getMetricsFactory(storageName, "elasticsearch"),
160+
scopedMetricsFactory(storageName, "elasticsearch", "tracestore"),
160161
s.telset.Logger,
161162
)
162163
case cfg.Opensearch != nil:
163164
factory, err = es.NewFactoryWithConfig(
164165
*cfg.Opensearch,
165-
getMetricsFactory(storageName, "opensearch"),
166+
scopedMetricsFactory(storageName, "opensearch", "tracestore"),
166167
s.telset.Logger,
167168
)
168169
}
@@ -177,7 +178,11 @@ func (s *storageExt) Start(_ context.Context, host component.Host) error {
177178
var metricsFactory storage.MetricsFactory
178179
var err error
179180
if cfg.Prometheus != nil {
180-
metricsFactory, err = prometheus.NewFactoryWithConfig(*cfg.Prometheus, s.telset.Logger)
181+
promTelset := telset
182+
promTelset.Metrics = scopedMetricsFactory(metricStorageName, "prometheus", "metricstore")
183+
metricsFactory, err = prometheus.NewFactoryWithConfig(
184+
*cfg.Prometheus,
185+
promTelset)
181186
}
182187
if err != nil {
183188
return fmt.Errorf("failed to initialize metrics storage '%s': %w", metricStorageName, err)

cmd/query/main.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
metricsPlugin "github.com/jaegertracing/jaeger/plugin/metrics"
3333
"github.com/jaegertracing/jaeger/plugin/storage"
3434
"github.com/jaegertracing/jaeger/ports"
35-
"github.com/jaegertracing/jaeger/storage/metricsstore/metricstoremetrics"
3635
)
3736

3837
func main() {
@@ -99,7 +98,7 @@ func main() {
9998
logger.Fatal("Failed to create dependency reader", zap.Error(err))
10099
}
101100

102-
metricsQueryService, err := createMetricsQueryService(metricsReaderFactory, v, logger, metricsFactory)
101+
metricsQueryService, err := createMetricsQueryService(metricsReaderFactory, v, baseTelset)
103102
if err != nil {
104103
logger.Fatal("Failed to create metrics query service", zap.Error(err))
105104
}
@@ -166,20 +165,18 @@ func main() {
166165
func createMetricsQueryService(
167166
metricsReaderFactory *metricsPlugin.Factory,
168167
v *viper.Viper,
169-
logger *zap.Logger,
170-
metricsReaderMetricsFactory metrics.Factory,
168+
telset telemetry.Settings,
171169
) (querysvc.MetricsQueryService, error) {
172-
if err := metricsReaderFactory.Initialize(logger); err != nil {
170+
if err := metricsReaderFactory.Initialize(telset); err != nil {
173171
return nil, fmt.Errorf("failed to init metrics reader factory: %w", err)
174172
}
175173

176174
// Ensure default parameter values are loaded correctly.
177-
metricsReaderFactory.InitFromViper(v, logger)
175+
metricsReaderFactory.InitFromViper(v, telset.Logger)
178176
reader, err := metricsReaderFactory.CreateMetricsReader()
179177
if err != nil {
180178
return nil, fmt.Errorf("failed to create metrics reader: %w", err)
181179
}
182180

183-
// Decorate the metrics reader with metrics instrumentation.
184-
return metricstoremetrics.NewReaderDecorator(reader, metricsReaderMetricsFactory), nil
181+
return reader, nil
185182
}

plugin/metrics/disabled/factory.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/spf13/viper"
1010
"go.uber.org/zap"
1111

12+
"github.com/jaegertracing/jaeger/pkg/telemetry"
1213
"github.com/jaegertracing/jaeger/plugin"
1314
"github.com/jaegertracing/jaeger/storage/metricsstore"
1415
)
@@ -30,7 +31,7 @@ func (*Factory) AddFlags(_ *flag.FlagSet) {}
3031
func (*Factory) InitFromViper(_ *viper.Viper, _ *zap.Logger) {}
3132

3233
// Initialize implements storage.MetricsFactory.
33-
func (*Factory) Initialize(_ *zap.Logger) error {
34+
func (*Factory) Initialize(_ telemetry.Settings) error {
3435
return nil
3536
}
3637

plugin/metrics/disabled/factory_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@ import (
1010
"github.com/stretchr/testify/require"
1111
"go.uber.org/zap"
1212

13+
"github.com/jaegertracing/jaeger/pkg/telemetry"
1314
"github.com/jaegertracing/jaeger/storage"
1415
)
1516

1617
var _ storage.MetricsFactory = new(Factory)
1718

1819
func TestPrometheusFactory(t *testing.T) {
1920
f := NewFactory()
20-
require.NoError(t, f.Initialize(zap.NewNop()))
21+
require.NoError(t, f.Initialize(telemetry.NoopSettings()))
2122

22-
err := f.Initialize(nil)
23+
err := f.Initialize(telemetry.NoopSettings())
2324
require.NoError(t, err)
2425

2526
f.AddFlags(nil)

plugin/metrics/factory.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"github.com/spf13/viper"
1111
"go.uber.org/zap"
1212

13+
"github.com/jaegertracing/jaeger/pkg/metrics"
14+
"github.com/jaegertracing/jaeger/pkg/telemetry"
1315
"github.com/jaegertracing/jaeger/plugin"
1416
"github.com/jaegertracing/jaeger/plugin/metrics/disabled"
1517
"github.com/jaegertracing/jaeger/plugin/metrics/prometheus"
@@ -63,9 +65,17 @@ func (*Factory) getFactoryOfType(factoryType string) (storage.MetricsFactory, er
6365
}
6466

6567
// Initialize implements storage.MetricsFactory.
66-
func (f *Factory) Initialize(logger *zap.Logger) error {
67-
for _, factory := range f.factories {
68-
factory.Initialize(logger)
68+
func (f *Factory) Initialize(telset telemetry.Settings) error {
69+
for kind, factory := range f.factories {
70+
scopedTelset := telset
71+
scopedTelset.Metrics = telset.Metrics.Namespace(metrics.NSOptions{
72+
Name: "storage",
73+
Tags: map[string]string{
74+
"kind": kind,
75+
"role": "metricstore",
76+
},
77+
})
78+
factory.Initialize(scopedTelset)
6979
}
7080
return nil
7181
}

plugin/metrics/factory_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/stretchr/testify/require"
1313
"go.uber.org/zap"
1414

15+
"github.com/jaegertracing/jaeger/pkg/telemetry"
1516
"github.com/jaegertracing/jaeger/plugin/metrics/disabled"
1617
"github.com/jaegertracing/jaeger/storage"
1718
"github.com/jaegertracing/jaeger/storage/mocks"
@@ -53,7 +54,7 @@ func TestCreateMetricsReader(t *testing.T) {
5354
require.NoError(t, err)
5455
require.NotNil(t, f)
5556

56-
require.NoError(t, f.Initialize(zap.NewNop()))
57+
require.NoError(t, f.Initialize(telemetry.NoopSettings()))
5758

5859
reader, err := f.CreateMetricsReader()
5960
require.NoError(t, err)

plugin/metrics/prometheus/factory.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,29 @@ import (
77
"flag"
88

99
"github.com/spf13/viper"
10-
"go.opentelemetry.io/otel"
11-
"go.opentelemetry.io/otel/trace"
1210
"go.uber.org/zap"
1311

1412
"github.com/jaegertracing/jaeger/pkg/prometheus/config"
13+
"github.com/jaegertracing/jaeger/pkg/telemetry"
1514
"github.com/jaegertracing/jaeger/plugin"
1615
prometheusstore "github.com/jaegertracing/jaeger/plugin/metrics/prometheus/metricsstore"
1716
"github.com/jaegertracing/jaeger/storage/metricsstore"
17+
"github.com/jaegertracing/jaeger/storage/metricsstore/metricstoremetrics"
1818
)
1919

2020
var _ plugin.Configurable = (*Factory)(nil)
2121

2222
// Factory implements storage.Factory and creates storage components backed by memory store.
2323
type Factory struct {
2424
options *Options
25-
logger *zap.Logger
26-
tracer trace.TracerProvider
25+
telset telemetry.Settings
2726
}
2827

2928
// NewFactory creates a new Factory.
3029
func NewFactory() *Factory {
30+
telset := telemetry.NoopSettings()
3131
return &Factory{
32-
tracer: otel.GetTracerProvider(),
32+
telset: telset,
3333
options: NewOptions(),
3434
}
3535
}
@@ -47,19 +47,23 @@ func (f *Factory) InitFromViper(v *viper.Viper, logger *zap.Logger) {
4747
}
4848

4949
// Initialize implements storage.MetricsFactory.
50-
func (f *Factory) Initialize(logger *zap.Logger) error {
51-
f.logger = logger
50+
func (f *Factory) Initialize(telset telemetry.Settings) error {
51+
f.telset = telset
5252
return nil
5353
}
5454

5555
// CreateMetricsReader implements storage.MetricsFactory.
5656
func (f *Factory) CreateMetricsReader() (metricsstore.Reader, error) {
57-
return prometheusstore.NewMetricsReader(f.options.Configuration, f.logger, f.tracer)
57+
mr, err := prometheusstore.NewMetricsReader(f.options.Configuration, f.telset.Logger, f.telset.TracerProvider)
58+
if err != nil {
59+
return nil, err
60+
}
61+
return metricstoremetrics.NewReaderDecorator(mr, f.telset.Metrics), nil
5862
}
5963

6064
func NewFactoryWithConfig(
6165
cfg config.Configuration,
62-
logger *zap.Logger,
66+
telset telemetry.Settings,
6367
) (*Factory, error) {
6468
if err := cfg.Validate(); err != nil {
6569
return nil, err
@@ -68,6 +72,6 @@ func NewFactoryWithConfig(
6872
f.options = &Options{
6973
Configuration: cfg,
7074
}
71-
f.Initialize(logger)
75+
f.Initialize(telset)
7276
return f, nil
7377
}

0 commit comments

Comments
 (0)