diff --git a/.gitignore b/.gitignore index 5e87a9ad875..224e5a58fcb 100644 --- a/.gitignore +++ b/.gitignore @@ -32,5 +32,6 @@ cmd/docs/*.1 cmd/docs/*.yaml crossdock/crossdock-* run-crossdock.log -cmd/opentelemetry-collector/opentelemetry-collector-* +cmd/opentelemetry-collector/cmd/collector/opentelemetry-collector-* +cmd/opentelemetry-collector/cmd/agent/opentelemetry-agent-* __pycache__ diff --git a/Makefile b/Makefile index 999bed3691c..9a9300b47dc 100644 --- a/Makefile +++ b/Makefile @@ -259,9 +259,17 @@ endif .PHONY: build-otel-collector build-otel-collector: elasticsearch-mappings ifeq ($(GOARCH), s390x) - cd ${OTEL_COLLECTOR_DIR} && $(GOBUILD) -o ./opentelemetry-collector-$(GOOS)-$(GOARCH) $(BUILD_INFO) main.go + cd ${OTEL_COLLECTOR_DIR}/cmd/collector && $(GOBUILD) -o ./opentelemetry-collector-$(GOOS)-$(GOARCH) $(BUILD_INFO) main.go else - cd ${OTEL_COLLECTOR_DIR} && $(GOBUILD) -o ./opentelemetry-collector-$(GOOS) $(BUILD_INFO) main.go + cd ${OTEL_COLLECTOR_DIR}/cmd/collector && $(GOBUILD) -o ./opentelemetry-collector-$(GOOS) $(BUILD_INFO) main.go +endif + +.PHONY: build-otel-agent +build-otel-agent: +ifeq ($(GOARCH), s390x) + cd ${OTEL_COLLECTOR_DIR}/cmd/agent && $(GOBUILD) -o ./opentelemetry-agent-$(GOOS)-$(GOARCH) $(BUILD_INFO) main.go +else + cd ${OTEL_COLLECTOR_DIR}/cmd/agent && $(GOBUILD) -o ./opentelemetry-agent-$(GOOS) $(BUILD_INFO) main.go endif .PHONY: build-ingester @@ -292,7 +300,7 @@ build-binaries-s390x: GOOS=linux GOARCH=s390x $(MAKE) build-platform-binaries .PHONY: build-platform-binaries -build-platform-binaries: build-agent build-collector build-query build-ingester build-all-in-one build-examples build-tracegen build-otel-collector +build-platform-binaries: build-agent build-collector build-query build-ingester build-all-in-one build-examples build-tracegen build-otel-collector build-otel-agent .PHONY: build-all-platforms build-all-platforms: build-binaries-linux build-binaries-windows build-binaries-darwin build-binaries-s390x @@ -310,10 +318,12 @@ docker-images-elastic: .PHONY: docker-images-jaeger-backend docker-images-jaeger-backend: - for component in agent collector query ingester opentelemetry-collector ; do \ + for component in agent collector query ingester ; do \ docker build -t $(DOCKER_NAMESPACE)/jaeger-$$component:${DOCKER_TAG} cmd/$$component ; \ echo "Finished building $$component ==============" ; \ done + docker build -t $(DOCKER_NAMESPACE)/jaeger-opentelemetry-collector:${DOCKER_TAG} -f ${OTEL_COLLECTOR_DIR}/cmd/collector/Dockerfile cmd/opentelemetry-collector/cmd/collector + docker build -t $(DOCKER_NAMESPACE)/jaeger-opentelemetry-agent:${DOCKER_TAG} -f ${OTEL_COLLECTOR_DIR}/cmd/agent/Dockerfile cmd/opentelemetry-collector/cmd/agent .PHONY: docker-images-tracegen docker-images-tracegen: diff --git a/cmd/opentelemetry-collector/app/defaults/default_config.go b/cmd/opentelemetry-collector/app/defaults/default_config.go index 5e29efd80eb..c280c32a891 100644 --- a/cmd/opentelemetry-collector/app/defaults/default_config.go +++ b/cmd/opentelemetry-collector/app/defaults/default_config.go @@ -20,6 +20,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector/config" "github.com/open-telemetry/opentelemetry-collector/config/configmodels" + "github.com/open-telemetry/opentelemetry-collector/extension/healthcheckextension" "github.com/open-telemetry/opentelemetry-collector/receiver" "github.com/open-telemetry/opentelemetry-collector/receiver/jaegerreceiver" "github.com/open-telemetry/opentelemetry-collector/receiver/zipkinreceiver" @@ -30,9 +31,17 @@ import ( "github.com/jaegertracing/jaeger/ports" ) -// Config creates default configuration. +const ( + gRPCEndpoint = "localhost:14250" + httpThriftBinaryEndpoint = "localhost:14268" + udpThriftCompactEndpoint = "localhost:6831" + udpThriftBinaryEndpoint = "localhost:6832" + httpSamplingEndpoint = "localhost:5778" +) + +// CollectorConfig creates default collector configuration. // It enables default Jaeger receivers, processors and exporters. -func Config(storageType string, zipkinHostPort string, factories config.Factories) (*configmodels.Config, error) { +func CollectorConfig(storageType string, zipkinHostPort string, factories config.Factories) (*configmodels.Config, error) { exporters, err := createExporters(storageType, factories) if err != nil { return nil, err @@ -41,7 +50,7 @@ func Config(storageType string, zipkinHostPort string, factories config.Factorie for _, v := range exporters { expTypes = append(expTypes, string(v.Type())) } - receivers := createReceivers(zipkinHostPort, factories) + receivers := createCollectorReceivers(zipkinHostPort, factories) recTypes := []string{} for _, v := range receivers { recTypes = append(recTypes, string(v.Type())) @@ -64,29 +73,19 @@ func Config(storageType string, zipkinHostPort string, factories config.Factorie }, nil } -func createReceivers(zipkinHostPort string, factories config.Factories) configmodels.Receivers { +func createCollectorReceivers(zipkinHostPort string, factories config.Factories) configmodels.Receivers { jaeger := factories.Receivers["jaeger"].CreateDefaultConfig().(*jaegerreceiver.Config) // TODO load and serve sampling strategies // TODO bind sampling strategies file jaeger.Protocols = map[string]*receiver.SecureReceiverSettings{ "grpc": { ReceiverSettings: configmodels.ReceiverSettings{ - Endpoint: "localhost:14250", + Endpoint: gRPCEndpoint, }, }, "thrift_http": { ReceiverSettings: configmodels.ReceiverSettings{ - Endpoint: "localhost:14268", - }, - }, - "thrift_compact": { - ReceiverSettings: configmodels.ReceiverSettings{ - Endpoint: "localhost:6831", - }, - }, - "thrift_binary": { - ReceiverSettings: configmodels.ReceiverSettings{ - Endpoint: "localhost:6832", + Endpoint: httpThriftBinaryEndpoint, }, }, } @@ -120,3 +119,45 @@ func createExporters(storageTypes string, factories config.Factories) (configmod } return exporters, nil } + +// AgentConfig creates default agent configuration. +// It enables Jaeger receiver with UDP endpoints and Jaeger exporter. +func AgentConfig(factories config.Factories) *configmodels.Config { + jaegerExporter := factories.Exporters["jaeger"] + hc := factories.Extensions["health_check"].CreateDefaultConfig().(*healthcheckextension.Config) + return &configmodels.Config{ + Receivers: createAgentReceivers(factories), + Exporters: configmodels.Exporters{"jaeger": jaegerExporter.CreateDefaultConfig()}, + Extensions: configmodels.Extensions{"health_check": hc}, + Service: configmodels.Service{ + Extensions: []string{"health_check"}, + Pipelines: map[string]*configmodels.Pipeline{ + "traces": { + InputType: configmodels.TracesDataType, + Receivers: []string{"jaeger"}, + Exporters: []string{"jaeger"}, + }, + }, + }, + } +} + +func createAgentReceivers(factories config.Factories) configmodels.Receivers { + jaeger := factories.Receivers["jaeger"].CreateDefaultConfig().(*jaegerreceiver.Config) + jaeger.Protocols = map[string]*receiver.SecureReceiverSettings{ + "thrift_compact": { + ReceiverSettings: configmodels.ReceiverSettings{ + Endpoint: udpThriftCompactEndpoint, + }, + }, + "thrift_binary": { + ReceiverSettings: configmodels.ReceiverSettings{ + Endpoint: udpThriftBinaryEndpoint, + }, + }, + } + recvs := map[string]configmodels.Receiver{ + "jaeger": jaeger, + } + return recvs +} diff --git a/cmd/opentelemetry-collector/app/defaults/default_config_test.go b/cmd/opentelemetry-collector/app/defaults/default_config_test.go index 794609f3972..9fbbe82ece6 100644 --- a/cmd/opentelemetry-collector/app/defaults/default_config_test.go +++ b/cmd/opentelemetry-collector/app/defaults/default_config_test.go @@ -20,18 +20,22 @@ import ( "github.com/open-telemetry/opentelemetry-collector/config" "github.com/open-telemetry/opentelemetry-collector/config/configmodels" + "github.com/open-telemetry/opentelemetry-collector/exporter/jaegerexporter" + "github.com/open-telemetry/opentelemetry-collector/receiver/jaegerreceiver" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" + "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/kafka" + jConfig "github.com/jaegertracing/jaeger/pkg/config" "github.com/jaegertracing/jaeger/ports" ) -func TestDefaultConfig(t *testing.T) { +func TestDefaultCollectorConfig(t *testing.T) { factories := Components(viper.New()) disabledHostPort := ports.PortToHostPort(0) tests := []struct { @@ -108,7 +112,7 @@ func TestDefaultConfig(t *testing.T) { } for _, test := range tests { t.Run(test.storageType, func(t *testing.T) { - cfg, err := Config(test.storageType, test.zipkinHostPort, factories) + cfg, err := CollectorConfig(test.storageType, test.zipkinHostPort, factories) if test.err != "" { require.Nil(t, cfg) assert.EqualError(t, err, test.err) @@ -135,3 +139,24 @@ func TestDefaultConfig(t *testing.T) { }) } } + +func TestDefaultAgentConfig(t *testing.T) { + v, _ := jConfig.Viperize(grpc.AddFlags) + factories := Components(v) + cfg := AgentConfig(factories) + assert.Equal(t, configmodels.Service{ + Extensions: []string{"health_check"}, + Pipelines: configmodels.Pipelines{ + "traces": &configmodels.Pipeline{ + InputType: configmodels.TracesDataType, + Receivers: []string{"jaeger"}, + Exporters: []string{"jaeger"}, + }, + }, + }, cfg.Service) + assert.Equal(t, 0, len(cfg.Processors)) + assert.Equal(t, 1, len(cfg.Receivers)) + assert.IsType(t, &jaegerreceiver.Config{}, cfg.Receivers["jaeger"]) + assert.Equal(t, 1, len(cfg.Exporters)) + assert.IsType(t, &jaegerexporter.Config{}, cfg.Exporters["jaeger"]) +} diff --git a/cmd/opentelemetry-collector/app/defaults/defaults.go b/cmd/opentelemetry-collector/app/defaults/defaults.go index a8c1cacb1ac..73eaaa42d40 100644 --- a/cmd/opentelemetry-collector/app/defaults/defaults.go +++ b/cmd/opentelemetry-collector/app/defaults/defaults.go @@ -18,6 +18,7 @@ import ( "flag" "github.com/open-telemetry/opentelemetry-collector/config" + otelJaegerEexporter "github.com/open-telemetry/opentelemetry-collector/exporter/jaegerexporter" otelJaegerreceiver "github.com/open-telemetry/opentelemetry-collector/receiver/jaegerreceiver" "github.com/open-telemetry/opentelemetry-collector/service/defaultcomponents" "github.com/spf13/pflag" @@ -25,6 +26,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/jaegerexporter" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/kafka" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/receiver/jaegerreceiver" storageCassandra "github.com/jaegertracing/jaeger/plugin/storage/cassandra" @@ -59,9 +61,14 @@ func Components(v *viper.Viper) config.Factories { factories.Exporters[cassandraExp.Type()] = cassandraExp factories.Exporters[esExp.Type()] = esExp - otelJRec := factories.Receivers["jaeger"].(*otelJaegerreceiver.Factory) + jaegerRec := factories.Receivers["jaeger"].(*otelJaegerreceiver.Factory) factories.Receivers["jaeger"] = &jaegerreceiver.Factory{ - Wrapped: otelJRec, + Wrapped: jaegerRec, + Viper: v, + } + jaegerExp := factories.Exporters["jaeger"].(*otelJaegerEexporter.Factory) + factories.Exporters["jaeger"] = &jaegerexporter.Factory{ + Wrapped: jaegerExp, Viper: v, } return factories diff --git a/cmd/opentelemetry-collector/app/defaults/defaults_test.go b/cmd/opentelemetry-collector/app/defaults/defaults_test.go index 33e19469c50..bab9ec6487d 100644 --- a/cmd/opentelemetry-collector/app/defaults/defaults_test.go +++ b/cmd/opentelemetry-collector/app/defaults/defaults_test.go @@ -17,17 +17,23 @@ package defaults import ( "testing" - "github.com/magiconair/properties/assert" "github.com/open-telemetry/opentelemetry-collector/config/configmodels" + "github.com/stretchr/testify/assert" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/jaegerexporter" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/kafka" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/receiver/jaegerreceiver" jConfig "github.com/jaegertracing/jaeger/pkg/config" ) func TestComponents(t *testing.T) { - v, _ := jConfig.Viperize(kafka.DefaultOptions().AddFlags, cassandra.DefaultOptions().AddFlags, elasticsearch.DefaultOptions().AddFlags) + v, _ := jConfig.Viperize( + kafka.DefaultOptions().AddFlags, + cassandra.DefaultOptions().AddFlags, + elasticsearch.DefaultOptions().AddFlags, + ) factories := Components(v) assert.Equal(t, configmodels.Type("jaeger_kafka"), factories.Exporters[kafka.TypeStr].Type()) assert.Equal(t, configmodels.Type("jaeger_cassandra"), factories.Exporters[cassandra.TypeStr].Type()) @@ -43,4 +49,6 @@ func TestComponents(t *testing.T) { esFactory := factories.Exporters[elasticsearch.TypeStr] ec := esFactory.CreateDefaultConfig().(*elasticsearch.Config) assert.Equal(t, []string{"http://127.0.0.1:9200"}, ec.GetPrimary().Servers) + assert.IsType(t, &jaegerreceiver.Factory{}, factories.Receivers["jaeger"]) + assert.IsType(t, &jaegerexporter.Factory{}, factories.Exporters["jaeger"]) } diff --git a/cmd/opentelemetry-collector/app/exporter/jaegerexporter/jaeger_exporter.go b/cmd/opentelemetry-collector/app/exporter/jaegerexporter/jaeger_exporter.go new file mode 100644 index 00000000000..e7a64e76c26 --- /dev/null +++ b/cmd/opentelemetry-collector/app/exporter/jaegerexporter/jaeger_exporter.go @@ -0,0 +1,77 @@ +// Copyright (c) 2020 The Jaeger 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 jaegerexporter + +import ( + "context" + + "github.com/open-telemetry/opentelemetry-collector/component" + "github.com/open-telemetry/opentelemetry-collector/config/configmodels" + "github.com/open-telemetry/opentelemetry-collector/exporter/jaegerexporter" + "github.com/spf13/viper" + + "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc" +) + +// Factory wraps jaegerexporter.Factory and makes the default config configurable via viper. +// For instance this enables using flags as default values in the config object. +type Factory struct { + // Wrapped is Jaeger receiver. + Wrapped *jaegerexporter.Factory + // Viper is used to get configuration values for default configuration + Viper *viper.Viper +} + +var _ component.ExporterFactory = (*Factory)(nil) + +// Type returns the type of the exporter. +func (f Factory) Type() configmodels.Type { + return f.Wrapped.Type() +} + +// CreateDefaultConfig returns default configuration of Factory. +// This function implements OTEL component.ExporterFactoryBase interface. +func (f Factory) CreateDefaultConfig() configmodels.Exporter { + repCfg := grpc.ConnBuilder{} + repCfg.InitFromViper(f.Viper) + cfg := f.Wrapped.CreateDefaultConfig().(*jaegerexporter.Config) + if len(repCfg.CollectorHostPorts) > 0 { + cfg.Endpoint = repCfg.CollectorHostPorts[0] + } + cfg.GRPCSettings.UseSecure = repCfg.TLS.Enabled + cfg.GRPCSettings.CertPemFile = repCfg.TLS.CertPath + cfg.GRPCSettings.ServerNameOverride = repCfg.TLS.ServerName + return cfg +} + +// CreateTraceExporter creates Jaeger trace exporter. +// This function implements OTEL component.ExporterFactory interface. +func (f Factory) CreateTraceExporter( + ctx context.Context, + params component.ExporterCreateParams, + cfg configmodels.Exporter, +) (component.TraceExporter, error) { + return f.Wrapped.CreateTraceExporter(ctx, params, cfg) +} + +// CreateMetricsExporter creates a metrics exporter based on provided config. +// This function implements component.ExporterFactory. +func (f Factory) CreateMetricsExporter( + ctx context.Context, + params component.ExporterCreateParams, + cfg configmodels.Exporter, +) (component.MetricsExporter, error) { + return f.Wrapped.CreateMetricsExporter(ctx, params, cfg) +} diff --git a/cmd/opentelemetry-collector/app/receiver/jaegerreceiver/jaeger_receiver.go b/cmd/opentelemetry-collector/app/receiver/jaegerreceiver/jaeger_receiver.go index 96e7690a07c..f90f4ca8c12 100644 --- a/cmd/opentelemetry-collector/app/receiver/jaegerreceiver/jaeger_receiver.go +++ b/cmd/opentelemetry-collector/app/receiver/jaegerreceiver/jaeger_receiver.go @@ -23,6 +23,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector/receiver/jaegerreceiver" "github.com/spf13/viper" + "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc" "github.com/jaegertracing/jaeger/plugin/sampling/strategystore/static" ) @@ -37,24 +38,39 @@ type Factory struct { var _ component.ReceiverFactory = (*Factory)(nil) -// Type gets the type of exporter. +// Type returns the type of the receiver. func (f *Factory) Type() configmodels.Type { return f.Wrapped.Type() } // CreateDefaultConfig returns default configuration of Factory. -// This function implements OTEL component.BaseFactory interface. +// This function implements OTEL component.ReceiverFactoryBase interface. func (f *Factory) CreateDefaultConfig() configmodels.Receiver { cfg := f.Wrapped.CreateDefaultConfig().(*jaegerreceiver.Config) - strategyFile := f.Viper.GetString(static.SamplingStrategiesFile) + cfg.RemoteSampling = createDefaultSamplingConfig(f.Viper) + return cfg +} + +func createDefaultSamplingConfig(v *viper.Viper) *jaegerreceiver.RemoteSamplingConfig { var samplingConf *jaegerreceiver.RemoteSamplingConfig + strategyFile := v.GetString(static.SamplingStrategiesFile) if strategyFile != "" { samplingConf = &jaegerreceiver.RemoteSamplingConfig{ StrategyFile: strategyFile, } } - cfg.RemoteSampling = samplingConf - return cfg + repCfg := grpc.ConnBuilder{} + repCfg.InitFromViper(v) + // This is for agent mode. + // This uses --reporter.grpc.host-port flag to set the fetch endpoint for the sampling strategies. + // The same flag is used by Jaeger exporter. If the value is not provided Jaeger exporter fails to start. + if len(repCfg.CollectorHostPorts) > 0 { + if samplingConf == nil { + samplingConf = &jaegerreceiver.RemoteSamplingConfig{} + } + samplingConf.FetchEndpoint = repCfg.CollectorHostPorts[0] + } + return samplingConf } // CreateTraceReceiver creates Jaeger receiver trace receiver. diff --git a/cmd/opentelemetry-collector/app/util.go b/cmd/opentelemetry-collector/app/util.go new file mode 100644 index 00000000000..dec2bfada9b --- /dev/null +++ b/cmd/opentelemetry-collector/app/util.go @@ -0,0 +1,33 @@ +// Copyright (c) 2020 The Jaeger 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 app + +import ( + "flag" + "io/ioutil" + "os" + + "github.com/open-telemetry/opentelemetry-collector/service/builder" +) + +// GetOTELConfigFile returns name of OTEL config file. +func GetOTELConfigFile() string { + f := &flag.FlagSet{} + f.SetOutput(ioutil.Discard) + builder.Flags(f) + // parse flags to bind the value + f.Parse(os.Args[1:]) + return builder.GetConfigFile() +} diff --git a/cmd/opentelemetry-collector/cmd/agent/Dockerfile b/cmd/opentelemetry-collector/cmd/agent/Dockerfile new file mode 100644 index 00000000000..58752e82bad --- /dev/null +++ b/cmd/opentelemetry-collector/cmd/agent/Dockerfile @@ -0,0 +1,8 @@ +FROM alpine:latest as certs +RUN apk add --update --no-cache ca-certificates + +FROM scratch +COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt + +COPY opentelemetry-agent-linux /go/bin/ +ENTRYPOINT ["/go/bin/opentelemetry-agent-linux"] diff --git a/cmd/opentelemetry-collector/cmd/agent/main.go b/cmd/opentelemetry-collector/cmd/agent/main.go new file mode 100644 index 00000000000..227ea82d2ae --- /dev/null +++ b/cmd/opentelemetry-collector/cmd/agent/main.go @@ -0,0 +1,95 @@ +// Copyright (c) 2020 The Jaeger 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 main + +import ( + "fmt" + "log" + "os" + + "github.com/open-telemetry/opentelemetry-collector/config" + "github.com/open-telemetry/opentelemetry-collector/config/configmodels" + "github.com/open-telemetry/opentelemetry-collector/service" + "github.com/spf13/viper" + + "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc" + jflags "github.com/jaegertracing/jaeger/cmd/flags" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/defaults" + jconfig "github.com/jaegertracing/jaeger/pkg/config" + "github.com/jaegertracing/jaeger/plugin/sampling/strategystore/static" +) + +func main() { + handleErr := func(err error) { + if err != nil { + log.Fatalf("Failed to run the service: %v", err) + } + } + + info := service.ApplicationStartInfo{ + ExeName: "jaeger-opentelemetry-collector", + LongName: "Jaeger OpenTelemetry Collector", + // TODO + //Version: version.Version, + //GitHash: version.GitHash, + } + + v := viper.New() + + cmpts := defaults.Components(v) + cfgFactory := func(otelViper *viper.Viper, f config.Factories) (*configmodels.Config, error) { + cfg := defaults.AgentConfig(cmpts) + + var otelCfg *configmodels.Config + if len(app.GetOTELConfigFile()) > 0 { + c, err := service.FileLoaderConfigFactory(otelViper, f) + if err != nil { + return nil, err + } + otelCfg = c + } + err := defaults.MergeConfigs(cfg, otelCfg) + if err != nil { + return nil, err + } + return cfg, nil + } + + svc, err := service.New(service.Parameters{ + ApplicationStartInfo: info, + Factories: cmpts, + ConfigFactory: cfgFactory, + }) + handleErr(err) + + cmd := svc.Command() + jconfig.AddFlags(v, + cmd, + jflags.AddConfigFileFlag, + grpc.AddFlags, + static.AddFlags, + ) + + // parse flags to propagate Jaeger config file flag value to viper + cmd.ParseFlags(os.Args) + err = jflags.TryLoadConfigFile(v) + if err != nil { + handleErr(fmt.Errorf("could not load Jaeger configuration file %w", err)) + } + + err = svc.Start() + handleErr(err) +} diff --git a/cmd/opentelemetry-collector/Dockerfile b/cmd/opentelemetry-collector/cmd/collector/Dockerfile similarity index 100% rename from cmd/opentelemetry-collector/Dockerfile rename to cmd/opentelemetry-collector/cmd/collector/Dockerfile diff --git a/cmd/opentelemetry-collector/main.go b/cmd/opentelemetry-collector/cmd/collector/main.go similarity index 89% rename from cmd/opentelemetry-collector/main.go rename to cmd/opentelemetry-collector/cmd/collector/main.go index cafba4f3ca3..e68c43c4837 100644 --- a/cmd/opentelemetry-collector/main.go +++ b/cmd/opentelemetry-collector/cmd/collector/main.go @@ -17,7 +17,6 @@ package main import ( "flag" "fmt" - "io/ioutil" "log" "os" "strings" @@ -25,11 +24,12 @@ import ( "github.com/open-telemetry/opentelemetry-collector/config" "github.com/open-telemetry/opentelemetry-collector/config/configmodels" "github.com/open-telemetry/opentelemetry-collector/service" - "github.com/open-telemetry/opentelemetry-collector/service/builder" "github.com/spf13/viper" + "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc" collectorApp "github.com/jaegertracing/jaeger/cmd/collector/app" jflags "github.com/jaegertracing/jaeger/cmd/flags" + "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/defaults" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/cassandra" "github.com/jaegertracing/jaeger/cmd/opentelemetry-collector/app/exporter/elasticsearch" @@ -64,13 +64,13 @@ func main() { cfgFactory := func(otelViper *viper.Viper, f config.Factories) (*configmodels.Config, error) { collectorOpts := &collectorApp.CollectorOptions{} collectorOpts.InitFromViper(v) - cfg, err := defaults.Config(storageType, collectorOpts.CollectorZipkinHTTPHostPort, cmpts) + cfg, err := defaults.CollectorConfig(storageType, collectorOpts.CollectorZipkinHTTPHostPort, cmpts) if err != nil { return nil, err } var otelCfg *configmodels.Config - if len(getOTELConfigFile()) > 0 { + if len(app.GetOTELConfigFile()) > 0 { otelCfg, err = service.FileLoaderConfigFactory(otelViper, f) if err != nil { return nil, err @@ -103,6 +103,7 @@ func main() { jflags.AddConfigFileFlag, storageFlags, static.AddFlags, + grpc.AddFlags, ) // parse flags to propagate Jaeger config file flag value to viper @@ -116,16 +117,6 @@ func main() { handleErr(err) } -// getOTELConfigFile returns name of OTEL config file. -func getOTELConfigFile() string { - f := &flag.FlagSet{} - f.SetOutput(ioutil.Discard) - builder.Flags(f) - // parse flags to bind the value - f.Parse(os.Args[1:]) - return builder.GetConfigFile() -} - // storageFlags return a function that will add storage flags. // storage parameter can contain a comma separated list of supported Jaeger storage backends. func storageFlags(storage string) (func(*flag.FlagSet), error) { diff --git a/crossdock/jaeger-opentelemetry-docker-compose.yml b/crossdock/jaeger-opentelemetry-docker-compose.yml index c1227cf4eba..406fefc8d02 100644 --- a/crossdock/jaeger-opentelemetry-docker-compose.yml +++ b/crossdock/jaeger-opentelemetry-docker-compose.yml @@ -16,8 +16,8 @@ services: - elasticsearch jaeger-agent: - image: jaegertracing/jaeger-opentelemetry-collector - command: ["--config=/config/otel-agent-config.yml"] + image: jaegertracing/jaeger-opentelemetry-agent + command: ["--config=/config/otel-agent-config.yml", "--reporter.grpc.host-port=jaeger-collector:14250"] volumes: - ./:/config/:ro ports: diff --git a/crossdock/otel-agent-config.yml b/crossdock/otel-agent-config.yml index 8d3b95b7e4f..5d33005b822 100644 --- a/crossdock/otel-agent-config.yml +++ b/crossdock/otel-agent-config.yml @@ -1,18 +1,9 @@ -receivers: - jaeger: - remote_sampling: - host_endpoint: localhost:5778 - fetch_endpoint: jaeger-collector:14250 - protocols: - thrift_compact: - thrift_binary: - exporters: jaeger: - endpoint: jaeger-collector:14250 wait_for_ready: true -service: - pipelines: - traces: - exporters: [jaeger] +# TODO remove after https://github.com/open-telemetry/opentelemetry-collector/pull/910 +receivers: + jaeger: + protocols: + thrift_compact: diff --git a/scripts/travis/upload-to-docker.sh b/scripts/travis/upload-to-docker.sh index 79b803d7fcc..82b8b6fc142 100755 --- a/scripts/travis/upload-to-docker.sh +++ b/scripts/travis/upload-to-docker.sh @@ -34,7 +34,7 @@ fi # Do not enable echo before the `docker login` command to avoid revealing the password. set -x docker login -u $DOCKER_USER -p $DOCKER_PASS -if [[ "${REPO}" == "jaegertracing/jaeger-opentelemetry-collector" ]]; then +if [[ "${REPO}" == "jaegertracing/jaeger-opentelemetry-collector" || "${REPO}" == "jaegertracing/jaeger-opentelemetry-agent" ]]; then # TODO remove once Jaeger OTEL collector is stable docker push $REPO:latest else