Skip to content

Commit 670c12d

Browse files
authored
Distribute internal metrics across different levels (#9767)
**Description:** This change distributes the reported internal metrics across available levels and updates the level set by default: 1. The default level is changed from `basic` to `normal`, which can be overridden with `service::telmetry::metrics::level` configuration. 2. The following batch processor metrics are updated to be reported starting from `normal` level instead of `basic` level: - `processor_batch_batch_send_size` - `processor_batch_metadata_cardinality` - `processor_batch_timeout_trigger_send` - `processor_batch_size_trigger_send` 3. The following GRPC/HTTP server and client metrics are updated to be reported starting from `detailed` level: - `http.client.*` metrics - `http.server.*` metrics - `rpc.server.*` metrics - `rpc.client.*` metrics **Link to tracking Issue:** #7890
1 parent d0f15e2 commit 670c12d

File tree

6 files changed

+77
-19
lines changed

6 files changed

+77
-19
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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: telemetry
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Distributed internal metrics across different levels.
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [7890]
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+
The internal metrics levels are updated along with reported metrics:
20+
- The default level is changed from `basic` to `normal`, which can be overridden with `service::telmetry::metrics::level` configuration.
21+
- Batch processor metrics are updated to be reported starting from `normal` level:
22+
- `processor_batch_batch_send_size`
23+
- `processor_batch_metadata_cardinality`
24+
- `processor_batch_timeout_trigger_send`
25+
- `processor_batch_size_trigger_send`
26+
- GRPC/HTTP server and client metrics are updated to be reported starting from `detailed` level:
27+
- http.client.* metrics
28+
- http.server.* metrics
29+
- rpc.server.* metrics
30+
- rpc.client.* metrics
31+
32+
# Optional: The change log or logs in which this entry should be included.
33+
# e.g. '[user]' or '[user, api]'
34+
# Include 'user' if the change is relevant to end users.
35+
# Include 'api' if there is a change to a library API.
36+
# Default: '[user]'
37+
change_logs: [user]

config/configgrpc/configgrpc.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"go.opentelemetry.io/collector/config/configcompression"
3131
"go.opentelemetry.io/collector/config/confignet"
3232
"go.opentelemetry.io/collector/config/configopaque"
33+
"go.opentelemetry.io/collector/config/configtelemetry"
3334
"go.opentelemetry.io/collector/config/configtls"
3435
"go.opentelemetry.io/collector/config/internal"
3536
"go.opentelemetry.io/collector/extension/auth"
@@ -253,9 +254,11 @@ func (gcs *ClientConfig) toDialOptions(host component.Host, settings component.T
253254

254255
otelOpts := []otelgrpc.Option{
255256
otelgrpc.WithTracerProvider(settings.TracerProvider),
256-
otelgrpc.WithMeterProvider(settings.MeterProvider),
257257
otelgrpc.WithPropagators(otel.GetTextMapPropagator()),
258258
}
259+
if settings.MetricsLevel >= configtelemetry.LevelDetailed {
260+
otelOpts = append(otelOpts, otelgrpc.WithMeterProvider(settings.MeterProvider))
261+
}
259262

260263
// Enable OpenTelemetry observability plugin.
261264
opts = append(opts, grpc.WithStatsHandler(otelgrpc.NewClientHandler(otelOpts...)))
@@ -356,9 +359,11 @@ func (gss *ServerConfig) toServerOption(host component.Host, settings component.
356359

357360
otelOpts := []otelgrpc.Option{
358361
otelgrpc.WithTracerProvider(settings.TracerProvider),
359-
otelgrpc.WithMeterProvider(settings.MeterProvider),
360362
otelgrpc.WithPropagators(otel.GetTextMapPropagator()),
361363
}
364+
if settings.MetricsLevel >= configtelemetry.LevelDetailed {
365+
otelOpts = append(otelOpts, otelgrpc.WithMeterProvider(settings.MeterProvider))
366+
}
362367

363368
// Enable OpenTelemetry observability plugin.
364369

config/configgrpc/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
go.opentelemetry.io/collector/config/configcompression v1.5.0
1212
go.opentelemetry.io/collector/config/confignet v0.98.0
1313
go.opentelemetry.io/collector/config/configopaque v1.5.0
14+
go.opentelemetry.io/collector/config/configtelemetry v0.98.0
1415
go.opentelemetry.io/collector/config/configtls v0.98.0
1516
go.opentelemetry.io/collector/config/internal v0.98.0
1617
go.opentelemetry.io/collector/extension/auth v0.98.0
@@ -48,7 +49,6 @@ require (
4849
github.com/prometheus/client_model v0.6.1 // indirect
4950
github.com/prometheus/common v0.52.3 // indirect
5051
github.com/prometheus/procfs v0.12.0 // indirect
51-
go.opentelemetry.io/collector/config/configtelemetry v0.98.0 // indirect
5252
go.opentelemetry.io/collector/confmap v0.98.0 // indirect
5353
go.opentelemetry.io/collector/extension v0.98.0 // indirect
5454
go.opentelemetry.io/collector/featuregate v1.5.0 // indirect

config/confighttp/confighttp.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"go.opentelemetry.io/collector/config/configauth"
2424
"go.opentelemetry.io/collector/config/configcompression"
2525
"go.opentelemetry.io/collector/config/configopaque"
26+
"go.opentelemetry.io/collector/config/configtelemetry"
2627
"go.opentelemetry.io/collector/config/configtls"
2728
"go.opentelemetry.io/collector/config/internal"
2829
"go.opentelemetry.io/collector/extension/auth"
@@ -206,14 +207,17 @@ func (hcs *ClientConfig) ToClient(ctx context.Context, host component.Host, sett
206207
}
207208
}
208209

210+
otelOpts := []otelhttp.Option{
211+
otelhttp.WithTracerProvider(settings.TracerProvider),
212+
otelhttp.WithPropagators(otel.GetTextMapPropagator()),
213+
}
214+
if settings.MetricsLevel >= configtelemetry.LevelDetailed {
215+
otelOpts = append(otelOpts, otelhttp.WithMeterProvider(settings.MeterProvider))
216+
}
217+
209218
// wrapping http transport with otelhttp transport to enable otel instrumentation
210219
if settings.TracerProvider != nil && settings.MeterProvider != nil {
211-
clientTransport = otelhttp.NewTransport(
212-
clientTransport,
213-
otelhttp.WithTracerProvider(settings.TracerProvider),
214-
otelhttp.WithMeterProvider(settings.MeterProvider),
215-
otelhttp.WithPropagators(otel.GetTextMapPropagator()),
216-
)
220+
clientTransport = otelhttp.NewTransport(clientTransport, otelOpts...)
217221
}
218222

219223
if hcs.CustomRoundTripper != nil {
@@ -383,18 +387,20 @@ func (hss *ServerConfig) ToServer(_ context.Context, host component.Host, settin
383387
handler = responseHeadersHandler(handler, hss.ResponseHeaders)
384388
}
385389

386-
// Enable OpenTelemetry observability plugin.
387-
// TODO: Consider to use component ID string as prefix for all the operations.
388-
handler = otelhttp.NewHandler(
389-
handler,
390-
"",
390+
otelOpts := []otelhttp.Option{
391391
otelhttp.WithTracerProvider(settings.TracerProvider),
392-
otelhttp.WithMeterProvider(settings.MeterProvider),
393392
otelhttp.WithPropagators(otel.GetTextMapPropagator()),
394393
otelhttp.WithSpanNameFormatter(func(_ string, r *http.Request) string {
395394
return r.URL.Path
396395
}),
397-
)
396+
}
397+
if settings.MetricsLevel >= configtelemetry.LevelDetailed {
398+
otelOpts = append(otelOpts, otelhttp.WithMeterProvider(settings.MeterProvider))
399+
}
400+
401+
// Enable OpenTelemetry observability plugin.
402+
// TODO: Consider to use component ID string as prefix for all the operations.
403+
handler = otelhttp.NewHandler(handler, "", otelOpts...)
398404

399405
// wrap the current handler in an interceptor that will add client.Info to the request's context
400406
handler = &clientInfoHandler{

otelcol/unmarshaler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func unmarshal(v *confmap.Conf, factories Factories) (*configSettings, error) {
5959
InitialFields: map[string]any(nil),
6060
},
6161
Metrics: telemetry.MetricsConfig{
62-
Level: configtelemetry.LevelBasic,
62+
Level: configtelemetry.LevelNormal,
6363
Address: ":8888",
6464
},
6565
},

processor/batchprocessor/metrics.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"go.opentelemetry.io/otel/attribute"
1010
"go.opentelemetry.io/otel/metric"
11+
noopmetric "go.opentelemetry.io/otel/metric/noop"
1112
"go.uber.org/multierr"
1213

1314
"go.opentelemetry.io/collector/component"
@@ -56,8 +57,17 @@ func newBatchProcessorTelemetry(set processor.CreateSettings, currentMetadataCar
5657
}
5758

5859
func (bpt *batchProcessorTelemetry) createOtelMetrics(set component.TelemetrySettings, currentMetadataCardinality func() int) error {
59-
var errors, err error
60-
meter := metadata.Meter(set)
60+
var (
61+
errors, err error
62+
meter metric.Meter
63+
)
64+
65+
// BatchProcessor are emitted starting from Normal level only.
66+
if bpt.level >= configtelemetry.LevelNormal {
67+
meter = metadata.Meter(set)
68+
} else {
69+
meter = noopmetric.Meter{}
70+
}
6171

6272
bpt.batchSizeTriggerSend, err = meter.Int64Counter(
6373
processorhelper.BuildCustomMetricName(typeStr, "batch_size_trigger_send"),

0 commit comments

Comments
 (0)