Skip to content

Commit 378cbc9

Browse files
authored
[fix] Refactor archive storage initialization and remove error log (#6636)
## Which problem is this PR solving? - Fixes #6634 ## Description of the changes - Remove the error logs for archive storage as it is not an error if archive storage cannot be configured - Remove the duplicate logs by only initializing the archive storage once for both query service and query service v2 ## How was this change tested? ``` make run-all-in-one {"level":"info","ts":1738292734.78397,"caller":"app/flags.go:168","msg":"Archive storage not initialized"} ``` ## 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`: `npm run lint` and `npm run test` --------- Signed-off-by: Mahad Zaryab <[email protected]>
1 parent 619a9f7 commit 378cbc9

File tree

6 files changed

+149
-140
lines changed

6 files changed

+149
-140
lines changed

cmd/all-in-one/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ by default uses only in-memory database.`,
170170
// query
171171
queryTelset := baseTelset // copy
172172
queryTelset.Metrics = queryMetricsFactory
173+
querySvcOpts, v2querySvcOpts := qOpts.BuildQueryServiceOptions(storageFactory.InitArchiveStorage, logger)
173174
querySrv := startQuery(
174-
svc, qOpts, qOpts.BuildQueryServiceOptions(storageFactory.InitArchiveStorage, logger),
175-
qOpts.BuildQueryServiceOptionsV2(storageFactory.InitArchiveStorage, logger),
175+
svc, qOpts, querySvcOpts, v2querySvcOpts,
176176
traceReader, dependencyReader, metricsQueryService,
177177
tm, queryTelset,
178178
)

cmd/query/app/flags.go

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import (
2727
"github.com/jaegertracing/jaeger/pkg/config"
2828
"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
2929
"github.com/jaegertracing/jaeger/pkg/tenancy"
30+
"github.com/jaegertracing/jaeger/plugin/storage"
3031
"github.com/jaegertracing/jaeger/ports"
31-
"github.com/jaegertracing/jaeger/storage/spanstore"
3232
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
3333
)
3434

@@ -140,41 +140,35 @@ func (qOpts *QueryOptions) InitFromViper(v *viper.Viper, logger *zap.Logger) (*Q
140140
return qOpts, nil
141141
}
142142

143-
type InitArchiveStorageFn func(logger *zap.Logger) (spanstore.Reader, spanstore.Writer)
143+
type InitArchiveStorageFn func() (*storage.ArchiveStorage, error)
144144

145145
// BuildQueryServiceOptions creates a QueryServiceOptions struct with appropriate adjusters and archive config
146146
func (qOpts *QueryOptions) BuildQueryServiceOptions(
147147
initArchiveStorageFn InitArchiveStorageFn,
148148
logger *zap.Logger,
149-
) *querysvc.QueryServiceOptions {
149+
) (*querysvc.QueryServiceOptions, *v2querysvc.QueryServiceOptions) {
150150
opts := &querysvc.QueryServiceOptions{
151151
MaxClockSkewAdjust: qOpts.MaxClockSkewAdjust,
152152
}
153-
ar, aw := initArchiveStorageFn(logger)
154-
if ar != nil && aw != nil {
155-
opts.ArchiveSpanReader = ar
156-
opts.ArchiveSpanWriter = aw
157-
} else {
158-
logger.Info("Archive storage not initialized")
159-
}
160-
161-
return opts
162-
}
163-
164-
func (qOpts *QueryOptions) BuildQueryServiceOptionsV2(initArchiveStorageFn InitArchiveStorageFn, logger *zap.Logger) *v2querysvc.QueryServiceOptions {
165-
opts := &v2querysvc.QueryServiceOptions{
153+
v2Opts := &v2querysvc.QueryServiceOptions{
166154
MaxClockSkewAdjust: qOpts.MaxClockSkewAdjust,
167155
}
156+
as, err := initArchiveStorageFn()
157+
if err != nil {
158+
logger.Error("Received an error when trying to initialize archive storage", zap.Error(err))
159+
return opts, v2Opts
160+
}
168161

169-
ar, aw := initArchiveStorageFn(logger)
170-
if ar != nil && aw != nil {
171-
opts.ArchiveTraceReader = v1adapter.NewTraceReader(ar)
172-
opts.ArchiveTraceWriter = v1adapter.NewTraceWriter(aw)
162+
if as != nil && as.Reader != nil && as.Writer != nil {
163+
opts.ArchiveSpanReader = as.Reader
164+
opts.ArchiveSpanWriter = as.Writer
165+
v2Opts.ArchiveTraceReader = v1adapter.NewTraceReader(as.Reader)
166+
v2Opts.ArchiveTraceWriter = v1adapter.NewTraceWriter(as.Writer)
173167
} else {
174168
logger.Info("Archive storage not initialized")
175169
}
176170

177-
return opts
171+
return opts, v2Opts
178172
}
179173

180174
// stringSliceAsHeader parses a slice of strings and returns a http.Header.

cmd/query/app/flags_test.go

Lines changed: 60 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import (
1616

1717
"github.com/jaegertracing/jaeger/pkg/config"
1818
"github.com/jaegertracing/jaeger/pkg/testutils"
19+
"github.com/jaegertracing/jaeger/plugin/storage"
1920
"github.com/jaegertracing/jaeger/ports"
20-
"github.com/jaegertracing/jaeger/storage/spanstore"
2121
spanstoremocks "github.com/jaegertracing/jaeger/storage/spanstore/mocks"
2222
)
2323

@@ -86,69 +86,67 @@ func TestStringSliceAsHeader(t *testing.T) {
8686
require.NoError(t, err)
8787
}
8888

89-
func initializedFn(*zap.Logger) (spanstore.Reader, spanstore.Writer) {
90-
return &spanstoremocks.Reader{}, &spanstoremocks.Writer{}
91-
}
92-
93-
func uninitializedFn(*zap.Logger) (spanstore.Reader, spanstore.Writer) {
94-
return nil, nil
95-
}
96-
9789
func TestBuildQueryServiceOptions(t *testing.T) {
98-
v, _ := config.Viperize(AddFlags)
99-
qOpts, err := new(QueryOptions).InitFromViper(v, zap.NewNop())
100-
require.NoError(t, err)
101-
assert.NotNil(t, qOpts)
102-
103-
qSvcOpts := qOpts.BuildQueryServiceOptions(initializedFn, zap.NewNop())
104-
assert.NotNil(t, qSvcOpts)
105-
assert.NotNil(t, qSvcOpts.ArchiveSpanReader)
106-
assert.NotNil(t, qSvcOpts.ArchiveSpanWriter)
107-
assert.Equal(t, defaultMaxClockSkewAdjust, qSvcOpts.MaxClockSkewAdjust)
108-
}
109-
110-
func TestBuildQueryServiceOptions_NoArchiveStorage(t *testing.T) {
111-
v, _ := config.Viperize(AddFlags)
112-
qOpts, err := new(QueryOptions).InitFromViper(v, zap.NewNop())
113-
require.NoError(t, err)
114-
assert.NotNil(t, qOpts)
115-
116-
logger, logBuf := testutils.NewLogger()
117-
qSvcOpts := qOpts.BuildQueryServiceOptions(uninitializedFn, logger)
118-
assert.NotNil(t, qSvcOpts)
119-
assert.Nil(t, qSvcOpts.ArchiveSpanReader)
120-
assert.Nil(t, qSvcOpts.ArchiveSpanWriter)
121-
assert.Equal(t, defaultMaxClockSkewAdjust, qSvcOpts.MaxClockSkewAdjust)
122-
123-
require.Contains(t, logBuf.String(), "Archive storage not initialized")
124-
}
125-
126-
func TestBuildQueryServiceOptionsV2(t *testing.T) {
127-
v, _ := config.Viperize(AddFlags)
128-
qOpts, err := new(QueryOptions).InitFromViper(v, zap.NewNop())
129-
require.NoError(t, err)
130-
assert.NotNil(t, qOpts)
131-
132-
qSvcOpts := qOpts.BuildQueryServiceOptionsV2(initializedFn, zap.NewNop())
133-
134-
assert.NotNil(t, qSvcOpts)
135-
assert.NotNil(t, qSvcOpts.ArchiveTraceReader)
136-
assert.NotNil(t, qSvcOpts.ArchiveTraceWriter)
137-
assert.Equal(t, defaultMaxClockSkewAdjust, qSvcOpts.MaxClockSkewAdjust)
138-
}
139-
140-
func TestBuildQueryServiceOptionsV2_NoArchiveStorage(t *testing.T) {
141-
v, _ := config.Viperize(AddFlags)
142-
qOpts, err := new(QueryOptions).InitFromViper(v, zap.NewNop())
143-
require.NoError(t, err)
144-
assert.NotNil(t, qOpts)
145-
146-
logger, logBuf := testutils.NewLogger()
147-
qSvcOpts := qOpts.BuildQueryServiceOptionsV2(uninitializedFn, logger)
148-
assert.Nil(t, qSvcOpts.ArchiveTraceReader)
149-
assert.Nil(t, qSvcOpts.ArchiveTraceWriter)
90+
tests := []struct {
91+
name string
92+
initFn func() (*storage.ArchiveStorage, error)
93+
expectNilStorage bool
94+
expectedLogEntry string
95+
}{
96+
{
97+
name: "successful initialization",
98+
initFn: func() (*storage.ArchiveStorage, error) {
99+
return &storage.ArchiveStorage{
100+
Reader: &spanstoremocks.Reader{},
101+
Writer: &spanstoremocks.Writer{},
102+
}, nil
103+
},
104+
expectNilStorage: false,
105+
},
106+
{
107+
name: "error initializing archive storage",
108+
initFn: func() (*storage.ArchiveStorage, error) {
109+
return nil, assert.AnError
110+
},
111+
expectNilStorage: true,
112+
expectedLogEntry: "Received an error when trying to initialize archive storage",
113+
},
114+
{
115+
name: "no archive storage",
116+
initFn: func() (*storage.ArchiveStorage, error) {
117+
return nil, nil
118+
},
119+
expectNilStorage: true,
120+
expectedLogEntry: "Archive storage not initialized",
121+
},
122+
}
150123

151-
require.Contains(t, logBuf.String(), "Archive storage not initialized")
124+
for _, test := range tests {
125+
t.Run(test.name, func(t *testing.T) {
126+
v, _ := config.Viperize(AddFlags)
127+
qOpts, err := new(QueryOptions).InitFromViper(v, zap.NewNop())
128+
require.NoError(t, err)
129+
require.NotNil(t, qOpts)
130+
131+
logger, logBuf := testutils.NewLogger()
132+
qSvcOpts, v2qSvcOpts := qOpts.BuildQueryServiceOptions(test.initFn, logger)
133+
require.Equal(t, defaultMaxClockSkewAdjust, qSvcOpts.MaxClockSkewAdjust)
134+
135+
if test.expectNilStorage {
136+
require.Nil(t, qSvcOpts.ArchiveSpanReader)
137+
require.Nil(t, qSvcOpts.ArchiveSpanWriter)
138+
require.Nil(t, v2qSvcOpts.ArchiveTraceReader)
139+
require.Nil(t, v2qSvcOpts.ArchiveTraceWriter)
140+
} else {
141+
require.NotNil(t, qSvcOpts.ArchiveSpanReader)
142+
require.NotNil(t, qSvcOpts.ArchiveSpanWriter)
143+
require.NotNil(t, v2qSvcOpts.ArchiveTraceReader)
144+
require.NotNil(t, v2qSvcOpts.ArchiveTraceWriter)
145+
}
146+
147+
require.Contains(t, logBuf.String(), test.expectedLogEntry)
148+
})
149+
}
152150
}
153151

154152
func TestQueryOptionsPortAllocationFromFlags(t *testing.T) {

cmd/query/main.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,23 +107,16 @@ func main() {
107107
if err != nil {
108108
logger.Fatal("Failed to create metrics query service", zap.Error(err))
109109
}
110-
queryServiceOptions := queryOpts.BuildQueryServiceOptions(
111-
storageFactory.InitArchiveStorage,
112-
logger,
113-
)
110+
querySvcOpts, v2querySvcOpts := queryOpts.BuildQueryServiceOptions(storageFactory.InitArchiveStorage, logger)
114111
queryService := querysvc.NewQueryService(
115112
traceReader,
116113
dependencyReader,
117-
*queryServiceOptions)
114+
*querySvcOpts)
118115

119-
queryServiceOptionsV2 := queryOpts.BuildQueryServiceOptionsV2(
120-
storageFactory.InitArchiveStorage,
121-
logger,
122-
)
123116
queryServiceV2 := querysvcv2.NewQueryService(
124117
traceReader,
125118
dependencyReader,
126-
*queryServiceOptionsV2)
119+
*v2querySvcOpts)
127120

128121
tm := tenancy.NewManager(&queryOpts.Tenancy)
129122
telset := baseTelset // copy

plugin/storage/factory.go

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -338,37 +338,34 @@ func (f *Factory) initDownsamplingFromViper(v *viper.Viper) {
338338
f.FactoryConfig.DownsamplingHashSalt = v.GetString(downsamplingHashSalt)
339339
}
340340

341-
func (f *Factory) createArchiveSpanReader() (spanstore.Reader, error) {
342-
factory, ok := f.archiveFactories[f.SpanReaderType]
343-
if !ok {
344-
return nil, fmt.Errorf("no %s backend registered for span store", f.SpanReaderType)
345-
}
346-
return factory.CreateSpanReader()
341+
type ArchiveStorage struct {
342+
Reader spanstore.Reader
343+
Writer spanstore.Writer
347344
}
348345

349-
func (f *Factory) createArchiveSpanWriter() (spanstore.Writer, error) {
350-
factory, ok := f.archiveFactories[f.SpanWriterTypes[0]]
346+
func (f *Factory) InitArchiveStorage() (*ArchiveStorage, error) {
347+
factory, ok := f.archiveFactories[f.SpanReaderType]
351348
if !ok {
352-
return nil, fmt.Errorf("no %s backend registered for span store", f.SpanWriterTypes[0])
349+
return nil, nil
353350
}
354-
return factory.CreateSpanWriter()
355-
}
356-
357-
func (f *Factory) InitArchiveStorage(
358-
logger *zap.Logger,
359-
) (spanstore.Reader, spanstore.Writer) {
360-
reader, err := f.createArchiveSpanReader()
351+
reader, err := factory.CreateSpanReader()
361352
if err != nil {
362-
logger.Error("Cannot init archive storage reader", zap.Error(err))
353+
return nil, err
354+
}
355+
356+
factory, ok = f.archiveFactories[f.SpanWriterTypes[0]]
357+
if !ok {
363358
return nil, nil
364359
}
365-
writer, err := f.createArchiveSpanWriter()
360+
writer, err := factory.CreateSpanWriter()
366361
if err != nil {
367-
logger.Error("Cannot init archive storage writer", zap.Error(err))
368-
return nil, nil
362+
return nil, err
369363
}
370364

371-
return reader, writer
365+
return &ArchiveStorage{
366+
Reader: reader,
367+
Writer: writer,
368+
}, nil
372369
}
373370

374371
var _ io.Closer = (*Factory)(nil)

0 commit comments

Comments
 (0)