mdatagen: support setting telemetry level in telemetry builder (#10234)

This allows components to set the minimum level needed for them to
produce telemetry. By default, this is set to
`configtelemetryLevelBasic`. If the telemetry level is below that
minimum level, then the noop meter is used for metrics.

---------

Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com>
This commit is contained in:
Alex Boten 2024-05-28 08:59:50 -07:00 committed by GitHub
parent c7c3401f39
commit 52a9520fdb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 208 additions and 26 deletions

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: mdatagen
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: support using telemetry level in telemetry builder
# One or more tracking issues or pull requests related to the change
issues: [10234]
# (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: This allows components to set the minimum level needed for them to produce telemetry. By default, this is set to configtelemetry.LevelBasic. If the telemetry level is below that minimum level, then the noop meter is used for metrics.
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: bug_fix
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: batchprocessor
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: respect telemetry level for all metrics
# One or more tracking issues or pull requests related to the change
issues: [10234]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []

View File

@ -6,6 +6,7 @@ require (
github.com/google/go-cmp v0.6.0
github.com/stretchr/testify v1.9.0
go.opentelemetry.io/collector/component v0.101.0
go.opentelemetry.io/collector/config/configtelemetry v0.101.0
go.opentelemetry.io/collector/confmap v0.101.0
go.opentelemetry.io/collector/confmap/provider/fileprovider v0.101.0
go.opentelemetry.io/collector/consumer v0.101.0
@ -43,7 +44,6 @@ require (
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.53.0 // indirect
github.com/prometheus/procfs v0.15.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.101.0 // indirect
go.opentelemetry.io/otel v1.27.0 // indirect
go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect
go.opentelemetry.io/otel/sdk v1.27.0 // indirect

View File

@ -7,9 +7,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -27,11 +29,19 @@ type TelemetryBuilder struct {
ProcessRuntimeTotalAllocBytes metric.Int64ObservableCounter
observeProcessRuntimeTotalAllocBytes func() int64
RequestDuration metric.Float64Histogram
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// WithProcessRuntimeTotalAllocBytesCallback sets callback for observable ProcessRuntimeTotalAllocBytes metric.
func WithProcessRuntimeTotalAllocBytesCallback(cb func() int64) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
@ -42,12 +52,19 @@ func WithProcessRuntimeTotalAllocBytesCallback(cb func() int64) telemetryBuilder
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelBasic {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.BatchSizeTriggerSend, err = meter.Int64Counter(
"batch_size_trigger_send",
metric.WithDescription("Number of times the batch was sent due to a size trigger"),

View File

@ -11,6 +11,7 @@ import (
"path/filepath"
"strings"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/confmap/confmaptest"
"go.opentelemetry.io/collector/confmap/provider/fileprovider"
@ -227,6 +228,7 @@ type tests struct {
}
type telemetry struct {
Level configtelemetry.Level `mapstructure:"level"`
Metrics map[metricName]metric `mapstructure:"metrics"`
}

View File

@ -538,9 +538,12 @@ func TestGenerateTelemetryMetadata(t *testing.T) {
package metadata
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -569,9 +572,12 @@ func Tracer(settings component.TelemetrySettings) trace.Tracer {
package metadata
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {

View File

@ -130,6 +130,8 @@ tests:
# Optional: map of metric names with the key being the metric name and value
# being described below.
telemetry:
# Optional: level allows components to specify the minimum telemetry level for metrics to be produced. defaults to basic if not set.
level: string
metrics:
<metric.name>:
# Required: whether the metric is collected by default.

View File

@ -8,9 +8,12 @@ import (
"errors"
{{- end }}
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -31,11 +34,19 @@ type TelemetryBuilder struct {
observe{{ $name.Render }} func() {{ $metric.Data.BasicType }}
{{- end }}
{{- end }}
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
{{- range $name, $metric := .Telemetry.Metrics }}
{{ if $metric.Data.Async -}}
// With{{ $name.Render }}Callback sets callback for observable {{ $name.Render }} metric.
@ -50,12 +61,20 @@ func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}) tele
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.Level{{ casesTitle .Telemetry.Level.String }} {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
{{- range $name, $metric := .Telemetry.Metrics }}
builder.{{ $name.Render }}, err = meter.{{ $metric.Data.Instrument }}(
"{{ $name }}",

View File

@ -6,9 +6,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -31,20 +33,35 @@ type TelemetryBuilder struct {
ExporterSentLogRecords metric.Int64Counter
ExporterSentMetricPoints metric.Int64Counter
ExporterSentSpans metric.Int64Counter
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelBasic {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.ExporterEnqueueFailedLogRecords, err = meter.Int64Counter(
"exporter_enqueue_failed_log_records",
metric.WithDescription("Number of log records failed to be added to the sending queue."),

View File

@ -6,9 +6,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -26,20 +28,35 @@ type TelemetryBuilder struct {
ProcessorBatchBatchSendSizeBytes metric.Int64Histogram
ProcessorBatchBatchSizeTriggerSend metric.Int64Counter
ProcessorBatchTimeoutTriggerSend metric.Int64Counter
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelNormal {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.ProcessorBatchBatchSendSize, err = meter.Int64Histogram(
"processor_batch_batch_send_size",
metric.WithDescription("Number of units in the batch"),

View File

@ -9,6 +9,7 @@ status:
tests:
telemetry:
level: normal
metrics:
processor_batch_batch_size_trigger_send:
enabled: true

View File

@ -66,7 +66,7 @@ func (bpt *batchProcessorTelemetry) createOtelMetrics(set component.TelemetrySet
meter = noopmetric.Meter{}
}
bpt.telemetryBuilder, err = metadata.NewTelemetryBuilder(set)
bpt.telemetryBuilder, err = metadata.NewTelemetryBuilder(set, metadata.WithLevel(bpt.level))
errors = multierr.Append(errors, err)
bpt.batchMetadataCardinality, err = meter.Int64ObservableUpDownCounter(

View File

@ -6,9 +6,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -31,20 +33,35 @@ type TelemetryBuilder struct {
ProcessorRefusedLogRecords metric.Int64Counter
ProcessorRefusedMetricPoints metric.Int64Counter
ProcessorRefusedSpans metric.Int64Counter
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelBasic {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.ProcessorAcceptedLogRecords, err = meter.Int64Counter(
"processor_accepted_log_records",
metric.WithDescription("Number of log records successfully pushed into the next component in the pipeline."),

View File

@ -6,9 +6,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -28,20 +30,35 @@ type TelemetryBuilder struct {
ReceiverRefusedLogRecords metric.Int64Counter
ReceiverRefusedMetricPoints metric.Int64Counter
ReceiverRefusedSpans metric.Int64Counter
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelBasic {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.ReceiverAcceptedLogRecords, err = meter.Int64Counter(
"receiver_accepted_log_records",
metric.WithDescription("Number of log records successfully pushed into the pipeline."),

View File

@ -6,9 +6,11 @@ import (
"errors"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
)
func Meter(settings component.TelemetrySettings) metric.Meter {
@ -24,20 +26,35 @@ func Tracer(settings component.TelemetrySettings) trace.Tracer {
type TelemetryBuilder struct {
ScraperErroredMetricPoints metric.Int64Counter
ScraperScrapedMetricPoints metric.Int64Counter
level configtelemetry.Level
}
// telemetryBuilderOption applies changes to default builder.
type telemetryBuilderOption func(*TelemetryBuilder)
// WithLevel sets the current telemetry level for the component.
func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption {
return func(builder *TelemetryBuilder) {
builder.level = lvl
}
}
// NewTelemetryBuilder provides a struct with methods to update all internal telemetry
// for a component
func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) {
builder := TelemetryBuilder{}
builder := TelemetryBuilder{level: configtelemetry.LevelBasic}
for _, op := range options {
op(&builder)
}
var err, errs error
meter := Meter(settings)
var (
err, errs error
meter metric.Meter
)
if builder.level >= configtelemetry.LevelBasic {
meter = Meter(settings)
} else {
meter = noop.Meter{}
}
builder.ScraperErroredMetricPoints, err = meter.Int64Counter(
"scraper_errored_metric_points",
metric.WithDescription("Number of metric points that were unable to be scraped."),