Skip to content

Commit 4f2acde

Browse files
authored
Merge branch 'main' into codeboten/revert-revert10bcef33e6d26104036ed2874cb179c4437abc98
2 parents 58a946a + 6a78f1a commit 4f2acde

File tree

10 files changed

+159
-3
lines changed

10 files changed

+159
-3
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: mdatagen
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: add support for optional internal metrics
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [10316]
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+
20+
# Optional: The change log or logs in which this entry should be included.
21+
# e.g. '[user]' or '[user, api]'
22+
# Include 'user' if the change is relevant to end users.
23+
# Include 'api' if there is a change to a library API.
24+
# Default: '[user]'
25+
change_logs: []

cmd/mdatagen/internal/samplereceiver/documentation.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ Cumulative bytes allocated for heap objects (see 'go doc runtime.MemStats.TotalA
133133
| ---- | ----------- | ---------- | --------- |
134134
| By | Sum | Int | true |
135135
136+
### queue_length
137+
138+
This metric is optional and therefore not initialized in NewTelemetryBuilder.
139+
140+
For example this metric only exists if feature A is enabled.
141+
142+
| Unit | Metric Type | Value Type |
143+
| ---- | ----------- | ---------- |
144+
| 1 | Gauge | Int |
145+
136146
### request_duration
137147
138148
Duration of request

cmd/mdatagen/internal/samplereceiver/factory.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func createMetrics(ctx context.Context, set receiver.Settings, _ component.Confi
3232
return nil, err
3333
}
3434
telemetryBuilder.BatchSizeTriggerSend.Add(ctx, 1)
35-
return nopInstance, nil
35+
return nopReceiver{telemetryBuilder: telemetryBuilder}, nil
3636
}
3737

3838
func createLogs(context.Context, receiver.Settings, component.Config, consumer.Logs) (receiver.Logs, error) {
@@ -44,4 +44,9 @@ var nopInstance = &nopReceiver{}
4444
type nopReceiver struct {
4545
component.StartFunc
4646
component.ShutdownFunc
47+
telemetryBuilder *metadata.TelemetryBuilder
48+
}
49+
50+
func (r nopReceiver) initOptionalMetric() {
51+
_ = r.telemetryBuilder.InitQueueLength(func() int64 { return 1 })
4752
}

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

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/mdatagen/internal/samplereceiver/metadata.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,12 @@ telemetry:
174174
async: true
175175
value_type: int
176176
monotonic: true
177+
queue_length:
178+
enabled: true
179+
description: This metric is optional and therefore not initialized in NewTelemetryBuilder.
180+
extended_documentation: For example this metric only exists if feature A is enabled.
181+
unit: 1
182+
optional: true
183+
gauge:
184+
async: true
185+
value_type: int

cmd/mdatagen/internal/samplereceiver/metrics_test.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestGeneratedMetrics(t *testing.T) {
2626
func TestComponentTelemetry(t *testing.T) {
2727
tt := setupTestTelemetry()
2828
factory := NewFactory()
29-
_, err := factory.CreateMetricsReceiver(context.Background(), tt.NewSettings(), componenttest.NewNopHost(), new(consumertest.MetricsSink))
29+
receiver, err := factory.CreateMetricsReceiver(context.Background(), tt.NewSettings(), componenttest.NewNopHost(), new(consumertest.MetricsSink))
3030
require.NoError(t, err)
3131
tt.assertMetrics(t, []metricdata.Metrics{
3232
{
@@ -58,5 +58,51 @@ func TestComponentTelemetry(t *testing.T) {
5858
},
5959
},
6060
})
61+
rcv, ok := receiver.(nopReceiver)
62+
require.True(t, ok)
63+
rcv.initOptionalMetric()
64+
tt.assertMetrics(t, []metricdata.Metrics{
65+
{
66+
Name: "batch_size_trigger_send",
67+
Description: "Number of times the batch was sent due to a size trigger",
68+
Unit: "1",
69+
Data: metricdata.Sum[int64]{
70+
Temporality: metricdata.CumulativeTemporality,
71+
IsMonotonic: true,
72+
DataPoints: []metricdata.DataPoint[int64]{
73+
{
74+
Value: 1,
75+
},
76+
},
77+
},
78+
},
79+
{
80+
Name: "process_runtime_total_alloc_bytes",
81+
Description: "Cumulative bytes allocated for heap objects (see 'go doc runtime.MemStats.TotalAlloc')",
82+
Unit: "By",
83+
Data: metricdata.Sum[int64]{
84+
Temporality: metricdata.CumulativeTemporality,
85+
IsMonotonic: true,
86+
DataPoints: []metricdata.DataPoint[int64]{
87+
{
88+
Value: 2,
89+
},
90+
},
91+
},
92+
},
93+
{
94+
Name: "queue_length",
95+
Description: "This metric is optional and therefore not initialized in NewTelemetryBuilder.",
96+
Unit: "1",
97+
Data: metricdata.Gauge[int64]{
98+
DataPoints: []metricdata.DataPoint[int64]{
99+
{
100+
Value: 1,
101+
},
102+
},
103+
},
104+
},
105+
})
61106
require.NoError(t, tt.Shutdown(context.Background()))
107+
62108
}

cmd/mdatagen/loader.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ type metric struct {
111111
// be appended to the description used in generated documentation.
112112
ExtendedDocumentation string `mapstructure:"extended_documentation"`
113113

114+
// Optional can be used to specify metrics that may
115+
// or may not be present in all cases, depending on configuration.
116+
Optional bool `mapstructure:"optional"`
117+
114118
// Unit of the metric.
115119
Unit *string `mapstructure:"unit"`
116120

cmd/mdatagen/loader_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,19 @@ func TestLoadMetadata(t *testing.T) {
263263
Async: true,
264264
},
265265
},
266+
"queue_length": {
267+
Enabled: true,
268+
Description: "This metric is optional and therefore not initialized in NewTelemetryBuilder.",
269+
ExtendedDocumentation: "For example this metric only exists if feature A is enabled.",
270+
Unit: strPtr("1"),
271+
Optional: true,
272+
Gauge: &gauge{
273+
MetricValueType: MetricValueType{
274+
ValueType: pmetric.NumberDataPointValueTypeInt,
275+
},
276+
Async: true,
277+
},
278+
},
266279
},
267280
},
268281
ScopeName: "go.opentelemetry.io/collector/internal/receiver/samplereceiver",

cmd/mdatagen/metadata-schema.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ telemetry:
140140
description:
141141
# Optional: extended documentation of the metric.
142142
extended_documentation:
143+
# Optional: whether or not this metric is optional. Optional metrics may only be initialized
144+
# if certain features are enabled or configured.
145+
optional: bool
143146
# Optional: warnings that will be shown to user under specified conditions.
144147
warnings:
145148
# A warning that will be displayed if the metric is enabled in user config.

cmd/mdatagen/templates/telemetry.go.tmpl

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type TelemetryBuilder struct {
3232
meter metric.Meter
3333
{{- range $name, $metric := .Telemetry.Metrics }}
3434
{{ $name.Render }} metric.{{ $metric.Data.Instrument }}
35-
{{- if $metric.Data.Async }}
35+
{{- if and ($metric.Data.Async) (not $metric.Optional) }}
3636
observe{{ $name.Render }} func() {{ $metric.Data.BasicType }}
3737
{{- end }}
3838
{{- end }}
@@ -60,6 +60,28 @@ func WithAttributeSet(set attribute.Set) telemetryBuilderOption {
6060
{{- end }}
6161

6262
{{- range $name, $metric := .Telemetry.Metrics }}
63+
{{- if $metric.Optional }}
64+
// 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 {
66+
var err error
67+
builder.{{ $name.Render }}, err = builder.meter.{{ $metric.Data.Instrument }}(
68+
"{{ $name }}",
69+
metric.WithDescription("{{ $metric.Description }}"),
70+
metric.WithUnit("{{ $metric.Unit }}"),
71+
{{- if eq $metric.Data.Type "Histogram" -}}
72+
{{ if $metric.Data.Boundaries -}}metric.WithExplicitBucketBoundaries([]float64{ {{- range $metric.Data.Boundaries }} {{.}}, {{- end }} }...),{{- end }}
73+
{{- end }}
74+
{{ if $metric.Data.Async -}}
75+
metric.With{{ casesTitle $metric.Data.BasicType }}Callback(func(_ context.Context, o metric.{{ casesTitle $metric.Data.BasicType }}Observer) error {
76+
o.Observe(cb(), metric.WithAttributeSet(builder.attributeSet))
77+
return nil
78+
}),
79+
{{- end }}
80+
)
81+
return err
82+
}
83+
84+
{{- else }}
6385
{{ if $metric.Data.Async -}}
6486
// With{{ $name.Render }}Callback sets callback for observable {{ $name.Render }} metric.
6587
func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}) telemetryBuilderOption {
@@ -68,6 +90,7 @@ func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}) tele
6890
}
6991
}
7092
{{- end }}
93+
{{- end }}
7194
{{- end }}
7295

7396

@@ -86,6 +109,7 @@ func NewTelemetryBuilder(settings component.TelemetrySettings, options ...teleme
86109
}
87110

88111
{{- range $name, $metric := .Telemetry.Metrics }}
112+
{{- if not $metric.Optional }}
89113
builder.{{ $name.Render }}, err = builder.meter.{{ $metric.Data.Instrument }}(
90114
"{{ $name }}",
91115
metric.WithDescription("{{ $metric.Description }}"),
@@ -102,6 +126,7 @@ func NewTelemetryBuilder(settings component.TelemetrySettings, options ...teleme
102126
)
103127
errs = errors.Join(errs, err)
104128
{{- end }}
129+
{{- end }}
105130
return &builder, errs
106131
}
107132

0 commit comments

Comments
 (0)