Skip to content

Commit b8f6ac1

Browse files
authored
Run OTEL collector without configuration file (#2148)
* Run OTEL collector without configuration file Signed-off-by: Pavol Loffay <[email protected]> * Remove print Signed-off-by: Pavol Loffay <[email protected]> * nits Signed-off-by: Pavol Loffay <[email protected]> * Fix test Signed-off-by: Pavol Loffay <[email protected]> * Run go mod tidy Signed-off-by: Pavol Loffay <[email protected]> * Remove get primary Signed-off-by: Pavol Loffay <[email protected]> * Fix review comments Signed-off-by: Pavol Loffay <[email protected]>
1 parent 87b1910 commit b8f6ac1

File tree

6 files changed

+428
-5
lines changed

6 files changed

+428
-5
lines changed
+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Copyright (c) 2020 The Jaeger Authors.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package defaults
16+
17+
import (
18+
"fmt"
19+
"strings"
20+
21+
"github.com/open-telemetry/opentelemetry-collector/config"
22+
"github.com/open-telemetry/opentelemetry-collector/config/configmodels"
23+
"github.com/open-telemetry/opentelemetry-collector/processor/batchprocessor"
24+
"github.com/open-telemetry/opentelemetry-collector/receiver"
25+
"github.com/open-telemetry/opentelemetry-collector/receiver/jaegerreceiver"
26+
27+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra"
28+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch"
29+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/kafka"
30+
)
31+
32+
// Config creates default configuration.
33+
// It enables default Jaeger receivers, processors and exporters.
34+
func Config(storageType string, factories config.Factories) (*configmodels.Config, error) {
35+
exporters, err := createExporters(storageType, factories)
36+
if err != nil {
37+
return nil, err
38+
}
39+
types := []string{}
40+
for _, v := range exporters {
41+
types = append(types, v.Type())
42+
}
43+
return &configmodels.Config{
44+
Receivers: createReceivers(factories),
45+
Exporters: exporters,
46+
Processors: createProcessors(factories),
47+
Service: configmodels.Service{
48+
Pipelines: map[string]*configmodels.Pipeline{
49+
"traces": {
50+
InputType: configmodels.TracesDataType,
51+
Receivers: []string{"jaeger"},
52+
Exporters: types,
53+
Processors: []string{"batch"},
54+
},
55+
},
56+
},
57+
}, nil
58+
}
59+
60+
func createReceivers(factories config.Factories) configmodels.Receivers {
61+
rec := factories.Receivers["jaeger"].CreateDefaultConfig().(*jaegerreceiver.Config)
62+
// TODO load and serve sampling strategies
63+
// TODO bind sampling strategies file
64+
rec.Protocols = map[string]*receiver.SecureReceiverSettings{
65+
"grpc": {
66+
ReceiverSettings: configmodels.ReceiverSettings{
67+
Endpoint: "localhost:14250",
68+
},
69+
},
70+
"thrift_http": {
71+
ReceiverSettings: configmodels.ReceiverSettings{
72+
Endpoint: "localhost:14268",
73+
},
74+
},
75+
"thrift_compact": {
76+
ReceiverSettings: configmodels.ReceiverSettings{
77+
Endpoint: "localhost:6831",
78+
},
79+
},
80+
"thrift_binary": {
81+
ReceiverSettings: configmodels.ReceiverSettings{
82+
Endpoint: "localhost:6832",
83+
},
84+
},
85+
}
86+
return map[string]configmodels.Receiver{
87+
"jaeger": rec,
88+
}
89+
}
90+
91+
func createExporters(storageTypes string, factories config.Factories) (configmodels.Exporters, error) {
92+
exporters := configmodels.Exporters{}
93+
for _, s := range strings.Split(storageTypes, ",") {
94+
switch s {
95+
case "cassandra":
96+
cass := factories.Exporters[cassandra.TypeStr].CreateDefaultConfig()
97+
exporters[cassandra.TypeStr] = cass
98+
case "elasticsearch":
99+
es := factories.Exporters[elasticsearch.TypeStr].CreateDefaultConfig()
100+
exporters[elasticsearch.TypeStr] = es
101+
case "kafka":
102+
kaf := factories.Exporters[kafka.TypeStr].CreateDefaultConfig()
103+
exporters[kafka.TypeStr] = kaf
104+
default:
105+
return nil, fmt.Errorf("unknown storage type: %s", s)
106+
}
107+
}
108+
return exporters, nil
109+
}
110+
111+
func createProcessors(factories config.Factories) configmodels.Processors {
112+
batch := factories.Processors["batch"].CreateDefaultConfig().(*batchprocessor.Config)
113+
return map[string]configmodels.Processor{
114+
"batch": batch,
115+
}
116+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright (c) 2020 The Jaeger Authors.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package defaults
16+
17+
import (
18+
"sort"
19+
"testing"
20+
21+
"github.com/open-telemetry/opentelemetry-collector/config"
22+
"github.com/open-telemetry/opentelemetry-collector/config/configmodels"
23+
"github.com/spf13/viper"
24+
"github.com/stretchr/testify/assert"
25+
"github.com/stretchr/testify/require"
26+
"go.uber.org/zap"
27+
28+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra"
29+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch"
30+
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/kafka"
31+
)
32+
33+
func TestDefaultConfig(t *testing.T) {
34+
factories := Components(viper.New())
35+
tests := []struct {
36+
storageType string
37+
exporterTypes []string
38+
pipeline map[string]*configmodels.Pipeline
39+
err string
40+
}{
41+
{
42+
storageType: "elasticsearch",
43+
exporterTypes: []string{elasticsearch.TypeStr},
44+
pipeline: map[string]*configmodels.Pipeline{
45+
"traces": {
46+
InputType: configmodels.TracesDataType,
47+
Receivers: []string{"jaeger"},
48+
Exporters: []string{elasticsearch.TypeStr},
49+
Processors: []string{"batch"},
50+
},
51+
},
52+
},
53+
{
54+
storageType: "cassandra",
55+
exporterTypes: []string{cassandra.TypeStr},
56+
pipeline: map[string]*configmodels.Pipeline{
57+
"traces": {
58+
InputType: configmodels.TracesDataType,
59+
Receivers: []string{"jaeger"},
60+
Exporters: []string{cassandra.TypeStr},
61+
Processors: []string{"batch"},
62+
},
63+
},
64+
},
65+
{
66+
storageType: "kafka",
67+
exporterTypes: []string{kafka.TypeStr},
68+
pipeline: map[string]*configmodels.Pipeline{
69+
"traces": {
70+
InputType: configmodels.TracesDataType,
71+
Receivers: []string{"jaeger"},
72+
Exporters: []string{kafka.TypeStr},
73+
Processors: []string{"batch"},
74+
},
75+
},
76+
},
77+
{
78+
storageType: "cassandra,elasticsearch",
79+
exporterTypes: []string{cassandra.TypeStr, elasticsearch.TypeStr},
80+
pipeline: map[string]*configmodels.Pipeline{
81+
"traces": {
82+
InputType: configmodels.TracesDataType,
83+
Receivers: []string{"jaeger"},
84+
Exporters: []string{cassandra.TypeStr, elasticsearch.TypeStr},
85+
Processors: []string{"batch"},
86+
},
87+
},
88+
},
89+
{
90+
storageType: "floppy",
91+
err: "unknown storage type: floppy",
92+
},
93+
}
94+
for _, test := range tests {
95+
t.Run(test.storageType, func(t *testing.T) {
96+
cfg, err := Config(test.storageType, factories)
97+
if test.err != "" {
98+
require.Nil(t, cfg)
99+
assert.EqualError(t, err, test.err)
100+
return
101+
}
102+
require.NoError(t, err)
103+
require.NoError(t, config.ValidateConfig(cfg, zap.NewNop()))
104+
105+
assert.Equal(t, 1, len(cfg.Receivers))
106+
assert.Equal(t, "jaeger", cfg.Receivers["jaeger"].Name())
107+
assert.Equal(t, 1, len(cfg.Processors))
108+
assert.Equal(t, "batch", cfg.Processors["batch"].Name())
109+
assert.Equal(t, len(test.exporterTypes), len(cfg.Exporters))
110+
111+
types := []string{}
112+
for _, v := range cfg.Exporters {
113+
types = append(types, v.Type())
114+
}
115+
sort.Strings(types)
116+
assert.Equal(t, test.exporterTypes, types)
117+
assert.EqualValues(t, test.pipeline, cfg.Service.Pipelines)
118+
})
119+
}
120+
121+
}

Diff for: cmd/opentelemetry-collector/app/defaults/defaults.go

+20
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
package defaults
1616

1717
import (
18+
"flag"
19+
1820
"github.com/open-telemetry/opentelemetry-collector/config"
1921
"github.com/open-telemetry/opentelemetry-collector/defaults"
22+
"github.com/spf13/pflag"
2023
"github.com/spf13/viper"
2124

2225
"github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra"
@@ -29,6 +32,12 @@ import (
2932

3033
// Components creates default and Jaeger factories
3134
func Components(v *viper.Viper) config.Factories {
35+
// Add flags to viper to make the default values available.
36+
// OTEL collector creates the default configuration in service.New() to validate that
37+
// factories can create config.
38+
// However, at this point the Jaeger storage flags are not added to viper.
39+
// The Jaeger storage flags are added to cobra and then to viper in main after service.New().
40+
initViper(v)
3241
kafkaExp := kafka.Factory{OptionsFactory: func() *storageKafka.Options {
3342
opts := kafka.DefaultOptions()
3443
opts.InitFromViper(v)
@@ -51,3 +60,14 @@ func Components(v *viper.Viper) config.Factories {
5160
factories.Exporters[esExp.Type()] = esExp
5261
return factories
5362
}
63+
64+
// initViper adds Jaeger storage flags to viper to make the default values available.
65+
func initViper(v *viper.Viper) {
66+
flagSet := &flag.FlagSet{}
67+
kafka.DefaultOptions().AddFlags(flagSet)
68+
elasticsearch.DefaultOptions().AddFlags(flagSet)
69+
cassandra.DefaultOptions().AddFlags(flagSet)
70+
pflagSet := &pflag.FlagSet{}
71+
pflagSet.AddGoFlagSet(flagSet)
72+
v.BindPFlags(pflagSet)
73+
}

Diff for: cmd/opentelemetry-collector/go.mod

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ replace github.com/jaegertracing/jaeger => ./../../
99
require (
1010
github.com/Shopify/sarama v1.22.2-0.20190604114437-cd910a683f9f
1111
github.com/census-instrumentation/opencensus-proto v0.2.1
12-
github.com/crossdock/crossdock-go v0.0.0-20160816171116-049aabb0122b
13-
github.com/gogo/protobuf v1.3.0
1412
github.com/jaegertracing/jaeger v1.17.0
1513
github.com/magiconair/properties v1.8.1
1614
github.com/open-telemetry/opentelemetry-collector v0.2.8-0.20200323151927-794a2b689bd9
15+
github.com/spf13/pflag v1.0.5
1716
github.com/spf13/viper v1.6.2
1817
github.com/stretchr/testify v1.5.0
1918
github.com/uber/jaeger-lib v2.2.0+incompatible

0 commit comments

Comments
 (0)