Skip to content

Commit 4d57f5e

Browse files
authored
[mdatagen] Remove WithAttributes from the telemetry builder constructor (#10608)
Attribute sets for async instruments now can be set as options to callback setters and async instruments initializers. This allows each async instrument to have its own attribute set. Unblocks #10593
1 parent bf6bd9f commit 4d57f5e

File tree

11 files changed

+104
-134
lines changed

11 files changed

+104
-134
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: breaking
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
5+
component: mdatagen
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Remove WithAttributes option from the telemetry builder constructor.
9+
10+
subtext: |
11+
Attribute sets for async instruments now can be set as options to callback setters and async instruments initializers.
12+
This allows each async instrument to have its own attribute set.
13+
14+
# One or more tracking issues or pull requests related to the change
15+
issues: [10608]
16+
17+
# Optional: The change log or logs in which this entry should be included.
18+
# e.g. '[user]' or '[user, api]'
19+
# Include 'user' if the change is relevant to end users.
20+
# Include 'api' if there is a change to a library API.
21+
# Default: '[user]'
22+
change_logs: [api]

cmd/mdatagen/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ require (
1414
go.opentelemetry.io/collector/pdata v1.12.0
1515
go.opentelemetry.io/collector/receiver v0.105.0
1616
go.opentelemetry.io/collector/semconv v0.105.0
17-
go.opentelemetry.io/otel v1.28.0
1817
go.opentelemetry.io/otel/metric v1.28.0
1918
go.opentelemetry.io/otel/sdk/metric v1.28.0
2019
go.opentelemetry.io/otel/trace v1.28.0
@@ -49,6 +48,7 @@ require (
4948
github.com/prometheus/procfs v0.15.1 // indirect
5049
go.opentelemetry.io/collector/featuregate v1.12.0 // indirect
5150
go.opentelemetry.io/collector/internal/globalgates v0.105.0 // indirect
51+
go.opentelemetry.io/otel v1.28.0 // indirect
5252
go.opentelemetry.io/otel/exporters/prometheus v0.50.0 // indirect
5353
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
5454
go.uber.org/multierr v1.11.0 // indirect

cmd/mdatagen/internal/samplereceiver/internal/metadata/generated_telemetry.go

+9-18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/mdatagen/main.go

-8
Original file line numberDiff line numberDiff line change
@@ -189,14 +189,6 @@ func templatize(tmplFile string, md metadata) *template.Template {
189189
}
190190
return result
191191
},
192-
"hasAsync": func(t telemetry) bool {
193-
for _, m := range t.Metrics {
194-
if m.Data().IsAsync() {
195-
return true
196-
}
197-
}
198-
return false
199-
},
200192
"inc": func(i int) int { return i + 1 },
201193
"distroURL": func(name string) string {
202194
return distros[name]

cmd/mdatagen/templates/telemetry.go.tmpl

+9-20
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"errors"
99
{{- end }}
1010

11-
{{ if hasAsync .Telemetry }}"go.opentelemetry.io/otel/attribute"{{- end }}
1211
"go.opentelemetry.io/otel/metric"
1312
"go.opentelemetry.io/otel/metric/noop"
1413
"go.opentelemetry.io/otel/trace"
@@ -33,11 +32,10 @@ type TelemetryBuilder struct {
3332
{{- range $name, $metric := .Telemetry.Metrics }}
3433
{{ $name.Render }} metric.{{ $metric.Data.Instrument }}
3534
{{- if and ($metric.Data.Async) (not $metric.Optional) }}
36-
observe{{ $name.Render }} func() {{ $metric.Data.BasicType }}
35+
observe{{ $name.Render }} func(context.Context, metric.Observer) error
3736
{{- end }}
3837
{{- end }}
3938
level configtelemetry.Level
40-
{{ if hasAsync .Telemetry }}attributeSet attribute.Set{{- end }}
4139
}
4240

4341
// telemetryBuilderOption applies changes to default builder.
@@ -50,19 +48,10 @@ func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
5048
}
5149
}
5250

53-
{{- if hasAsync .Telemetry }}
54-
// WithAttributeSet applies a set of attributes for asynchronous instruments.
55-
func WithAttributeSet(set attribute.Set) telemetryBuilderOption {
56-
return func(builder *TelemetryBuilder) {
57-
builder.attributeSet = set
58-
}
59-
}
60-
{{- end }}
61-
6251
{{- range $name, $metric := .Telemetry.Metrics }}
6352
{{- if $metric.Optional }}
6453
// Init{{ $name.Render }} configures the {{ $name.Render }} metric.
65-
func (builder *TelemetryBuilder) Init{{ $name.Render }}({{ if $metric.Data.Async -}}cb func() {{ $metric.Data.BasicType }}{{- end }}) error {
54+
func (builder *TelemetryBuilder) Init{{ $name.Render }}({{ if $metric.Data.Async -}}cb func() {{ $metric.Data.BasicType }}{{- end }}, opts ...metric.ObserveOption) error {
6655
var err error
6756
builder.{{ $name.Render }}, err = builder.meter.{{ $metric.Data.Instrument }}(
6857
"{{ $name }}",
@@ -77,7 +66,7 @@ func (builder *TelemetryBuilder) Init{{ $name.Render }}({{ if $metric.Data.Async
7766
return err
7867
}
7968
_, err = builder.meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
80-
o.Observe{{ casesTitle $metric.Data.BasicType }}(builder.{{ $name.Render }}, cb(), metric.WithAttributeSet(builder.attributeSet))
69+
o.Observe{{ casesTitle $metric.Data.BasicType }}(builder.{{ $name.Render }}, cb(), opts...)
8170
return nil
8271
}, builder.{{ $name.Render }})
8372
{{- end }}
@@ -87,9 +76,12 @@ func (builder *TelemetryBuilder) Init{{ $name.Render }}({{ if $metric.Data.Async
8776
{{- else }}
8877
{{ if $metric.Data.Async -}}
8978
// With{{ $name.Render }}Callback sets callback for observable {{ $name.Render }} metric.
90-
func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}) telemetryBuilderOption {
79+
func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}, opts ...metric.ObserveOption) telemetryBuilderOption {
9180
return func(builder *TelemetryBuilder) {
92-
builder.observe{{ $name.Render }} = cb
81+
builder.observe{{ $name.Render }} = func(_ context.Context, o metric.Observer) error {
82+
o.Observe{{ casesTitle $metric.Data.BasicType }}(builder.{{ $name.Render }}, cb(), opts...)
83+
return nil
84+
}
9385
}
9486
}
9587
{{- end }}
@@ -123,10 +115,7 @@ func NewTelemetryBuilder(settings component.TelemetrySettings, options ...teleme
123115
)
124116
errs = errors.Join(errs, err)
125117
{{- if $metric.Data.Async }}
126-
_, err = builder.meter.RegisterCallback(func(_ context.Context, o metric.Observer) error {
127-
o.Observe{{ casesTitle $metric.Data.BasicType }}(builder.{{ $name.Render }}, builder.observe{{ $name.Render }}(), metric.WithAttributeSet(builder.attributeSet))
128-
return nil
129-
}, builder.{{ $name.Render }})
118+
_, err = builder.meter.RegisterCallback(builder.observe{{ $name.Render }}, builder.{{ $name.Render }})
130119
errs = errors.Join(errs, err)
131120
{{- end }}
132121
{{- end }}

exporter/exporterhelper/internal/metadata/generated_telemetry.go

+4-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

exporter/exporterhelper/obsexporter.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ func NewObsReport(cfg ObsReportSettings) (*ObsReport, error) {
4949
}
5050

5151
func newExporter(cfg ObsReportSettings) (*ObsReport, error) {
52-
telemetryBuilder, err := metadata.NewTelemetryBuilder(cfg.ExporterCreateSettings.TelemetrySettings,
53-
metadata.WithAttributeSet(attribute.NewSet(attribute.String(obsmetrics.ExporterKey, cfg.ExporterID.String()))),
54-
)
52+
telemetryBuilder, err := metadata.NewTelemetryBuilder(cfg.ExporterCreateSettings.TelemetrySettings)
5553
if err != nil {
5654
return nil, err
5755
}

exporter/exporterhelper/queue_sender.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"errors"
99

1010
"go.opentelemetry.io/otel/attribute"
11+
"go.opentelemetry.io/otel/metric"
1112
"go.opentelemetry.io/otel/trace"
1213
"go.uber.org/multierr"
1314
"go.uber.org/zap"
@@ -74,6 +75,7 @@ type queueSender struct {
7475
consumers *queue.Consumers[Request]
7576

7677
telemetryBuilder *metadata.TelemetryBuilder
78+
exporterID component.ID
7779
}
7880

7981
func newQueueSender(q exporterqueue.Queue[Request], set exporter.Settings, numConsumers int,
@@ -83,6 +85,7 @@ func newQueueSender(q exporterqueue.Queue[Request], set exporter.Settings, numCo
8385
numConsumers: numConsumers,
8486
traceAttribute: attribute.String(obsmetrics.ExporterKey, set.ID.String()),
8587
telemetryBuilder: telemetryBuilder,
88+
exporterID: set.ID,
8689
}
8790
consumeFunc := func(ctx context.Context, req Request) error {
8891
err := qs.nextSender.send(ctx, req)
@@ -102,9 +105,10 @@ func (qs *queueSender) Start(ctx context.Context, host component.Host) error {
102105
return err
103106
}
104107

108+
opts := metric.WithAttributeSet(attribute.NewSet(attribute.String(obsmetrics.ExporterKey, qs.exporterID.String())))
105109
return multierr.Append(
106-
qs.telemetryBuilder.InitExporterQueueSize(func() int64 { return int64(qs.queue.Size()) }),
107-
qs.telemetryBuilder.InitExporterQueueCapacity(func() int64 { return int64(qs.queue.Capacity()) }),
110+
qs.telemetryBuilder.InitExporterQueueSize(func() int64 { return int64(qs.queue.Size()) }, opts),
111+
qs.telemetryBuilder.InitExporterQueueCapacity(func() int64 { return int64(qs.queue.Capacity()) }, opts),
108112
)
109113
}
110114

processor/batchprocessor/internal/metadata/generated_telemetry.go

+7-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

processor/batchprocessor/metrics.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ func newBatchProcessorTelemetry(set processor.Settings, currentMetadataCardinali
3737

3838
telemetryBuilder, err := metadata.NewTelemetryBuilder(set.TelemetrySettings,
3939
metadata.WithLevel(set.MetricsLevel),
40-
metadata.WithProcessorBatchMetadataCardinalityCallback(func() int64 { return int64(currentMetadataCardinality()) }),
41-
metadata.WithAttributeSet(attrs),
40+
metadata.WithProcessorBatchMetadataCardinalityCallback(func() int64 {
41+
return int64(currentMetadataCardinality())
42+
}, metric.WithAttributeSet(attrs)),
4243
)
4344

4445
if err != nil {

0 commit comments

Comments
 (0)