diff --git a/cmd/otelsvc/main.go b/cmd/otelsvc/main.go index 25844d14aed..5a17292c0df 100644 --- a/cmd/otelsvc/main.go +++ b/cmd/otelsvc/main.go @@ -19,12 +19,21 @@ package main import ( "log" - _ "github.com/open-telemetry/opentelemetry-service/receiver/vmmetricsreceiver" + "github.com/open-telemetry/opentelemetry-service/defaults" "github.com/open-telemetry/opentelemetry-service/service" ) func main() { - if err := service.App.StartUnified(); err != nil { - log.Fatalf("Failed to run the service: %v", err) + handleErr := func(err error) { + if err != nil { + log.Fatalf("Failed to run the service: %v", err) + } } + + receivers, processors, exporters, err := defaults.Components() + handleErr(err) + + svc := service.New(receivers, processors, exporters) + err = svc.StartUnified() + handleErr(err) } diff --git a/config/configv2.go b/config/configv2.go index ec65bcb7a2d..a603c1664cc 100644 --- a/config/configv2.go +++ b/config/configv2.go @@ -84,25 +84,30 @@ const ( const typeAndNameSeparator = "/" // Load loads a Config from Viper. -func Load(v *viper.Viper) (*configmodels.Config, error) { +func Load( + v *viper.Viper, + receiverFactories map[string]receiver.Factory, + processorFactories map[string]processor.Factory, + exporterFactories map[string]exporter.Factory, +) (*configmodels.Config, error) { var config configmodels.Config // Load the config. - receivers, err := loadReceivers(v) + receivers, err := loadReceivers(v, receiverFactories) if err != nil { return nil, err } config.Receivers = receivers - exporters, err := loadExporters(v) + exporters, err := loadExporters(v, exporterFactories) if err != nil { return nil, err } config.Exporters = exporters - processors, err := loadProcessors(v) + processors, err := loadProcessors(v, processorFactories) if err != nil { return nil, err } @@ -161,7 +166,7 @@ func decodeTypeAndName(key string) (typeStr, fullName string, err error) { return } -func loadReceivers(v *viper.Viper) (configmodels.Receivers, error) { +func loadReceivers(v *viper.Viper, factories map[string]receiver.Factory) (configmodels.Receivers, error) { // Get the list of all "receivers" sub vipers from config source. subViper := v.Sub(receiversKeyName) @@ -183,7 +188,7 @@ func loadReceivers(v *viper.Viper) (configmodels.Receivers, error) { } // Find receiver factory based on "type" that we read from config source - factory := receiver.GetFactory(typeStr) + factory := factories[typeStr] if factory == nil { return nil, &configError{ code: errUnknownReceiverType, @@ -227,7 +232,7 @@ func loadReceivers(v *viper.Viper) (configmodels.Receivers, error) { return receivers, nil } -func loadExporters(v *viper.Viper) (configmodels.Exporters, error) { +func loadExporters(v *viper.Viper, factories map[string]exporter.Factory) (configmodels.Exporters, error) { // Get the list of all "exporters" sub vipers from config source. subViper := v.Sub(exportersKeyName) @@ -249,7 +254,7 @@ func loadExporters(v *viper.Viper) (configmodels.Exporters, error) { } // Find exporter factory based on "type" that we read from config source - factory := exporter.GetFactory(typeStr) + factory := factories[typeStr] if factory == nil { return nil, &configError{ code: errUnknownExporterType, @@ -284,7 +289,7 @@ func loadExporters(v *viper.Viper) (configmodels.Exporters, error) { return exporters, nil } -func loadProcessors(v *viper.Viper) (configmodels.Processors, error) { +func loadProcessors(v *viper.Viper, factories map[string]processor.Factory) (configmodels.Processors, error) { // Get the list of all "processors" sub vipers from config source. subViper := v.Sub(processorsKeyName) @@ -306,7 +311,7 @@ func loadProcessors(v *viper.Viper) (configmodels.Processors, error) { } // Find processor factory based on "type" that we read from config source. - factory := processor.GetFactory(typeStr) + factory := factories[typeStr] if factory == nil { return nil, &configError{ code: errUnknownProcessorType, diff --git a/config/configv2_test.go b/config/configv2_test.go index dd05abc8b4e..02c37e16e8e 100644 --- a/config/configv2_test.go +++ b/config/configv2_test.go @@ -23,12 +23,14 @@ import ( "github.com/open-telemetry/opentelemetry-service/config/configmodels" ) -var _ = RegisterTestFactories() - func TestDecodeConfig(t *testing.T) { + receivers, processors, exporters, err := ExampleComponents() + assert.Nil(t, err) // Load the config - config, err := LoadConfigFile(t, path.Join(".", "testdata", "valid-config.yaml")) + config, err := LoadConfigFile( + t, path.Join(".", "testdata", "valid-config.yaml"), receivers, processors, exporters, + ) if err != nil { t.Fatalf("unable to load config, %v", err) } @@ -108,9 +110,13 @@ func TestDecodeConfig(t *testing.T) { } func TestDecodeConfig_MultiProto(t *testing.T) { + receivers, processors, exporters, err := ExampleComponents() + assert.Nil(t, err) // Load the config - config, err := LoadConfigFile(t, path.Join(".", "testdata", "multiproto-config.yaml")) + config, err := LoadConfigFile( + t, path.Join(".", "testdata", "multiproto-config.yaml"), receivers, processors, exporters, + ) if err != nil { t.Fatalf("unable to load config, %v", err) } @@ -194,8 +200,13 @@ func TestDecodeConfig_Invalid(t *testing.T) { {name: "duplicate-pipeline", expected: errDuplicatePipelineName}, } + receivers, processors, exporters, err := ExampleComponents() + assert.Nil(t, err) + for _, test := range testCases { - _, err := LoadConfigFile(t, path.Join(".", "testdata", test.name+".yaml")) + _, err := LoadConfigFile( + t, path.Join(".", "testdata", test.name+".yaml"), receivers, processors, exporters, + ) if err == nil { t.Errorf("expected error but succedded on invalid config case: %s", test.name) } else if test.expected != 0 { diff --git a/config/example_factories.go b/config/example_factories.go index 8b3aba3e27c..ec4e69b81c4 100644 --- a/config/example_factories.go +++ b/config/example_factories.go @@ -325,11 +325,26 @@ func (f *ExampleProcessorFactory) CreateMetricsProcessor( return nil, configerror.ErrDataTypeIsNotSupported } -// RegisterTestFactories registers example factories. This is only used by tests. -func RegisterTestFactories() error { - _ = receiver.RegisterFactory(&ExampleReceiverFactory{}) - _ = receiver.RegisterFactory(&MultiProtoReceiverFactory{}) - _ = exporter.RegisterFactory(&ExampleExporterFactory{}) - _ = processor.RegisterFactory(&ExampleProcessorFactory{}) - return nil +// ExampleComponents registers example factories. This is only used by tests. +func ExampleComponents() ( + receivers map[string]receiver.Factory, + processors map[string]processor.Factory, + exporters map[string]exporter.Factory, + err error, +) { + receivers, err = receiver.Build( + &ExampleReceiverFactory{}, + &MultiProtoReceiverFactory{}, + ) + if err != nil { + return + } + + exporters, err = exporter.Build(&ExampleExporterFactory{}) + if err != nil { + return + } + + processors, err = processor.Build(&ExampleProcessorFactory{}) + return } diff --git a/config/test_helpers.go b/config/test_helpers.go index 251a8d99f09..3edbe67b03a 100644 --- a/config/test_helpers.go +++ b/config/test_helpers.go @@ -18,12 +18,22 @@ import ( "os" "testing" - "github.com/open-telemetry/opentelemetry-service/config/configmodels" "github.com/spf13/viper" + + "github.com/open-telemetry/opentelemetry-service/config/configmodels" + "github.com/open-telemetry/opentelemetry-service/exporter" + "github.com/open-telemetry/opentelemetry-service/processor" + "github.com/open-telemetry/opentelemetry-service/receiver" ) // LoadConfigFile loads a config from file. -func LoadConfigFile(t *testing.T, fileName string) (*configmodels.Config, error) { +func LoadConfigFile( + t *testing.T, + fileName string, + receivers map[string]receiver.Factory, + processors map[string]processor.Factory, + exporters map[string]exporter.Factory, +) (*configmodels.Config, error) { // Open the file for reading. file, err := os.Open(fileName) if err != nil { @@ -41,5 +51,5 @@ func LoadConfigFile(t *testing.T, fileName string) (*configmodels.Config, error) } // Load the config from viper - return Load(v) + return Load(v, receivers, processors, exporters) } diff --git a/defaults/defaults.go b/defaults/defaults.go new file mode 100644 index 00000000000..d680aab3d38 --- /dev/null +++ b/defaults/defaults.go @@ -0,0 +1,74 @@ +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package defaults composes the default set of components used by the otel service +package defaults + +import ( + "github.com/open-telemetry/opentelemetry-service/exporter" + "github.com/open-telemetry/opentelemetry-service/exporter/loggingexporter" + "github.com/open-telemetry/opentelemetry-service/exporter/opencensusexporter" + "github.com/open-telemetry/opentelemetry-service/exporter/prometheusexporter" + "github.com/open-telemetry/opentelemetry-service/internal" + "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/nodebatcher" + "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/queued" + "github.com/open-telemetry/opentelemetry-service/processor" + "github.com/open-telemetry/opentelemetry-service/processor/addattributesprocessor" + "github.com/open-telemetry/opentelemetry-service/receiver" + "github.com/open-telemetry/opentelemetry-service/receiver/jaegerreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/opencensusreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/prometheusreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/vmmetricsreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/zipkinreceiver" +) + +// Components returns the default set of components used by the +// opentelemetry service +func Components() ( + map[string]receiver.Factory, + map[string]processor.Factory, + map[string]exporter.Factory, + error, +) { + errs := []error{} + receivers, err := receiver.Build( + &jaegerreceiver.Factory{}, + &zipkinreceiver.Factory{}, + &prometheusreceiver.Factory{}, + &opencensusreceiver.Factory{}, + &vmmetricsreceiver.Factory{}, + ) + if err != nil { + errs = append(errs, err) + } + + exporters, err := exporter.Build( + &opencensusexporter.Factory{}, + &prometheusexporter.Factory{}, + &loggingexporter.Factory{}, + ) + if err != nil { + errs = append(errs, err) + } + + processors, err := processor.Build( + &addattributesprocessor.Factory{}, + &queued.Factory{}, + &nodebatcher.Factory{}, + ) + if err != nil { + errs = append(errs, err) + } + return receivers, processors, exporters, internal.CombineErrors(errs) +} diff --git a/defaults/defaults_test.go b/defaults/defaults_test.go new file mode 100644 index 00000000000..01c35d5d960 --- /dev/null +++ b/defaults/defaults_test.go @@ -0,0 +1,66 @@ +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Program otelsvc is the Open Telemetry Service that collects stats +// and traces and exports to a configured backend. +package defaults + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-service/exporter" + "github.com/open-telemetry/opentelemetry-service/exporter/loggingexporter" + "github.com/open-telemetry/opentelemetry-service/exporter/opencensusexporter" + "github.com/open-telemetry/opentelemetry-service/exporter/prometheusexporter" + "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/nodebatcher" + "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/queued" + "github.com/open-telemetry/opentelemetry-service/processor" + "github.com/open-telemetry/opentelemetry-service/processor/addattributesprocessor" + "github.com/open-telemetry/opentelemetry-service/receiver" + "github.com/open-telemetry/opentelemetry-service/receiver/jaegerreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/opencensusreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/prometheusreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/vmmetricsreceiver" + "github.com/open-telemetry/opentelemetry-service/receiver/zipkinreceiver" +) + +func TestDefaultComponents(t *testing.T) { + expectedReceivers := map[string]receiver.Factory{ + "jaeger": &jaegerreceiver.Factory{}, + "zipkin": &zipkinreceiver.Factory{}, + "prometheus": &prometheusreceiver.Factory{}, + "opencensus": &opencensusreceiver.Factory{}, + "vmmetrics": &vmmetricsreceiver.Factory{}, + } + expectedProcessors := map[string]processor.Factory{ + "attributes": &addattributesprocessor.Factory{}, + "queued-retry": &queued.Factory{}, + "batch": &nodebatcher.Factory{}, + } + expectedExporters := map[string]exporter.Factory{ + "opencensus": &opencensusexporter.Factory{}, + "prometheus": &prometheusexporter.Factory{}, + "logging": &loggingexporter.Factory{}, + } + + receivers, processors, exporters, err := Components() + fmt.Println(err) + assert.Nil(t, err) + assert.Equal(t, expectedReceivers, receivers) + assert.Equal(t, expectedProcessors, processors) + assert.Equal(t, expectedExporters, exporters) +} diff --git a/exporter/factory.go b/exporter/factory.go index ded0174413c..d0cfdb4b0c6 100644 --- a/exporter/factory.go +++ b/exporter/factory.go @@ -42,20 +42,16 @@ type Factory interface { CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, StopFunc, error) } -// List of registered exporter factories. -var exporterFactories = make(map[string]Factory) - -// RegisterFactory registers a exporter factory. -func RegisterFactory(factory Factory) error { - if exporterFactories[factory.Type()] != nil { - panic(fmt.Sprintf("duplicate exporter factory %q", factory.Type())) +// Build takes a list of exporter factories and returns a map of type map[string]Factory +// with factory type as keys. It returns a non-nil error when more than one factories +// have the same type. +func Build(factories ...Factory) (map[string]Factory, error) { + fMap := map[string]Factory{} + for _, f := range factories { + if _, ok := fMap[f.Type()]; ok { + return fMap, fmt.Errorf("duplicate exporter factory %q", f.Type()) + } + fMap[f.Type()] = f } - - exporterFactories[factory.Type()] = factory - return nil -} - -// GetFactory gets a exporter factory by type string. -func GetFactory(typeStr string) Factory { - return exporterFactories[typeStr] + return fMap, nil } diff --git a/exporter/factory_test.go b/exporter/factory_test.go index 73ad5cbcef8..ef5ac1c77e9 100644 --- a/exporter/factory_test.go +++ b/exporter/factory_test.go @@ -17,6 +17,7 @@ package exporter import ( "testing" + "github.com/stretchr/testify/assert" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configmodels" @@ -24,11 +25,12 @@ import ( ) type TestFactory struct { + name string } // Type gets the type of the Exporter config created by this factory. func (f *TestFactory) Type() string { - return "exampleexporter" + return f.name } // CreateDefaultConfig creates the default configuration for the Exporter. @@ -46,30 +48,41 @@ func (f *TestFactory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels return nil, nil, nil } -func TestRegisterFactory(t *testing.T) { - f := TestFactory{} - err := RegisterFactory(&f) - if err != nil { - t.Fatalf("cannot register factory") +func TestFactoriesBuilder(t *testing.T) { + type testCase struct { + in []Factory + out map[string]Factory + err bool } - if &f != GetFactory(f.Type()) { - t.Fatalf("cannot find factory") + testCases := []testCase{ + { + in: []Factory{ + &TestFactory{"exp1"}, + &TestFactory{"exp2"}, + }, + out: map[string]Factory{ + "exp1": &TestFactory{"exp1"}, + "exp2": &TestFactory{"exp2"}, + }, + err: false, + }, + { + in: []Factory{ + &TestFactory{"exp1"}, + &TestFactory{"exp1"}, + }, + err: true, + }, } - // Verify that attempt to register a factory with duplicate name panics - panicked := false - func() { - defer func() { - if r := recover(); r != nil { - panicked = true - } - }() - - err = RegisterFactory(&f) - }() - - if !panicked { - t.Fatalf("must panic on double registration") + for _, c := range testCases { + out, err := Build(c.in...) + if c.err { + assert.NotNil(t, err) + continue + } + assert.Nil(t, err) + assert.Equal(t, c.out, out) } } diff --git a/exporter/loggingexporter/config_test.go b/exporter/loggingexporter/config_test.go index 4c0d3156b2b..68f2858351f 100644 --- a/exporter/loggingexporter/config_test.go +++ b/exporter/loggingexporter/config_test.go @@ -23,15 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/exporter" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + exporters[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/exporter/loggingexporter/factory.go b/exporter/loggingexporter/factory.go index 6a830fbfbb5..d407b3c41c8 100644 --- a/exporter/loggingexporter/factory.go +++ b/exporter/loggingexporter/factory.go @@ -22,24 +22,22 @@ import ( "github.com/open-telemetry/opentelemetry-service/exporter" ) -var _ = exporter.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "logging" ) -// factory is the factory for logging exporter. -type factory struct { +// Factory is the factory for logging exporter. +type Factory struct { } // Type gets the type of the Exporter config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for exporter. -func (f *factory) CreateDefaultConfig() configmodels.Exporter { +func (f *Factory) CreateDefaultConfig() configmodels.Exporter { return &Config{ ExporterSettings: configmodels.ExporterSettings{ TypeVal: typeStr, @@ -53,7 +51,7 @@ func noopStopFunc() error { } // CreateTraceExporter creates a trace exporter based on this config. -func (f *factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { lexp, err := NewTraceExporter(logger) if err != nil { @@ -63,7 +61,7 @@ func (f *factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Ex } // CreateMetricsExporter creates a metrics exporter based on this config. -func (f *factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { lexp, err := NewMetricsExporter(logger) if err != nil { return nil, nil, err diff --git a/exporter/loggingexporter/factory_test.go b/exporter/loggingexporter/factory_test.go index cd3a78eef9d..78b021f9cb1 100644 --- a/exporter/loggingexporter/factory_test.go +++ b/exporter/loggingexporter/factory_test.go @@ -18,22 +18,17 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "go.uber.org/zap" - - "github.com/open-telemetry/opentelemetry-service/exporter" ) func TestCreateDefaultConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateMetricsExporter(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() _, _, err := factory.CreateMetricsExporter(zap.NewNop(), cfg) @@ -41,7 +36,7 @@ func TestCreateMetricsExporter(t *testing.T) { } func TestCreateTraceExporter(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() _, _, err := factory.CreateTraceExporter(zap.NewNop(), cfg) diff --git a/exporter/opencensusexporter/config_test.go b/exporter/opencensusexporter/config_test.go index 7deadcfd0cb..335443a8872 100644 --- a/exporter/opencensusexporter/config_test.go +++ b/exporter/opencensusexporter/config_test.go @@ -23,15 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/exporter" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + factory := &Factory{} + exporters[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/exporter/opencensusexporter/factory.go b/exporter/opencensusexporter/factory.go index 6a55214d8f5..1ef09a0fe5a 100644 --- a/exporter/opencensusexporter/factory.go +++ b/exporter/opencensusexporter/factory.go @@ -33,24 +33,22 @@ import ( compressiongrpc "github.com/open-telemetry/opentelemetry-service/internal/compression/grpc" ) -var _ = exporter.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "opencensus" ) -// factory is the factory for OpenCensus exporter. -type factory struct { +// Factory is the factory for OpenCensus exporter. +type Factory struct { } // Type gets the type of the Exporter config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for exporter. -func (f *factory) CreateDefaultConfig() configmodels.Exporter { +func (f *Factory) CreateDefaultConfig() configmodels.Exporter { return &Config{ ExporterSettings: configmodels.ExporterSettings{ TypeVal: typeStr, @@ -61,7 +59,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Exporter { } // CreateTraceExporter creates a trace exporter based on this config. -func (f *factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { ocac := config.(*Config) if ocac.Endpoint == "" { @@ -148,6 +146,6 @@ func (f *factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Ex } // CreateMetricsExporter creates a metrics exporter based on this config. -func (f *factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { return nil, nil, configerror.ErrDataTypeIsNotSupported } diff --git a/exporter/opencensusexporter/factory_test.go b/exporter/opencensusexporter/factory_test.go index 92c226745aa..ef97a399f34 100644 --- a/exporter/opencensusexporter/factory_test.go +++ b/exporter/opencensusexporter/factory_test.go @@ -24,25 +24,21 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" - "github.com/open-telemetry/opentelemetry-service/exporter" "github.com/open-telemetry/opentelemetry-service/exporter/exportertest" "github.com/open-telemetry/opentelemetry-service/internal/compression" "github.com/open-telemetry/opentelemetry-service/internal/testutils" - "github.com/open-telemetry/opentelemetry-service/receiver" "github.com/open-telemetry/opentelemetry-service/receiver/opencensusreceiver" "github.com/open-telemetry/opentelemetry-service/receiver/receivertest" ) func TestCreateDefaultConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateMetricsExporter(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() _, _, err := factory.CreateMetricsExporter(zap.NewNop(), cfg) @@ -54,7 +50,7 @@ func TestCreateTraceExporter(t *testing.T) { // exporter keeps trying to update its connection state in the background // so unless there is a receiver enabled the stop call can return different // results. Standing up a receiver to ensure that stop don't report errors. - rcvFactory := receiver.GetFactory(typeStr) + rcvFactory := &opencensusreceiver.Factory{} require.NotNil(t, rcvFactory) rcvCfg := rcvFactory.CreateDefaultConfig().(*opencensusreceiver.Config) rcvCfg.Endpoint = testutils.GetAvailableLocalAddress(t) @@ -157,7 +153,7 @@ func TestCreateTraceExporter(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := &Factory{} consumer, stopFunc, err := factory.CreateTraceExporter(zap.NewNop(), &tt.config) if tt.mustFail { diff --git a/exporter/prometheusexporter/config_test.go b/exporter/prometheusexporter/config_test.go index e4012115b77..c0550960f29 100644 --- a/exporter/prometheusexporter/config_test.go +++ b/exporter/prometheusexporter/config_test.go @@ -23,15 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/exporter" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + exporters[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/exporter/prometheusexporter/factory.go b/exporter/prometheusexporter/factory.go index d8505071523..95442358a83 100644 --- a/exporter/prometheusexporter/factory.go +++ b/exporter/prometheusexporter/factory.go @@ -28,24 +28,22 @@ import ( "github.com/orijtech/prometheus-go-metrics-exporter" ) -var _ = exporter.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "prometheus" ) -// factory is the factory for Prometheus exporter. -type factory struct { +// Factory is the factory for Prometheus exporter. +type Factory struct { } // Type gets the type of the Exporter config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for exporter. -func (f *factory) CreateDefaultConfig() configmodels.Exporter { +func (f *Factory) CreateDefaultConfig() configmodels.Exporter { return &Config{ ExporterSettings: configmodels.ExporterSettings{ TypeVal: typeStr, @@ -56,12 +54,12 @@ func (f *factory) CreateDefaultConfig() configmodels.Exporter { } // CreateTraceExporter creates a trace exporter based on this config. -func (f *factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateTraceExporter(logger *zap.Logger, config configmodels.Exporter) (consumer.TraceConsumer, exporter.StopFunc, error) { return nil, nil, configerror.ErrDataTypeIsNotSupported } // CreateMetricsExporter creates a metrics exporter based on this config. -func (f *factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { +func (f *Factory) CreateMetricsExporter(logger *zap.Logger, cfg configmodels.Exporter) (consumer.MetricsConsumer, exporter.StopFunc, error) { pcfg := cfg.(*Config) addr := strings.TrimSpace(pcfg.Endpoint) diff --git a/exporter/prometheusexporter/factory_test.go b/exporter/prometheusexporter/factory_test.go index dc4040e9435..3de2f4cb5dd 100644 --- a/exporter/prometheusexporter/factory_test.go +++ b/exporter/prometheusexporter/factory_test.go @@ -22,11 +22,10 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" - "github.com/open-telemetry/opentelemetry-service/exporter" ) func TestCreateDefaultConfig(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := Factory{} require.NotNil(t, factory) cfg := factory.CreateDefaultConfig() @@ -34,7 +33,7 @@ func TestCreateDefaultConfig(t *testing.T) { } func TestCreateTraceExporter(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() _, _, err := factory.CreateTraceExporter(zap.NewNop(), cfg) @@ -59,7 +58,7 @@ func TestCreateMetricsExporter(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - factory := exporter.GetFactory(typeStr) + factory := Factory{} consumer, stopFunc, err := factory.CreateMetricsExporter(zap.NewNop(), &tt.config) if tt.mustFail { diff --git a/exporter/prometheusexporter/prometheus_test.go b/exporter/prometheusexporter/prometheus_test.go index 4fb73ec0ce4..08be9af8d24 100644 --- a/exporter/prometheusexporter/prometheus_test.go +++ b/exporter/prometheusexporter/prometheus_test.go @@ -28,7 +28,6 @@ import ( metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" "github.com/open-telemetry/opentelemetry-service/consumer/consumerdata" - "github.com/open-telemetry/opentelemetry-service/exporter" "github.com/open-telemetry/opentelemetry-service/internal/config/viperutils" ) @@ -53,7 +52,7 @@ func TestPrometheusExporter(t *testing.T) { }, } - factory := exporter.GetFactory(typeStr) + factory := Factory{} for i, tt := range tests { // Run it a few times to ensure that shutdowns exit cleanly. for j := 0; j < 3; j++ { @@ -105,7 +104,7 @@ func TestPrometheusExporter_endToEnd(t *testing.T) { Endpoint: ":7777", } - factory := exporter.GetFactory(typeStr) + factory := Factory{} consumer, stopFunc, err := factory.CreateMetricsExporter(zap.NewNop(), config) assert.Nil(t, err) diff --git a/internal/collector/processor/nodebatcher/config_test.go b/internal/collector/processor/nodebatcher/config_test.go index 35359149cfb..6204a249955 100644 --- a/internal/collector/processor/nodebatcher/config_test.go +++ b/internal/collector/processor/nodebatcher/config_test.go @@ -24,16 +24,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/processor" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) - factory := processor.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + factory := &Factory{} + processors[typeStr] = &Factory{} + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.Nil(t, err) require.NotNil(t, cfg) diff --git a/internal/collector/processor/nodebatcher/factory.go b/internal/collector/processor/nodebatcher/factory.go index faa056a1eea..285defcb8ce 100644 --- a/internal/collector/processor/nodebatcher/factory.go +++ b/internal/collector/processor/nodebatcher/factory.go @@ -23,24 +23,22 @@ import ( "github.com/open-telemetry/opentelemetry-service/processor" ) -var _ = processor.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "batch" ) -// factory is the factory for batch processor. -type factory struct { +// Factory is the factory for batch processor. +type Factory struct { } // Type gets the type of the config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for processor. -func (f *factory) CreateDefaultConfig() configmodels.Processor { +func (f *Factory) CreateDefaultConfig() configmodels.Processor { removeAfterTicks := int(defaultRemoveAfterCycles) sendBatchSize := int(defaultSendBatchSize) tickTime := defaultTickTime @@ -60,7 +58,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Processor { } // CreateTraceProcessor creates a trace processor based on this config. -func (f *factory) CreateTraceProcessor( +func (f *Factory) CreateTraceProcessor( logger *zap.Logger, nextConsumer consumer.TraceConsumer, c configmodels.Processor, @@ -96,7 +94,7 @@ func (f *factory) CreateTraceProcessor( } // CreateMetricsProcessor creates a metrics processor based on this config. -func (f *factory) CreateMetricsProcessor( +func (f *Factory) CreateMetricsProcessor( logger *zap.Logger, nextConsumer consumer.MetricsConsumer, cfg configmodels.Processor, diff --git a/internal/collector/processor/nodebatcher/factory_test.go b/internal/collector/processor/nodebatcher/factory_test.go index 5f426b0a507..7276ba3492f 100644 --- a/internal/collector/processor/nodebatcher/factory_test.go +++ b/internal/collector/processor/nodebatcher/factory_test.go @@ -20,25 +20,19 @@ import ( "go.uber.org/zap" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-service/processor" ) func TestCreateDefaultConfig(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateProcessor(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) + factory := &Factory{} cfg := factory.CreateDefaultConfig() - tp, err := factory.CreateTraceProcessor(zap.NewNop(), nil, cfg) assert.NotNil(t, tp) assert.NoError(t, err, "cannot create trace processor") diff --git a/internal/collector/processor/queued/config_test.go b/internal/collector/processor/queued/config_test.go index b6e716a9644..22b742d0347 100644 --- a/internal/collector/processor/queued/config_test.go +++ b/internal/collector/processor/queued/config_test.go @@ -24,16 +24,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/processor" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - - factory := processor.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + processors[typeStr] = &Factory{} + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.Nil(t, err) require.NotNil(t, cfg) diff --git a/internal/collector/processor/queued/factory.go b/internal/collector/processor/queued/factory.go index e6438a54e4e..a2380f9ba89 100644 --- a/internal/collector/processor/queued/factory.go +++ b/internal/collector/processor/queued/factory.go @@ -24,24 +24,22 @@ import ( "go.uber.org/zap" ) -var _ = processor.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "queued-retry" ) -// factory is the factory for OpenCensus exporter. -type factory struct { +// Factory is the factory for OpenCensus exporter. +type Factory struct { } // Type gets the type of the Option config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for exporter. -func (f *factory) CreateDefaultConfig() configmodels.Processor { +func (f *Factory) CreateDefaultConfig() configmodels.Processor { return &Config{ ProcessorSettings: configmodels.ProcessorSettings{ TypeVal: typeStr, @@ -55,7 +53,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Processor { } // CreateTraceProcessor creates a trace processor based on this config. -func (f *factory) CreateTraceProcessor( +func (f *Factory) CreateTraceProcessor( logger *zap.Logger, nextConsumer consumer.TraceConsumer, cfg configmodels.Processor, @@ -70,7 +68,7 @@ func (f *factory) CreateTraceProcessor( } // CreateMetricsProcessor creates a metrics processor based on this config. -func (f *factory) CreateMetricsProcessor( +func (f *Factory) CreateMetricsProcessor( logger *zap.Logger, nextConsumer consumer.MetricsConsumer, cfg configmodels.Processor, diff --git a/internal/collector/processor/queued/factory_test.go b/internal/collector/processor/queued/factory_test.go index 4a345037052..10867e78615 100644 --- a/internal/collector/processor/queued/factory_test.go +++ b/internal/collector/processor/queued/factory_test.go @@ -20,23 +20,16 @@ import ( "go.uber.org/zap" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-service/processor" ) func TestCreateDefaultConfig(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateProcessor(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := &Factory{} cfg := factory.CreateDefaultConfig() tp, err := factory.CreateTraceProcessor(zap.NewNop(), nil, cfg) diff --git a/internal/collector/sampling/empty_test.go b/internal/collector/sampling/empty_test.go new file mode 100644 index 00000000000..03c0aa73799 --- /dev/null +++ b/internal/collector/sampling/empty_test.go @@ -0,0 +1,15 @@ +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sampling diff --git a/internal/collector/telemetry/empty_test.go b/internal/collector/telemetry/empty_test.go new file mode 100644 index 00000000000..89633d29330 --- /dev/null +++ b/internal/collector/telemetry/empty_test.go @@ -0,0 +1,15 @@ +// Copyright 2019, OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package telemetry diff --git a/processor/addattributesprocessor/config_test.go b/processor/addattributesprocessor/config_test.go index 808c604e7c5..3fbdf706907 100644 --- a/processor/addattributesprocessor/config_test.go +++ b/processor/addattributesprocessor/config_test.go @@ -23,16 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/processor" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - - factory := processor.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + processors[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.Nil(t, err) require.NotNil(t, cfg) diff --git a/processor/addattributesprocessor/factory.go b/processor/addattributesprocessor/factory.go index 7984852e168..1defeacf6d9 100644 --- a/processor/addattributesprocessor/factory.go +++ b/processor/addattributesprocessor/factory.go @@ -23,24 +23,22 @@ import ( "github.com/open-telemetry/opentelemetry-service/processor" ) -var _ = processor.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "attributes" ) -// factory is the factory for Attributes processor. -type factory struct { +// Factory is the factory for Attributes processor. +type Factory struct { } // Type gets the type of the config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CreateDefaultConfig creates the default configuration for processor. -func (f *factory) CreateDefaultConfig() configmodels.Processor { +func (f *Factory) CreateDefaultConfig() configmodels.Processor { return &Config{ ProcessorSettings: configmodels.ProcessorSettings{ TypeVal: typeStr, @@ -51,7 +49,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Processor { } // CreateTraceProcessor creates a trace processor based on this config. -func (f *factory) CreateTraceProcessor( +func (f *Factory) CreateTraceProcessor( logger *zap.Logger, nextConsumer consumer.TraceConsumer, cfg configmodels.Processor, @@ -61,7 +59,7 @@ func (f *factory) CreateTraceProcessor( } // CreateMetricsProcessor creates a metrics processor based on this config. -func (f *factory) CreateMetricsProcessor( +func (f *Factory) CreateMetricsProcessor( logger *zap.Logger, nextConsumer consumer.MetricsConsumer, cfg configmodels.Processor, diff --git a/processor/addattributesprocessor/factory_test.go b/processor/addattributesprocessor/factory_test.go index 9493c830af9..1c640faaec8 100644 --- a/processor/addattributesprocessor/factory_test.go +++ b/processor/addattributesprocessor/factory_test.go @@ -20,23 +20,16 @@ import ( "go.uber.org/zap" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/open-telemetry/opentelemetry-service/processor" ) func TestCreateDefaultConfig(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateProcessor(t *testing.T) { - factory := processor.GetFactory(typeStr) - require.NotNil(t, factory) - + factory := Factory{} cfg := factory.CreateDefaultConfig() tp, err := factory.CreateTraceProcessor(zap.NewNop(), nil, cfg) diff --git a/processor/factory.go b/processor/factory.go index 75ec2bfa32d..f40ff74c64c 100644 --- a/processor/factory.go +++ b/processor/factory.go @@ -44,20 +44,16 @@ type Factory interface { cfg configmodels.Processor) (MetricsProcessor, error) } -// List of registered processor factories. -var processorFactories = make(map[string]Factory) - -// RegisterFactory registers a processor factory. -func RegisterFactory(factory Factory) error { - if processorFactories[factory.Type()] != nil { - panic(fmt.Sprintf("duplicate processor factory %q", factory.Type())) +// Build takes a list of processor factories and returns a map of type map[string]Factory +// with factory type as keys. It returns a non-nil error when more than one factories +// have the same type. +func Build(factories ...Factory) (map[string]Factory, error) { + fMap := map[string]Factory{} + for _, f := range factories { + if _, ok := fMap[f.Type()]; ok { + return fMap, fmt.Errorf("duplicate processor factory %q", f.Type()) + } + fMap[f.Type()] = f } - - processorFactories[factory.Type()] = factory - return nil -} - -// GetFactory gets a processor factory by type string. -func GetFactory(typeStr string) Factory { - return processorFactories[typeStr] + return fMap, nil } diff --git a/processor/factory_test.go b/processor/factory_test.go index e5b5be1a7e4..6332e056f0f 100644 --- a/processor/factory_test.go +++ b/processor/factory_test.go @@ -17,6 +17,7 @@ package processor import ( "testing" + "github.com/stretchr/testify/assert" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" @@ -25,11 +26,12 @@ import ( ) type TestFactory struct { + name string } // Type gets the type of the Processor config created by this factory. func (f *TestFactory) Type() string { - return "exampleoption" + return f.name } // CreateDefaultConfig creates the default configuration for the Processor. @@ -55,30 +57,41 @@ func (f *TestFactory) CreateMetricsProcessor( return nil, configerror.ErrDataTypeIsNotSupported } -func TestRegisterProcessorFactory(t *testing.T) { - f := TestFactory{} - err := RegisterFactory(&f) - if err != nil { - t.Fatalf("cannot register factory") +func TestFactoriesBuilder(t *testing.T) { + type testCase struct { + in []Factory + out map[string]Factory + err bool } - if &f != GetFactory(f.Type()) { - t.Fatalf("cannot find factory") + testCases := []testCase{ + { + in: []Factory{ + &TestFactory{"p1"}, + &TestFactory{"p2"}, + }, + out: map[string]Factory{ + "p1": &TestFactory{"p1"}, + "p2": &TestFactory{"p2"}, + }, + err: false, + }, + { + in: []Factory{ + &TestFactory{"p1"}, + &TestFactory{"p1"}, + }, + err: true, + }, } - // Verify that attempt to register a factory with duplicate name panics - paniced := false - func() { - defer func() { - if r := recover(); r != nil { - paniced = true - } - }() - - err = RegisterFactory(&f) - }() - - if !paniced { - t.Fatalf("must panic on double registration") + for _, c := range testCases { + out, err := Build(c.in...) + if c.err { + assert.NotNil(t, err) + continue + } + assert.Nil(t, err) + assert.Equal(t, c.out, out) } } diff --git a/receiver/factory.go b/receiver/factory.go index a8f5dd3565b..adde007b4b5 100644 --- a/receiver/factory.go +++ b/receiver/factory.go @@ -55,20 +55,16 @@ type Factory interface { // in a custom way. type CustomUnmarshaler func(v *viper.Viper, viperKey string, intoCfg interface{}) error -// List of registered receiver factories. -var receiverFactories = make(map[string]Factory) - -// RegisterFactory registers a receiver factory. -func RegisterFactory(factory Factory) error { - if receiverFactories[factory.Type()] != nil { - panic(fmt.Sprintf("duplicate receiver factory %q", factory.Type())) +// Build takes a list of receiver factories and returns a map of type map[string]Factory +// with factory type as keys. It returns a non-nil error when more than one factories +// have the same type. +func Build(factories ...Factory) (map[string]Factory, error) { + fMap := map[string]Factory{} + for _, f := range factories { + if _, ok := fMap[f.Type()]; ok { + return fMap, fmt.Errorf("duplicate receiver factory %q", f.Type()) + } + fMap[f.Type()] = f } - - receiverFactories[factory.Type()] = factory - return nil -} - -// GetFactory gets a receiver factory by type string. -func GetFactory(typeStr string) Factory { - return receiverFactories[typeStr] + return fMap, nil } diff --git a/receiver/factory_test.go b/receiver/factory_test.go index ecd20404b1c..f1d8a130dc6 100644 --- a/receiver/factory_test.go +++ b/receiver/factory_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/stretchr/testify/assert" "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configmodels" @@ -25,11 +26,12 @@ import ( ) type TestFactory struct { + name string } // Type gets the type of the Receiver config created by this factory. func (f *TestFactory) Type() string { - return "examplereceiver" + return f.name } // CustomUnmarshaler returns nil because we don't need custom unmarshaling for this factory. @@ -63,30 +65,41 @@ func (f *TestFactory) CreateMetricsReceiver( return nil, nil } -func TestRegisterFactory(t *testing.T) { - f := TestFactory{} - err := RegisterFactory(&f) - if err != nil { - t.Fatalf("cannot register factory") +func TestFactoriesBuilder(t *testing.T) { + type testCase struct { + in []Factory + out map[string]Factory + err bool } - if &f != GetFactory(f.Type()) { - t.Fatalf("cannot find factory") + testCases := []testCase{ + { + in: []Factory{ + &TestFactory{"e1"}, + &TestFactory{"e2"}, + }, + out: map[string]Factory{ + "e1": &TestFactory{"e1"}, + "e2": &TestFactory{"e2"}, + }, + err: false, + }, + { + in: []Factory{ + &TestFactory{"e1"}, + &TestFactory{"e1"}, + }, + err: true, + }, } - // Verify that attempt to register a factory with duplicate name panics - panicked := false - func() { - defer func() { - if r := recover(); r != nil { - panicked = true - } - }() - - err = RegisterFactory(&f) - }() - - if !panicked { - t.Fatalf("must panic on double registration") + for _, c := range testCases { + out, err := Build(c.in...) + if c.err { + assert.NotNil(t, err) + continue + } + assert.Nil(t, err) + assert.Equal(t, c.out, out) } } diff --git a/receiver/jaegerreceiver/config_test.go b/receiver/jaegerreceiver/config_test.go index 242f5b63096..07ca158ad4e 100644 --- a/receiver/jaegerreceiver/config_test.go +++ b/receiver/jaegerreceiver/config_test.go @@ -23,15 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + receivers[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/receiver/jaegerreceiver/factory.go b/receiver/jaegerreceiver/factory.go index 00deb36afd5..1edbf4c9298 100644 --- a/receiver/jaegerreceiver/factory.go +++ b/receiver/jaegerreceiver/factory.go @@ -31,8 +31,6 @@ import ( "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = receiver.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "jaeger" @@ -46,22 +44,22 @@ const ( defaultTChannelBindEndpoint = "127.0.0.1:14267" ) -// factory is the factory for Jaeger receiver. -type factory struct { +// Factory is the factory for Jaeger receiver. +type Factory struct { } // Type gets the type of the Receiver config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CustomUnmarshaler returns nil because we don't need custom unmarshaling for this config. -func (f *factory) CustomUnmarshaler() receiver.CustomUnmarshaler { +func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { return nil } // CreateDefaultConfig creates the default configuration for Jaeger receiver. -func (f *factory) CreateDefaultConfig() configmodels.Receiver { +func (f *Factory) CreateDefaultConfig() configmodels.Receiver { return &Config{ TypeVal: typeStr, NameVal: typeStr, @@ -79,7 +77,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Receiver { } // CreateTraceReceiver creates a trace receiver based on provided config. -func (f *factory) CreateTraceReceiver( +func (f *Factory) CreateTraceReceiver( ctx context.Context, logger *zap.Logger, cfg configmodels.Receiver, @@ -127,7 +125,7 @@ func (f *factory) CreateTraceReceiver( } // CreateMetricsReceiver creates a metrics receiver based on provided config. -func (f *factory) CreateMetricsReceiver( +func (f *Factory) CreateMetricsReceiver( logger *zap.Logger, cfg configmodels.Receiver, consumer consumer.MetricsConsumer, diff --git a/receiver/jaegerreceiver/factory_test.go b/receiver/jaegerreceiver/factory_test.go index 4dfa6486601..95629771e61 100644 --- a/receiver/jaegerreceiver/factory_test.go +++ b/receiver/jaegerreceiver/factory_test.go @@ -22,17 +22,16 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" - "github.com/open-telemetry/opentelemetry-service/receiver" ) func TestCreateDefaultConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateReceiver(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() tReceiver, err := factory.CreateTraceReceiver(context.Background(), zap.NewNop(), cfg, nil) @@ -45,7 +44,7 @@ func TestCreateReceiver(t *testing.T) { } func TestCreateNoEndpoints(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() rCfg := cfg.(*Config) @@ -56,7 +55,7 @@ func TestCreateNoEndpoints(t *testing.T) { } func TestCreateInvalidTChannelEndpoint(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() rCfg := cfg.(*Config) @@ -66,7 +65,7 @@ func TestCreateInvalidTChannelEndpoint(t *testing.T) { } func TestCreateNoPort(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() rCfg := cfg.(*Config) @@ -76,7 +75,7 @@ func TestCreateNoPort(t *testing.T) { } func TestCreateLargePort(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() rCfg := cfg.(*Config) @@ -86,7 +85,7 @@ func TestCreateLargePort(t *testing.T) { } func TestCreateNoProtocols(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() rCfg := cfg.(*Config) diff --git a/receiver/opencensusreceiver/config_test.go b/receiver/opencensusreceiver/config_test.go index 49ec9f6af85..80be777422c 100644 --- a/receiver/opencensusreceiver/config_test.go +++ b/receiver/opencensusreceiver/config_test.go @@ -23,16 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - - factory := receiver.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + receivers[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/receiver/opencensusreceiver/factory.go b/receiver/opencensusreceiver/factory.go index 0e80176a3eb..cb7a7f81ccf 100644 --- a/receiver/opencensusreceiver/factory.go +++ b/receiver/opencensusreceiver/factory.go @@ -25,29 +25,27 @@ import ( "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = receiver.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "opencensus" ) -// factory is the factory for receiver. -type factory struct { +// Factory is the Factory for receiver. +type Factory struct { } -// Type gets the type of the Receiver config created by this factory. -func (f *factory) Type() string { +// Type gets the type of the Receiver config created by this Factory. +func (f *Factory) Type() string { return typeStr } // CustomUnmarshaler returns nil because we don't need custom unmarshaling for this config. -func (f *factory) CustomUnmarshaler() receiver.CustomUnmarshaler { +func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { return nil } // CreateDefaultConfig creates the default configuration for receiver. -func (f *factory) CreateDefaultConfig() configmodels.Receiver { +func (f *Factory) CreateDefaultConfig() configmodels.Receiver { return &Config{ ReceiverSettings: configmodels.ReceiverSettings{ TypeVal: typeStr, @@ -59,13 +57,12 @@ func (f *factory) CreateDefaultConfig() configmodels.Receiver { } // CreateTraceReceiver creates a trace receiver based on provided config. -func (f *factory) CreateTraceReceiver( +func (f *Factory) CreateTraceReceiver( ctx context.Context, logger *zap.Logger, cfg configmodels.Receiver, nextConsumer consumer.TraceConsumer, ) (receiver.TraceReceiver, error) { - r, err := f.createReceiver(cfg) if err != nil { return nil, err @@ -77,7 +74,7 @@ func (f *factory) CreateTraceReceiver( } // CreateMetricsReceiver creates a metrics receiver based on provided config. -func (f *factory) CreateMetricsReceiver( +func (f *Factory) CreateMetricsReceiver( logger *zap.Logger, cfg configmodels.Receiver, consumer consumer.MetricsConsumer, @@ -93,7 +90,7 @@ func (f *factory) CreateMetricsReceiver( return r, nil } -func (f *factory) createReceiver(cfg configmodels.Receiver) (*Receiver, error) { +func (f *Factory) createReceiver(cfg configmodels.Receiver) (*Receiver, error) { rCfg := cfg.(*Config) // There must be one receiver for both metrics and traces. We maintain a map of @@ -115,7 +112,7 @@ func (f *factory) createReceiver(cfg configmodels.Receiver) (*Receiver, error) { } // This is the map of already created OpenCensus receivers for particular configurations. -// We maintain this map because the factory is asked trace and metric receivers separately +// We maintain this map because the Factory is asked trace and metric receivers separately // when it gets CreateTraceReceiver() and CreateMetricsReceiver() but they must not // create separate objects, they must use one Receiver object per configuration. var receivers = map[*Config]*Receiver{} diff --git a/receiver/opencensusreceiver/factory_test.go b/receiver/opencensusreceiver/factory_test.go index dcbb3a114c3..97e888520f8 100644 --- a/receiver/opencensusreceiver/factory_test.go +++ b/receiver/opencensusreceiver/factory_test.go @@ -23,17 +23,16 @@ import ( "github.com/stretchr/testify/assert" "github.com/open-telemetry/opentelemetry-service/internal/testutils" - "github.com/open-telemetry/opentelemetry-service/receiver" ) func TestCreateDefaultConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateReceiver(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := Factory{} cfg := factory.CreateDefaultConfig() config := cfg.(*Config) diff --git a/receiver/prometheusreceiver/config_test.go b/receiver/prometheusreceiver/config_test.go index a4be976f136..e63992c2c7b 100644 --- a/receiver/prometheusreceiver/config_test.go +++ b/receiver/prometheusreceiver/config_test.go @@ -24,15 +24,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + receivers[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/receiver/prometheusreceiver/factory.go b/receiver/prometheusreceiver/factory.go index 874c9765c62..45185077577 100644 --- a/receiver/prometheusreceiver/factory.go +++ b/receiver/prometheusreceiver/factory.go @@ -30,24 +30,24 @@ import ( // This file implements config V2 for Prometheus receiver. -var _ = receiver.RegisterFactory(&factory{}) +// var _ = receiver.RegisterFactory(&factory{}) const ( // The value of "type" key in configuration. typeStr = "prometheus" ) -// factory is the factory for receiver. -type factory struct { +// Factory is the factory for receiver. +type Factory struct { } // Type gets the type of the Receiver config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CustomUnmarshaler returns custom unmarshaler for this config. -func (f *factory) CustomUnmarshaler() receiver.CustomUnmarshaler { +func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { return CustomUnmarshalerFunc } @@ -86,7 +86,7 @@ func CustomUnmarshalerFunc(v *viper.Viper, viperKey string, intoCfg interface{}) } // CreateDefaultConfig creates the default configuration for receiver. -func (f *factory) CreateDefaultConfig() configmodels.Receiver { +func (f *Factory) CreateDefaultConfig() configmodels.Receiver { return &Config{ ReceiverSettings: configmodels.ReceiverSettings{ TypeVal: typeStr, @@ -97,7 +97,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Receiver { } // CreateTraceReceiver creates a trace receiver based on provided config. -func (f *factory) CreateTraceReceiver( +func (f *Factory) CreateTraceReceiver( ctx context.Context, logger *zap.Logger, cfg configmodels.Receiver, @@ -108,7 +108,7 @@ func (f *factory) CreateTraceReceiver( } // CreateMetricsReceiver creates a metrics receiver based on provided config. -func (f *factory) CreateMetricsReceiver( +func (f *Factory) CreateMetricsReceiver( logger *zap.Logger, cfg configmodels.Receiver, consumer consumer.MetricsConsumer, diff --git a/receiver/prometheusreceiver/factory_test.go b/receiver/prometheusreceiver/factory_test.go index b527e0c0cb9..e1a03182b70 100644 --- a/receiver/prometheusreceiver/factory_test.go +++ b/receiver/prometheusreceiver/factory_test.go @@ -21,18 +21,17 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" - "github.com/open-telemetry/opentelemetry-service/receiver" "github.com/stretchr/testify/assert" ) func TestCreateDefaultConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateReceiver(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() tReceiver, err := factory.CreateTraceReceiver(context.Background(), zap.NewNop(), cfg, nil) diff --git a/receiver/vmmetricsreceiver/config_test.go b/receiver/vmmetricsreceiver/config_test.go index 8aa56628f36..4ac4b037b3a 100644 --- a/receiver/vmmetricsreceiver/config_test.go +++ b/receiver/vmmetricsreceiver/config_test.go @@ -24,15 +24,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + receivers[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/receiver/vmmetricsreceiver/factory.go b/receiver/vmmetricsreceiver/factory.go index 06e98edda8b..ac714a41d93 100644 --- a/receiver/vmmetricsreceiver/factory.go +++ b/receiver/vmmetricsreceiver/factory.go @@ -27,31 +27,29 @@ import ( "github.com/open-telemetry/opentelemetry-service/receiver" ) -// This file implements factory for VMMetrics receiver. - -var _ = receiver.RegisterFactory(&factory{}) +// This file implements Factory for VMMetrics receiver. const ( // The value of "type" key in configuration. typeStr = "vmmetrics" ) -// factory is the factory for receiver. -type factory struct { +// Factory is the Factory for receiver. +type Factory struct { } -// Type gets the type of the Receiver config created by this factory. -func (f *factory) Type() string { +// Type gets the type of the Receiver config created by this Factory. +func (f *Factory) Type() string { return typeStr } // CustomUnmarshaler returns custom unmarshaler for this config. -func (f *factory) CustomUnmarshaler() receiver.CustomUnmarshaler { +func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { return nil } // CreateDefaultConfig creates the default configuration for receiver. -func (f *factory) CreateDefaultConfig() configmodels.Receiver { +func (f *Factory) CreateDefaultConfig() configmodels.Receiver { return &Config{ ReceiverSettings: configmodels.ReceiverSettings{ TypeVal: typeStr, @@ -61,7 +59,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Receiver { } // CreateTraceReceiver creates a trace receiver based on provided config. -func (f *factory) CreateTraceReceiver( +func (f *Factory) CreateTraceReceiver( ctx context.Context, logger *zap.Logger, cfg configmodels.Receiver, @@ -72,7 +70,7 @@ func (f *factory) CreateTraceReceiver( } // CreateMetricsReceiver creates a metrics receiver based on provided config. -func (f *factory) CreateMetricsReceiver( +func (f *Factory) CreateMetricsReceiver( logger *zap.Logger, config configmodels.Receiver, consumer consumer.MetricsConsumer, diff --git a/receiver/vmmetricsreceiver/factory_test.go b/receiver/vmmetricsreceiver/factory_test.go index 468c0a19788..ba43829dede 100644 --- a/receiver/vmmetricsreceiver/factory_test.go +++ b/receiver/vmmetricsreceiver/factory_test.go @@ -24,17 +24,16 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-service/config/configerror" - "github.com/open-telemetry/opentelemetry-service/receiver" ) func TestCreateDefaultConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } func TestCreateReceiver(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() tReceiver, err := factory.CreateTraceReceiver(context.Background(), zap.NewNop(), cfg, nil) diff --git a/receiver/zipkinreceiver/config_test.go b/receiver/zipkinreceiver/config_test.go index 92761e77180..143ceb76579 100644 --- a/receiver/zipkinreceiver/config_test.go +++ b/receiver/zipkinreceiver/config_test.go @@ -23,15 +23,17 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" - "github.com/open-telemetry/opentelemetry-service/receiver" ) -var _ = config.RegisterTestFactories() - func TestLoadConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) - - cfg, err := config.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml")) + receivers, processors, exporters, err := config.ExampleComponents() + assert.Nil(t, err) + + factory := &Factory{} + receivers[typeStr] = factory + cfg, err := config.LoadConfigFile( + t, path.Join(".", "testdata", "config.yaml"), receivers, processors, exporters, + ) require.NoError(t, err) require.NotNil(t, cfg) diff --git a/receiver/zipkinreceiver/factory.go b/receiver/zipkinreceiver/factory.go index d5bf35766ed..3570a26f009 100644 --- a/receiver/zipkinreceiver/factory.go +++ b/receiver/zipkinreceiver/factory.go @@ -27,8 +27,6 @@ import ( // This file implements factory for Zipkin receiver. -var _ = receiver.RegisterFactory(&factory{}) - const ( // The value of "type" key in configuration. typeStr = "zipkin" @@ -36,22 +34,22 @@ const ( defaultBindEndpoint = "127.0.0.1:9411" ) -// factory is the factory for Zipkin receiver. -type factory struct { +// Factory is the factory for Zipkin receiver. +type Factory struct { } // Type gets the type of the Receiver config created by this factory. -func (f *factory) Type() string { +func (f *Factory) Type() string { return typeStr } // CustomUnmarshaler returns nil because we don't need custom unmarshaling for this config. -func (f *factory) CustomUnmarshaler() receiver.CustomUnmarshaler { +func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { return nil } // CreateDefaultConfig creates the default configuration for Jaeger receiver. -func (f *factory) CreateDefaultConfig() configmodels.Receiver { +func (f *Factory) CreateDefaultConfig() configmodels.Receiver { return &Config{ ReceiverSettings: configmodels.ReceiverSettings{ TypeVal: typeStr, @@ -62,7 +60,7 @@ func (f *factory) CreateDefaultConfig() configmodels.Receiver { } // CreateTraceReceiver creates a trace receiver based on provided config. -func (f *factory) CreateTraceReceiver( +func (f *Factory) CreateTraceReceiver( ctx context.Context, logger *zap.Logger, cfg configmodels.Receiver, @@ -74,7 +72,7 @@ func (f *factory) CreateTraceReceiver( } // CreateMetricsReceiver creates a metrics receiver based on provided config. -func (f *factory) CreateMetricsReceiver( +func (f *Factory) CreateMetricsReceiver( logger *zap.Logger, cfg configmodels.Receiver, consumer consumer.MetricsConsumer, diff --git a/receiver/zipkinreceiver/factory_test.go b/receiver/zipkinreceiver/factory_test.go index bbdb4daff60..69036c7341a 100644 --- a/receiver/zipkinreceiver/factory_test.go +++ b/receiver/zipkinreceiver/factory_test.go @@ -25,11 +25,10 @@ import ( "github.com/open-telemetry/opentelemetry-service/config/configerror" "github.com/open-telemetry/opentelemetry-service/config/configmodels" "github.com/open-telemetry/opentelemetry-service/consumer/consumerdata" - "github.com/open-telemetry/opentelemetry-service/receiver" ) func TestCreateDefaultConfig(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() assert.NotNil(t, cfg, "failed to create default config") } @@ -42,7 +41,7 @@ func (m *mockTraceConsumer) ConsumeTraceData(ctx context.Context, td consumerdat } func TestCreateReceiver(t *testing.T) { - factory := receiver.GetFactory(typeStr) + factory := &Factory{} cfg := factory.CreateDefaultConfig() tReceiver, err := factory.CreateTraceReceiver(context.Background(), zap.NewNop(), cfg, &mockTraceConsumer{}) diff --git a/service/builder/exporters_builder.go b/service/builder/exporters_builder.go index 315cabbf27e..1b4d7d9a6f1 100644 --- a/service/builder/exporters_builder.go +++ b/service/builder/exporters_builder.go @@ -62,13 +62,18 @@ type exportersRequiredDataTypes map[configmodels.Exporter]dataTypeRequirements // ExportersBuilder builds exporters from config. type ExportersBuilder struct { - logger *zap.Logger - config *configmodels.Config + logger *zap.Logger + config *configmodels.Config + factories map[string]exporter.Factory } // NewExportersBuilder creates a new ExportersBuilder. Call Build() on the returned value. -func NewExportersBuilder(logger *zap.Logger, config *configmodels.Config) *ExportersBuilder { - return &ExportersBuilder{logger, config} +func NewExportersBuilder( + logger *zap.Logger, + config *configmodels.Config, + factories map[string]exporter.Factory, +) *ExportersBuilder { + return &ExportersBuilder{logger, config, factories} } // Build exporters from config. @@ -154,7 +159,10 @@ func (eb *ExportersBuilder) buildExporter( exportersInputDataTypes exportersRequiredDataTypes, ) (*builtExporter, error) { - factory := exporter.GetFactory(config.Type()) + factory := eb.factories[config.Type()] + if factory == nil { + return nil, fmt.Errorf("exporter factory not found for type: %s", config.Type()) + } exporter := &builtExporter{} diff --git a/service/builder/exporters_builder_test.go b/service/builder/exporters_builder_test.go index 7d184ef903b..a1d44a564f1 100644 --- a/service/builder/exporters_builder_test.go +++ b/service/builder/exporters_builder_test.go @@ -23,12 +23,18 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" "github.com/open-telemetry/opentelemetry-service/exporter/opencensusexporter" ) func TestExportersBuilder_Build(t *testing.T) { - config := &configmodels.Config{ + _, _, exporterFactories, err := config.ExampleComponents() + assert.Nil(t, err) + + oceFactory := &opencensusexporter.Factory{} + exporterFactories[oceFactory.Type()] = oceFactory + cfg := &configmodels.Config{ Exporters: map[string]configmodels.Exporter{ "opencensus": &opencensusexporter.Config{ ExporterSettings: configmodels.ExporterSettings{ @@ -49,12 +55,12 @@ func TestExportersBuilder_Build(t *testing.T) { }, } - exporters, err := NewExportersBuilder(zap.NewNop(), config).Build() + exporters, err := NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() assert.NoError(t, err) require.NotNil(t, exporters) - e1 := exporters[config.Exporters["opencensus"]] + e1 := exporters[cfg.Exporters["opencensus"]] // Ensure exporter has its fields correctly populated. require.NotNil(t, e1) @@ -67,19 +73,19 @@ func TestExportersBuilder_Build(t *testing.T) { // Now change only pipeline data type to "metrics" and make sure exporter builder // now fails (because opencensus exporter does not currently support metrics). - config.Pipelines["trace"].InputType = configmodels.MetricsDataType - _, err = NewExportersBuilder(zap.NewNop(), config).Build() + cfg.Pipelines["trace"].InputType = configmodels.MetricsDataType + _, err = NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() assert.NotNil(t, err) // Remove the pipeline so that the exporter is not attached to any pipeline. // This should result in creating an exporter that has none of consumption // functions set. - delete(config.Pipelines, "trace") - exporters, err = NewExportersBuilder(zap.NewNop(), config).Build() + delete(cfg.Pipelines, "trace") + exporters, err = NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() assert.NotNil(t, exporters) assert.Nil(t, err) - e1 = exporters[config.Exporters["opencensus"]] + e1 = exporters[cfg.Exporters["opencensus"]] // Ensure exporter has its fields correctly populated. require.NotNil(t, e1) diff --git a/service/builder/pipelines_builder.go b/service/builder/pipelines_builder.go index f8f883df766..7f3fc4ee68f 100644 --- a/service/builder/pipelines_builder.go +++ b/service/builder/pipelines_builder.go @@ -41,6 +41,7 @@ type PipelinesBuilder struct { logger *zap.Logger config *configmodels.Config exporters Exporters + factories map[string]processor.Factory } // NewPipelinesBuilder creates a new PipelinesBuilder. Requires exporters to be already @@ -49,8 +50,9 @@ func NewPipelinesBuilder( logger *zap.Logger, config *configmodels.Config, exporters Exporters, + factories map[string]processor.Factory, ) *PipelinesBuilder { - return &PipelinesBuilder{logger, config, exporters} + return &PipelinesBuilder{logger, config, exporters, factories} } // Build pipeline processors from config. @@ -96,7 +98,7 @@ func (pb *PipelinesBuilder) buildPipeline( procName := pipelineCfg.Processors[i] procCfg := pb.config.Processors[procName] - factory := processor.GetFactory(procCfg.Type()) + factory := pb.factories[procCfg.Type()] // This processor must point to the next consumer and then // it becomes the next for the previous one (previous in the pipeline, diff --git a/service/builder/pipelines_builder_test.go b/service/builder/pipelines_builder_test.go index 3b2c551e7ea..3f1e3445b19 100644 --- a/service/builder/pipelines_builder_test.go +++ b/service/builder/pipelines_builder_test.go @@ -31,12 +31,6 @@ import ( "github.com/open-telemetry/opentelemetry-service/processor/addattributesprocessor" ) -// Ensure attributes processor is registered. -var _ = addattributesprocessor.Config{} - -// Register test factories used in the pipelines_builder.yaml test config. -var _ = config.RegisterTestFactories() - func TestPipelinesBuilder_Build(t *testing.T) { tests := []struct { name string @@ -63,13 +57,19 @@ func TestPipelinesBuilder_Build(t *testing.T) { } func testPipeline(t *testing.T, pipelineName string, exporterNames []string) { + receiverFactories, processorsFactories, exporterFactories, err := config.ExampleComponents() + assert.Nil(t, err) + attrFactory := &addattributesprocessor.Factory{} + processorsFactories[attrFactory.Type()] = attrFactory + cfg, err := config.LoadConfigFile( + t, "testdata/pipelines_builder.yaml", receiverFactories, processorsFactories, exporterFactories, + ) // Load the config - cfg, err := config.LoadConfigFile(t, "testdata/pipelines_builder.yaml") require.Nil(t, err) // Build the pipeline - allExporters, err := NewExportersBuilder(zap.NewNop(), cfg).Build() - pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters).Build() + allExporters, err := NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() + pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters, processorsFactories).Build() assert.NoError(t, err) require.NotNil(t, pipelineProcessors) @@ -124,7 +124,13 @@ func testPipeline(t *testing.T, pipelineName string, exporterNames []string) { } func TestPipelinesBuilder_Error(t *testing.T) { - cfg, err := config.LoadConfigFile(t, "testdata/pipelines_builder.yaml") + receiverFactories, processorsFactories, exporterFactories, err := config.ExampleComponents() + assert.Nil(t, err) + attrFactory := &addattributesprocessor.Factory{} + processorsFactories[attrFactory.Type()] = attrFactory + cfg, err := config.LoadConfigFile( + t, "testdata/pipelines_builder.yaml", receiverFactories, processorsFactories, exporterFactories, + ) require.Nil(t, err) // Corrupt the pipeline, change data type to metrics. We have to forcedly do it here @@ -133,11 +139,11 @@ func TestPipelinesBuilder_Error(t *testing.T) { pipeline := cfg.Pipelines["traces"] pipeline.InputType = configmodels.MetricsDataType - exporters, err := NewExportersBuilder(zap.NewNop(), cfg).Build() + exporters, err := NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() // This should fail because "attributes" processor defined in the config does // not support metrics data type. - _, err = NewPipelinesBuilder(zap.NewNop(), cfg, exporters).Build() + _, err = NewPipelinesBuilder(zap.NewNop(), cfg, exporters, processorsFactories).Build() assert.NotNil(t, err) } diff --git a/service/builder/receivers_builder.go b/service/builder/receivers_builder.go index 9b637c79f6b..10a982fd0a6 100644 --- a/service/builder/receivers_builder.go +++ b/service/builder/receivers_builder.go @@ -103,6 +103,7 @@ type ReceiversBuilder struct { logger *zap.Logger config *configmodels.Config pipelineProcessors PipelineProcessors + factories map[string]receiver.Factory } // NewReceiversBuilder creates a new ReceiversBuilder. Call Build() on the returned value. @@ -110,8 +111,9 @@ func NewReceiversBuilder( logger *zap.Logger, config *configmodels.Config, pipelineProcessors PipelineProcessors, + factories map[string]receiver.Factory, ) *ReceiversBuilder { - return &ReceiversBuilder{logger, config, pipelineProcessors} + return &ReceiversBuilder{logger, config, pipelineProcessors, factories} } // Build receivers from config. @@ -222,7 +224,10 @@ func (rb *ReceiversBuilder) buildReceiver(config configmodels.Receiver) (*builtR } // Prepare to build the receiver. - factory := receiver.GetFactory(config.Type()) + factory := rb.factories[config.Type()] + if factory == nil { + return nil, fmt.Errorf("receiver factory not found for type: %s", config.Type()) + } rcv := &builtReceiver{} // Now we have list of pipelines broken down by data type. Iterate for each data type. diff --git a/service/builder/receivers_builder_test.go b/service/builder/receivers_builder_test.go index 750ecbb26ee..d446b9e81c3 100644 --- a/service/builder/receivers_builder_test.go +++ b/service/builder/receivers_builder_test.go @@ -29,6 +29,7 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/config/configmodels" "github.com/open-telemetry/opentelemetry-service/consumer/consumerdata" + "github.com/open-telemetry/opentelemetry-service/processor/addattributesprocessor" "github.com/open-telemetry/opentelemetry-service/receiver/receivertest" ) @@ -90,14 +91,20 @@ func testReceivers( t *testing.T, test testCase, ) { - // Load the config - cfg, err := config.LoadConfigFile(t, "testdata/pipelines_builder.yaml") + receiverFactories, processorsFactories, exporterFactories, err := config.ExampleComponents() + assert.Nil(t, err) + + attrFactory := &addattributesprocessor.Factory{} + processorsFactories[attrFactory.Type()] = attrFactory + cfg, err := config.LoadConfigFile( + t, "testdata/pipelines_builder.yaml", receiverFactories, processorsFactories, exporterFactories, + ) require.Nil(t, err) // Build the pipeline - allExporters, err := NewExportersBuilder(zap.NewNop(), cfg).Build() - pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters).Build() - receivers, err := NewReceiversBuilder(zap.NewNop(), cfg, pipelineProcessors).Build() + allExporters, err := NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() + pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters, processorsFactories).Build() + receivers, err := NewReceiversBuilder(zap.NewNop(), cfg, pipelineProcessors, receiverFactories).Build() assert.NoError(t, err) require.NotNil(t, receivers) @@ -197,17 +204,24 @@ func testReceivers( } func TestReceiversBuilder_DataTypeError(t *testing.T) { - cfg, err := config.LoadConfigFile(t, "testdata/pipelines_builder.yaml") - require.Nil(t, err) + receiverFactories, processorsFactories, exporterFactories, err := config.ExampleComponents() + assert.Nil(t, err) + + attrFactory := &addattributesprocessor.Factory{} + processorsFactories[attrFactory.Type()] = attrFactory + cfg, err := config.LoadConfigFile( + t, "testdata/pipelines_builder.yaml", receiverFactories, processorsFactories, exporterFactories, + ) + assert.Nil(t, err) // Make examplereceiver to "unsupport" trace data type. receiver := cfg.Receivers["examplereceiver"] receiver.(*config.ExampleReceiver).FailTraceCreation = true // Build the pipeline - allExporters, err := NewExportersBuilder(zap.NewNop(), cfg).Build() - pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters).Build() - receivers, err := NewReceiversBuilder(zap.NewNop(), cfg, pipelineProcessors).Build() + allExporters, err := NewExportersBuilder(zap.NewNop(), cfg, exporterFactories).Build() + pipelineProcessors, err := NewPipelinesBuilder(zap.NewNop(), cfg, allExporters, processorsFactories).Build() + receivers, err := NewReceiversBuilder(zap.NewNop(), cfg, pipelineProcessors, receiverFactories).Build() // This should fail because "examplereceiver" is attached to "traces" pipeline // which is a configuration error. diff --git a/service/factories_registration.go b/service/factories_registration.go deleted file mode 100644 index 56ed6aad4ac..00000000000 --- a/service/factories_registration.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019, OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package service - -import ( - // This is a temporary workaround to register all factories that are already - // implemented. This will be removed and factories will be directly registered - // via code. - _ "github.com/open-telemetry/opentelemetry-service/exporter/loggingexporter" - _ "github.com/open-telemetry/opentelemetry-service/exporter/opencensusexporter" - _ "github.com/open-telemetry/opentelemetry-service/exporter/prometheusexporter" - _ "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/nodebatcher" - _ "github.com/open-telemetry/opentelemetry-service/internal/collector/processor/queued" - _ "github.com/open-telemetry/opentelemetry-service/processor/addattributesprocessor" - _ "github.com/open-telemetry/opentelemetry-service/receiver/jaegerreceiver" - _ "github.com/open-telemetry/opentelemetry-service/receiver/opencensusreceiver" - _ "github.com/open-telemetry/opentelemetry-service/receiver/prometheusreceiver" - _ "github.com/open-telemetry/opentelemetry-service/receiver/vmmetricsreceiver" - _ "github.com/open-telemetry/opentelemetry-service/receiver/zipkinreceiver" -) diff --git a/service/service.go b/service/service.go index 4089673c486..93b5a94e2fc 100644 --- a/service/service.go +++ b/service/service.go @@ -31,18 +31,15 @@ import ( "github.com/open-telemetry/opentelemetry-service/config" "github.com/open-telemetry/opentelemetry-service/consumer" + "github.com/open-telemetry/opentelemetry-service/exporter" "github.com/open-telemetry/opentelemetry-service/internal/config/viperutils" "github.com/open-telemetry/opentelemetry-service/internal/pprofserver" "github.com/open-telemetry/opentelemetry-service/internal/zpagesserver" + "github.com/open-telemetry/opentelemetry-service/processor" "github.com/open-telemetry/opentelemetry-service/receiver" "github.com/open-telemetry/opentelemetry-service/service/builder" ) -var ( - // App represents the collector application in its entirety - App = newApp() -) - // Application represents a collector application type Application struct { v *viper.Viper @@ -53,6 +50,11 @@ type Application struct { exporters builder.Exporters builtReceivers builder.Receivers + // factories + receiverFactories map[string]receiver.Factory + exporterFactories map[string]exporter.Factory + processorFactories map[string]processor.Factory + // stopTestChan is used to terminate the application in end to end tests. stopTestChan chan struct{} // readyChan is used in tests to indicate that the application is ready. @@ -90,10 +92,18 @@ func (app *Application) OkToIngest() bool { return true } -func newApp() *Application { +// New creates and returns a new instance of Application +func New( + receiverFactories map[string]receiver.Factory, + processorFactories map[string]processor.Factory, + exporterFactories map[string]exporter.Factory, +) *Application { return &Application{ - v: viper.New(), - readyChan: make(chan struct{}), + v: viper.New(), + readyChan: make(chan struct{}), + receiverFactories: receiverFactories, + processorFactories: processorFactories, + exporterFactories: exporterFactories, } } @@ -198,7 +208,7 @@ func (app *Application) setupPipelines() { app.logger.Info("Loading configuration...") // Load configuration. - cfg, err := config.Load(app.v) + cfg, err := config.Load(app.v, app.receiverFactories, app.processorFactories, app.exporterFactories) if err != nil { log.Fatalf("Cannot load configuration: %v", err) } @@ -209,20 +219,20 @@ func (app *Application) setupPipelines() { // which are referenced before objects which reference them. // First create exporters. - app.exporters, err = builder.NewExportersBuilder(app.logger, cfg).Build() + app.exporters, err = builder.NewExportersBuilder(app.logger, cfg, app.exporterFactories).Build() if err != nil { log.Fatalf("Cannot load configuration: %v", err) } // Create pipelines and their processors and plug exporters to the // end of the pipelines. - pipelines, err := builder.NewPipelinesBuilder(app.logger, cfg, app.exporters).Build() + pipelines, err := builder.NewPipelinesBuilder(app.logger, cfg, app.exporters, app.processorFactories).Build() if err != nil { log.Fatalf("Cannot load configuration: %v", err) } // Create receivers and plug them into the start of the pipelines. - app.builtReceivers, err = builder.NewReceiversBuilder(app.logger, cfg, pipelines).Build() + app.builtReceivers, err = builder.NewReceiversBuilder(app.logger, cfg, pipelines, app.receiverFactories).Build() if err != nil { log.Fatalf("Cannot load configuration: %v", err) } diff --git a/service/service_test.go b/service/service_test.go index 94e816ce9dc..82d934f6ab2 100644 --- a/service/service_test.go +++ b/service/service_test.go @@ -21,13 +21,18 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + + "github.com/open-telemetry/opentelemetry-service/defaults" "github.com/open-telemetry/opentelemetry-service/internal/testutils" "github.com/open-telemetry/opentelemetry-service/internal/zpagesserver" ) func TestApplication_StartUnified(t *testing.T) { + receiverFactories, processorsFactories, exporterFactories, err := defaults.Components() + assert.Nil(t, err) - App = newApp() + app := New(receiverFactories, processorsFactories, exporterFactories) portArg := []string{ healthCheckHTTPPort, // Keep it as first since its address is used later. @@ -40,23 +45,23 @@ func TestApplication_StartUnified(t *testing.T) { if err != nil { t.Fatalf("failed to split host and port from %q: %v", addr, err) } - App.v.Set(portArg[i], port) + app.v.Set(portArg[i], port) } - App.v.Set("config", "testdata/otelsvc-config.yaml") + app.v.Set("config", "testdata/otelsvc-config.yaml") appDone := make(chan struct{}) go func() { defer close(appDone) - if err := App.StartUnified(); err != nil { - t.Fatalf("App.StartUnified() got %v, want nil", err) + if err := app.StartUnified(); err != nil { + t.Fatalf("app.StartUnified() got %v, want nil", err) } }() - <-App.readyChan + <-app.readyChan if !isAppAvailable(t, "http://"+addresses[0]) { - t.Fatalf("App didn't reach ready state") + t.Fatalf("app didn't reach ready state") } // We have to wait here work around a data race bug in Jaeger @@ -71,7 +76,7 @@ func TestApplication_StartUnified(t *testing.T) { // to latest version. time.Sleep(1 * time.Second) - close(App.stopTestChan) + close(app.stopTestChan) <-appDone } diff --git a/testbed/go.mod b/testbed/go.mod index 64a52a5ade2..682ec653eb2 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -4,7 +4,6 @@ go 1.12 require ( contrib.go.opencensus.io/exporter/jaeger v0.1.1-0.20190430175949-e8b55949d948 - github.com/gogo/googleapis v1.2.0 // indirect github.com/open-telemetry/opentelemetry-service v0.0.0-20190625135304-4bd705a25a35 github.com/shirou/gopsutil v2.18.12+incompatible github.com/spf13/viper v1.4.0 diff --git a/testbed/go.sum b/testbed/go.sum index a3465bb0b3a..6584bfa2e87 100644 --- a/testbed/go.sum +++ b/testbed/go.sum @@ -1,5 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= contrib.go.opencensus.io/exporter/jaeger v0.1.1-0.20190430175949-e8b55949d948 h1:xdP25yLqNGSnpfDmEChwA9ZuKLdiyL0jqJKPm/Ypfag= contrib.go.opencensus.io/exporter/jaeger v0.1.1-0.20190430175949-e8b55949d948/go.mod h1:ukdzwIYYHgZ7QYtwVFQUjiT28BJHiMhTERo32s6qVgM= contrib.go.opencensus.io/exporter/ocagent v0.5.0 h1:TKXjQSRS0/cCDrP7KvkgU6SmILtF/yV2TOs/02K/WZQ= @@ -26,6 +27,7 @@ github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlE github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/aws/aws-sdk-go v0.0.0-20180507225419-00862f899353/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -87,19 +89,24 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20160529050041-d9eb7a3d35ec/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/gofuzz v0.0.0-20150304233714-bbcb9da2d746/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20180605153948-8b03ce837f34/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gnostic v0.0.0-20180520015035-48a0ecefe2e4/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.0.0-20181206160319-9d88c34913a9/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -143,6 +150,7 @@ github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGk github.com/jaegertracing/jaeger v1.9.0 h1:xtwGp/+H8kvT6q8LRrEOxMhZZGKO4Hsziy4pRmLIczM= github.com/jaegertracing/jaeger v1.9.0/go.mod h1:LUWPSnzNPGRubM8pk0inANGitpiMOOxihXx0+53llXI= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= @@ -190,6 +198,7 @@ github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.m github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.1 h1:IYN/cK5AaULfeMAlgFZSIBLSpsZ5MRHDy1fKBEqqJfQ= github.com/opentracing/opentracing-go v1.0.1/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/orijtech/prometheus-go-metrics-exporter v0.0.3-0.20190313163149-b321c5297f60 h1:vN7d/Zv6aOXqhspiqoEMkb6uFHNARVESmYn5XtNeyrk= github.com/orijtech/prometheus-go-metrics-exporter v0.0.3-0.20190313163149-b321c5297f60/go.mod h1:+Mu9w51Uc2RNKSUTA95d6Pvy8cxFiRX3ANRPlCcnGLA= @@ -273,6 +282,7 @@ github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1C1PjvOJnJykCzcD5QHbk= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtGoHJNe9ebLu/pw= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/tchannel-go v1.10.0 h1:YOihLHuvkwT3nzvpgqFtexFW+pb5vD1Tz7h/bIWApgE= @@ -314,6 +324,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgP golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -331,9 +342,11 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd h1:r7DufRZuZbWB7j439YfAzP8RP golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -353,6 +366,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -377,6 +391,7 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20181213150558-05914d821849/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/client-go v2.0.0-alpha.0.0.20181121191925-a47917edff34+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=