Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .chloggen/otelcol-telemetryfactory.yaml
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement
change_type: breaking

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: pkg/otelcol

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Enable injecting a telemetry factory through otelcol.Factories
note: Require a telemetry factory to be injected through otelcol.Factories

# One or more tracking issues or pull requests related to the change
issues: [4970]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:
subtext: |
otelcol.Factories now has a required Telemetry field,
which contains the telemetry factory to be used by the service.
Set it to otelconftelemetry.NewFactory() for the existing behavior.

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
Expand Down
5 changes: 4 additions & 1 deletion cmd/builder/internal/builder/templates/components.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"go.opentelemetry.io/collector/otelcol"
"go.opentelemetry.io/collector/processor"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
{{- range .Connectors}}
{{.Name}} "{{.Import}}"
{{- end}}
Expand All @@ -29,7 +30,9 @@ import (

func components() (otelcol.Factories, error) {
var err error
factories := otelcol.Factories{}
factories := otelcol.Factories{
Telemetry: otelconftelemetry.NewFactory(),
}

factories.Extensions, err = otelcol.MakeFactoryMap[extension.Factory](
{{- range .Extensions}}
Expand Down
5 changes: 4 additions & 1 deletion cmd/otelcorecol/components.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cmd/otelcorecol/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ require (
go.opentelemetry.io/collector/receiver v1.43.0
go.opentelemetry.io/collector/receiver/nopreceiver v0.137.0
go.opentelemetry.io/collector/receiver/otlpreceiver v0.137.0
go.opentelemetry.io/collector/service v0.137.0
golang.org/x/sys v0.36.0
)

Expand Down Expand Up @@ -135,7 +136,6 @@ require (
go.opentelemetry.io/collector/receiver/receiverhelper v0.137.0 // indirect
go.opentelemetry.io/collector/receiver/receivertest v0.137.0 // indirect
go.opentelemetry.io/collector/receiver/xreceiver v0.137.0 // indirect
go.opentelemetry.io/collector/service v0.137.0 // indirect
go.opentelemetry.io/collector/service/hostcapabilities v0.137.0 // indirect
go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
Expand Down
7 changes: 0 additions & 7 deletions otelcol/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"go.opentelemetry.io/collector/confmap/xconfmap"
"go.opentelemetry.io/collector/otelcol/internal/grpclog"
"go.opentelemetry.io/collector/service"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
)

// State defines Collector's state.
Expand Down Expand Up @@ -179,9 +178,6 @@ func (col *Collector) setupConfigurationComponents(ctx context.Context) error {
if err != nil {
return fmt.Errorf("failed to initialize factories: %w", err)
}
if factories.Telemetry == nil {
factories.Telemetry = otelconftelemetry.NewFactory()
}

cfg, err := col.configProvider.Get(ctx, factories)
if err != nil {
Expand Down Expand Up @@ -274,9 +270,6 @@ func (col *Collector) DryRun(ctx context.Context) error {
if err != nil {
return fmt.Errorf("failed to initialize factories: %w", err)
}
if factories.Telemetry == nil {
factories.Telemetry = otelconftelemetry.NewFactory()
}

cfg, err := col.configProvider.Get(ctx, factories)
if err != nil {
Expand Down
73 changes: 32 additions & 41 deletions otelcol/collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -389,44 +389,19 @@ func TestNewCollectorValidatesResolverSettings(t *testing.T) {
}

func TestCollectorRun(t *testing.T) {
tests := map[string]struct {
factories func() (Factories, error)
configFile string
}{
"nop": {
factories: nopFactories,
configFile: "otelcol-nop.yaml",
},
"defaul_telemetry_factory": {
factories: func() (Factories, error) {
factories, err := nopFactories()
if err != nil {
return Factories{}, err
}
factories.Telemetry = nil
return factories, nil
},
configFile: "otelcol-otelconftelemetry.yaml",
},
set := CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: nopFactories,
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-nop.yaml")}),
}
col, err := NewCollector(set)
require.NoError(t, err)

for name, test := range tests {
t.Run(name, func(t *testing.T) {
set := CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: test.factories,
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", test.configFile)}),
}
col, err := NewCollector(set)
require.NoError(t, err)

wg := startCollector(context.Background(), t, col)
wg := startCollector(context.Background(), t, col)

col.Shutdown()
wg.Wait()
assert.Equal(t, StateClosed, col.GetState())
})
}
col.Shutdown()
wg.Wait()
assert.Equal(t, StateClosed, col.GetState())
}

func TestCollectorRun_AfterShutdown(t *testing.T) {
Expand Down Expand Up @@ -464,9 +439,24 @@ func TestCollectorRun_Errors(t *testing.T) {
settings: CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: nopFactories,
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-otelconftelemetry.yaml")}),
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid-telemetry.yaml")}),
},
expectedErr: "failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):\n\n'service.telemetry' has invalid keys: unknown",
},
"missing_telemetry_factory": {
settings: CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: func() (Factories, error) {
factories, err := nopFactories()
if err != nil {
return Factories{}, err
}
factories.Telemetry = nil
return factories, nil
},
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid-telemetry.yaml")}),
},
expectedErr: "failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):\n\n'service.telemetry' has invalid keys: metrics",
expectedErr: "failed to get config: cannot unmarshal the configuration: Factories.Telemetry must not be nil",
},
}

Expand Down Expand Up @@ -526,11 +516,11 @@ func TestCollectorDryRun(t *testing.T) {
settings: CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: nopFactories,
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-otelconftelemetry.yaml")}),
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid-telemetry.yaml")}),
},
expectedErr: "failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):\n\n'service.telemetry' has invalid keys: metrics",
expectedErr: "failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):\n\n'service.telemetry' has invalid keys: unknown",
},
"default_telemetry_factory": {
"missing_telemetry_factory": {
settings: CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: func() (Factories, error) {
Expand All @@ -541,8 +531,9 @@ func TestCollectorDryRun(t *testing.T) {
factories.Telemetry = nil
return factories, nil
},
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-otelconftelemetry.yaml")}),
ConfigProviderSettings: newDefaultConfigProviderSettings(t, []string{filepath.Join("testdata", "otelcol-invalid-telemetry.yaml")}),
},
expectedErr: "failed to get config: cannot unmarshal the configuration: Factories.Telemetry must not be nil",
},
}

Expand Down
3 changes: 3 additions & 0 deletions otelcol/collector_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,9 @@ func (w windowsEventLogCore) Sync() error {
func withWindowsCore(elog *eventlog.Log, serviceConfig **service.Config) func(zapcore.Core) zapcore.Core {
return func(core zapcore.Core) zapcore.Core {
if serviceConfig != nil && *serviceConfig != nil {
// TODO remove the dependency on otelconftelemetry
//
// https://github.com/open-telemetry/opentelemetry-collector/issues/14002
for _, output := range (*serviceConfig).Telemetry.(*otelconftelemetry.Config).Logs.OutputPaths {
if output != "stdout" && output != "stderr" {
// A log file was specified in the configuration, so we should not use the Windows Event Log
Expand Down
4 changes: 4 additions & 0 deletions otelcol/command_print_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"go.opentelemetry.io/collector/featuregate"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/xreceiver"
"go.opentelemetry.io/collector/service/telemetry"
)

type printExporterConfig struct {
Expand Down Expand Up @@ -202,6 +203,9 @@ func TestPrintCommand(t *testing.T) {
Exporters: map[component.Type]exporter.Factory{
testE: testExporter,
},
Telemetry: telemetry.NewFactory(func() component.Config {
return fakeTelemetryConfig{}
}),
}, nil
},
ConfigProviderSettings: ConfigProviderSettings{
Expand Down
32 changes: 1 addition & 31 deletions otelcol/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,13 @@
"testing"

"github.com/stretchr/testify/require"
config "go.opentelemetry.io/contrib/otelconf/v0.3.0"
"go.uber.org/zap/zapcore"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap/xconfmap"
"go.opentelemetry.io/collector/featuregate"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/service"
"go.opentelemetry.io/collector/service/pipelines"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
)

var (
Expand Down Expand Up @@ -297,33 +293,7 @@
component.MustNewID("nop"): &errConfig{},
},
Service: service.Config{
Telemetry: otelconftelemetry.Config{
Logs: otelconftelemetry.LogsConfig{
Level: zapcore.DebugLevel,
Development: true,
Encoding: "console",
DisableCaller: true,
DisableStacktrace: true,
OutputPaths: []string{"stderr", "./output-logs"},
ErrorOutputPaths: []string{"stderr", "./error-output-logs"},
InitialFields: map[string]any{"fieldKey": "filed-value"},
},
Metrics: otelconftelemetry.MetricsConfig{
Level: configtelemetry.LevelNormal,
MeterProvider: config.MeterProvider{
Readers: []config.MetricReader{
{
Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{
Prometheus: &config.Prometheus{
Host: newPtr("localhost"),
Port: newPtr(8080),
},
}},
},
},
},
},
},
Telemetry: fakeTelemetryConfig{},
Extensions: []component.ID{component.MustNewID("nop")},
Pipelines: pipelines.Config{
pipeline.NewID(pipeline.SignalTraces): {
Expand All @@ -336,7 +306,7 @@
}
}

func newPtr[T int | string](str T) *T {

Check failure on line 309 in otelcol/config_test.go

View workflow job for this annotation

GitHub Actions / CodeQL-Build

func newPtr is unused (unused)

Check failure on line 309 in otelcol/config_test.go

View workflow job for this annotation

GitHub Actions / lint

func newPtr is unused (unused)
return &str
}

Expand Down
5 changes: 0 additions & 5 deletions otelcol/configprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"fmt"

"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
)

// ConfigProvider provides the service configuration.
Expand Down Expand Up @@ -59,10 +58,6 @@ func (cm *ConfigProvider) Get(ctx context.Context, factories Factories) (*Config
return nil, fmt.Errorf("cannot resolve the configuration: %w", err)
}

if factories.Telemetry == nil {
factories.Telemetry = otelconftelemetry.NewFactory()
}

var cfg *configSettings
if cfg, err = unmarshal(conf, factories); err != nil {
return nil, fmt.Errorf("cannot unmarshal the configuration: %w", err)
Expand Down
34 changes: 0 additions & 34 deletions otelcol/configprovider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
yaml "go.yaml.in/yaml/v3"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/connector/connectortest"
"go.opentelemetry.io/collector/exporter/exportertest"
Expand All @@ -24,7 +23,6 @@ import (
"go.opentelemetry.io/collector/receiver/receivertest"
"go.opentelemetry.io/collector/service"
"go.opentelemetry.io/collector/service/pipelines"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
)

func TestConfigProvider(t *testing.T) {
Expand Down Expand Up @@ -78,38 +76,6 @@ func TestConfigProvider(t *testing.T) {
},
},
},
"default_telemetry": {
filename: "otelcol-otelconftelemetry.yaml",
factories: func() (Factories, error) {
factories, err := nopFactories()
if err != nil {
return Factories{}, err
}
factories.Telemetry = nil
return factories, nil
},
expectedConfig: &Config{
Exporters: map[component.ID]component.Config{
nopComponentID: exportertest.NewNopFactory().CreateDefaultConfig(),
},
Receivers: map[component.ID]component.Config{
nopComponentID: receivertest.NewNopFactory().CreateDefaultConfig(),
},
Service: service.Config{
Telemetry: func() component.Config {
cfg := otelconftelemetry.NewFactory().CreateDefaultConfig().(*otelconftelemetry.Config)
cfg.Metrics.Level = configtelemetry.LevelNone
return cfg
}(),
Pipelines: map[pipeline.ID]*pipelines.PipelineConfig{
pipeline.NewID(pipeline.SignalMetrics): {
Receivers: []component.ID{nopComponentID},
Exporters: []component.ID{nopComponentID},
},
},
},
},
},
}

for name, test := range tests {
Expand Down
2 changes: 0 additions & 2 deletions otelcol/factories.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ type Factories struct {
Connectors map[component.Type]connector.Factory

// Telemetry is the factory to create the telemetry providers for the service.
//
// If Telemetry is nil, otelconftelemetry will be used by default.
Telemetry telemetry.Factory

// ReceiverModules maps receiver types to their respective go modules.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ exporters:

service:
telemetry:
# Set configuration understood by otelconftelemetry
metrics:
level: none
unknown: key
pipelines:
metrics:
receivers: [nop]
Expand Down
Loading
Loading