Skip to content

Commit 71418b6

Browse files
authored
otelcol: add telemetry.Factory to Factories (#13950)
#### Description Add a `TelemetryFactory telemetry.Factory` field to `otelcol.Factories`. If it is nil, it will default to an `otelconftelemetry` factory. This enables overriding telemetry providers. #### Link to tracking issue Fixes #4970 #### Testing - Ran the collector without any telemetry config, verified that logging still works as expected - Ran the collector with standard (otelconftelemetry) config, verified it is used as expected (I just smoke tested by enabling debug logging -- more comprehensive unit tests exist) - Ran a modified version of the collector with a custom telemetry factory #### Documentation N/A
1 parent 5174026 commit 71418b6

28 files changed

+318
-366
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: breaking
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: pkg/otelcol
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Require a telemetry factory to be injected through otelcol.Factories
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [4970]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext: |
19+
otelcol.Factories now has a required Telemetry field,
20+
which contains the telemetry factory to be used by the service.
21+
Set it to otelconftelemetry.NewFactory() for the existing behavior.
22+
23+
# Optional: The change log or logs in which this entry should be included.
24+
# e.g. '[user]' or '[user, api]'
25+
# Include 'user' if the change is relevant to end users.
26+
# Include 'api' if there is a change to a library API.
27+
# Default: '[user]'
28+
change_logs: [api]

cmd/builder/internal/builder/templates/components.go.tmpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"go.opentelemetry.io/collector/otelcol"
1111
"go.opentelemetry.io/collector/processor"
1212
"go.opentelemetry.io/collector/receiver"
13+
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
1314
{{- range .Connectors}}
1415
{{.Name}} "{{.Import}}"
1516
{{- end}}
@@ -29,7 +30,9 @@ import (
2930

3031
func components() (otelcol.Factories, error) {
3132
var err error
32-
factories := otelcol.Factories{}
33+
factories := otelcol.Factories{
34+
Telemetry: otelconftelemetry.NewFactory(),
35+
}
3336

3437
factories.Extensions, err = otelcol.MakeFactoryMap[extension.Factory](
3538
{{- range .Extensions}}

cmd/otelcorecol/components.go

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/otelcorecol/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ require (
3131
go.opentelemetry.io/collector/receiver v1.44.0
3232
go.opentelemetry.io/collector/receiver/nopreceiver v0.138.0
3333
go.opentelemetry.io/collector/receiver/otlpreceiver v0.138.0
34+
go.opentelemetry.io/collector/service v0.138.0
3435
golang.org/x/sys v0.36.0
3536
)
3637

@@ -135,7 +136,6 @@ require (
135136
go.opentelemetry.io/collector/receiver/receiverhelper v0.138.0 // indirect
136137
go.opentelemetry.io/collector/receiver/receivertest v0.138.0 // indirect
137138
go.opentelemetry.io/collector/receiver/xreceiver v0.138.0 // indirect
138-
go.opentelemetry.io/collector/service v0.138.0 // indirect
139139
go.opentelemetry.io/collector/service/hostcapabilities v0.138.0 // indirect
140140
go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 // indirect
141141
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect

internal/e2e/metric_stability_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"go.opentelemetry.io/collector/processor/batchprocessor"
3737
"go.opentelemetry.io/collector/receiver"
3838
"go.opentelemetry.io/collector/receiver/otlpreceiver"
39+
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
3940
)
4041

4142
func assertMetrics(t *testing.T, metricsAddr string, expectedMetrics map[string]bool) bool {
@@ -204,6 +205,7 @@ func testMetricStability(t *testing.T, configFile string, expectedMetrics map[st
204205
Receivers: map[component.Type]receiver.Factory{otlpreceiver.NewFactory().Type(): otlpreceiver.NewFactory()},
205206
Processors: map[component.Type]processor.Factory{batchprocessor.NewFactory().Type(): batchprocessor.NewFactory()},
206207
Exporters: map[component.Type]exporter.Factory{debugexporter.NewFactory().Type(): debugexporter.NewFactory()},
208+
Telemetry: otelconftelemetry.NewFactory(),
207209
}, nil
208210
},
209211
ConfigProviderSettings: otelcol.ConfigProviderSettings{

otelcol/collector.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ func (s State) String() string {
5454

5555
// CollectorSettings holds configuration for creating a new Collector.
5656
type CollectorSettings struct {
57-
// Factories service factories.
57+
// Factories returns component factories for the collector.
58+
//
5859
// TODO(13263) This is a dangerous "bare" function value, should define an interface
5960
// following style guidelines.
6061
Factories func() (Factories, error)
@@ -178,6 +179,10 @@ func (col *Collector) setupConfigurationComponents(ctx context.Context) error {
178179
if err != nil {
179180
return fmt.Errorf("failed to initialize factories: %w", err)
180181
}
182+
if factories.Telemetry == nil {
183+
factories.Telemetry = otelconftelemetry.NewFactory()
184+
}
185+
181186
cfg, err := col.configProvider.Get(ctx, factories)
182187
if err != nil {
183188
return fmt.Errorf("failed to get config: %w", err)
@@ -219,10 +224,7 @@ func (col *Collector) setupConfigurationComponents(ctx context.Context) error {
219224
},
220225
AsyncErrorChannel: col.asyncErrorChannel,
221226
LoggingOptions: col.set.LoggingOptions,
222-
223-
// TODO: inject the telemetry factory through factories.
224-
// See https://github.com/open-telemetry/opentelemetry-collector/issues/4970
225-
TelemetryFactory: otelconftelemetry.NewFactory(),
227+
TelemetryFactory: factories.Telemetry,
226228
}, cfg.Service)
227229
if err != nil {
228230
return err
@@ -272,6 +274,10 @@ func (col *Collector) DryRun(ctx context.Context) error {
272274
if err != nil {
273275
return fmt.Errorf("failed to initialize factories: %w", err)
274276
}
277+
if factories.Telemetry == nil {
278+
factories.Telemetry = otelconftelemetry.NewFactory()
279+
}
280+
275281
cfg, err := col.configProvider.Get(ctx, factories)
276282
if err != nil {
277283
return fmt.Errorf("failed to get config: %w", err)
@@ -291,6 +297,7 @@ func (col *Collector) DryRun(ctx context.Context) error {
291297
ExportersFactories: factories.Exporters,
292298
ConnectorsConfigs: cfg.Connectors,
293299
ConnectorsFactories: factories.Connectors,
300+
TelemetryFactory: factories.Telemetry,
294301
}, service.Config{
295302
Pipelines: cfg.Service.Pipelines,
296303
})

0 commit comments

Comments
 (0)