From 01abbeaeaa2d98e5eea0b406939181a91336ec71 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 13 Oct 2026 15:44:32 -0400 Subject: [PATCH] feat(rust): accept the global meter provider without a wrapper type Signed-off-by: Yordis Prieto --- templates/code/rust/README.md | 11 +++++++ templates/code/rust/logger.rs.j2 | 2 +- templates/code/rust/meter.rs.j2 | 2 +- .../rust/tests/allocations/expected/logger.rs | 2 +- .../rust/tests/allocations/expected/meter.rs | 2 +- .../event_no_attributes/expected/logger.rs | 2 +- .../code/rust/tests/events/expected/logger.rs | 2 +- .../expected/meter.rs | 2 +- .../expected/meter.rs | 2 +- .../rust/tests/imported/expected/logger.rs | 2 +- .../rust/tests/imported/expected/meter.rs | 2 +- .../rust/tests/imported/expected/tracer.rs | 2 +- .../tests/imported_typed/expected/logger.rs | 2 +- .../tests/imported_typed/expected/meter.rs | 2 +- .../tests/imported_typed/expected/tracer.rs | 2 +- .../tests/literal_escaping/expected/meter.rs | 2 +- .../code/rust/tests/metrics/expected/meter.rs | 2 +- templates/code/rust/tests/metrics/test.rs | 29 +++++++++++++++++++ .../code/rust/tests/naming/expected/meter.rs | 2 +- .../tests/no_namespace/expected/logger.rs | 2 +- .../tests/no_namespace/expected/tracer.rs | 2 +- .../code/rust/tests/params/expected/logger.rs | 2 +- .../code/rust/tests/params/expected/meter.rs | 2 +- .../code/rust/tests/params/expected/tracer.rs | 2 +- .../code/rust/tests/spans/expected/tracer.rs | 2 +- templates/code/rust/tracer.rs.j2 | 2 +- 26 files changed, 64 insertions(+), 24 deletions(-) diff --git a/templates/code/rust/README.md b/templates/code/rust/README.md index b54a61b..dcebe13 100644 --- a/templates/code/rust/README.md +++ b/templates/code/rust/README.md @@ -71,6 +71,17 @@ let tracer = semconv::tracer::Tracer::new(&provider, options); ``` Use `InstrumentationOptions::default()` when no scope attributes are needed. + +The constructors accept unsized providers, so a handle can come straight from +the global provider without a wrapper type: + +```rust +let meter = semconv::meter::Meter::new( + &*opentelemetry::global::meter_provider(), + semconv::options::InstrumentationOptions::default(), +); +``` + The instrumentation identity is fixed during generation. Set `instrumentation_name` and `instrumentation_version` in the Weaver params to choose its name and version. The name defaults to `generated-semconv`; an empty diff --git a/templates/code/rust/logger.rs.j2 b/templates/code/rust/logger.rs.j2 index 03e53a2..ffcfbd7 100644 --- a/templates/code/rust/logger.rs.j2 +++ b/templates/code/rust/logger.rs.j2 @@ -5,7 +5,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/meter.rs.j2 b/templates/code/rust/meter.rs.j2 index 4b4c5fa..b181e69 100644 --- a/templates/code/rust/meter.rs.j2 +++ b/templates/code/rust/meter.rs.j2 @@ -5,7 +5,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/allocations/expected/logger.rs b/templates/code/rust/tests/allocations/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/allocations/expected/logger.rs +++ b/templates/code/rust/tests/allocations/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/allocations/expected/meter.rs b/templates/code/rust/tests/allocations/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/allocations/expected/meter.rs +++ b/templates/code/rust/tests/allocations/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/event_no_attributes/expected/logger.rs b/templates/code/rust/tests/event_no_attributes/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/event_no_attributes/expected/logger.rs +++ b/templates/code/rust/tests/event_no_attributes/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/events/expected/logger.rs b/templates/code/rust/tests/events/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/events/expected/logger.rs +++ b/templates/code/rust/tests/events/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/histogram_boundaries_by_unit/expected/meter.rs b/templates/code/rust/tests/histogram_boundaries_by_unit/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/histogram_boundaries_by_unit/expected/meter.rs +++ b/templates/code/rust/tests/histogram_boundaries_by_unit/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/histogram_boundaries_by_unit_params/expected/meter.rs b/templates/code/rust/tests/histogram_boundaries_by_unit_params/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/histogram_boundaries_by_unit_params/expected/meter.rs +++ b/templates/code/rust/tests/histogram_boundaries_by_unit_params/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/imported/expected/logger.rs b/templates/code/rust/tests/imported/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/imported/expected/logger.rs +++ b/templates/code/rust/tests/imported/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/imported/expected/meter.rs b/templates/code/rust/tests/imported/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/imported/expected/meter.rs +++ b/templates/code/rust/tests/imported/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/imported/expected/tracer.rs b/templates/code/rust/tests/imported/expected/tracer.rs index d684a8d..e23c603 100644 --- a/templates/code/rust/tests/imported/expected/tracer.rs +++ b/templates/code/rust/tests/imported/expected/tracer.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) } diff --git a/templates/code/rust/tests/imported_typed/expected/logger.rs b/templates/code/rust/tests/imported_typed/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/imported_typed/expected/logger.rs +++ b/templates/code/rust/tests/imported_typed/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/imported_typed/expected/meter.rs b/templates/code/rust/tests/imported_typed/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/imported_typed/expected/meter.rs +++ b/templates/code/rust/tests/imported_typed/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/imported_typed/expected/tracer.rs b/templates/code/rust/tests/imported_typed/expected/tracer.rs index d684a8d..e23c603 100644 --- a/templates/code/rust/tests/imported_typed/expected/tracer.rs +++ b/templates/code/rust/tests/imported_typed/expected/tracer.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) } diff --git a/templates/code/rust/tests/literal_escaping/expected/meter.rs b/templates/code/rust/tests/literal_escaping/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/literal_escaping/expected/meter.rs +++ b/templates/code/rust/tests/literal_escaping/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/metrics/expected/meter.rs b/templates/code/rust/tests/metrics/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/metrics/expected/meter.rs +++ b/templates/code/rust/tests/metrics/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/metrics/test.rs b/templates/code/rust/tests/metrics/test.rs index b49171e..3ea34a3 100644 --- a/templates/code/rust/tests/metrics/test.rs +++ b/templates/code/rust/tests/metrics/test.rs @@ -365,3 +365,32 @@ fn instruments_expose_registry_metadata_as_constants() { metric::AuthAttempts::DESCRIPTION ); } + +#[test] +fn meter_accepts_the_global_provider_trait_object() { + let (provider, exporter) = provider(); + opentelemetry::global::set_meter_provider(provider.clone()); + let meter = meter::Meter::new( + &*opentelemetry::global::meter_provider(), + InstrumentationOptions::default(), + ); + metric::MyappTaskStarted::new(&meter).add( + 1, + [metric::MyappTaskStartedAttr::TaskId( + attribute::MyappTaskId::from("global"), + )], + ); + + provider.force_flush().unwrap(); + let exported = exporter.get_finished_metrics().unwrap(); + let scope = exported[0].scope_metrics().next().unwrap(); + assert_eq!(scope.scope().name(), "generated-semconv"); + assert_eq!( + scope.scope().schema_url(), + Some(generated_semconv::SCHEMA_URL) + ); + assert_eq!( + scope.metrics().next().unwrap().name(), + metric::MyappTaskStarted::NAME + ); +} diff --git a/templates/code/rust/tests/naming/expected/meter.rs b/templates/code/rust/tests/naming/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/naming/expected/meter.rs +++ b/templates/code/rust/tests/naming/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/no_namespace/expected/logger.rs b/templates/code/rust/tests/no_namespace/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/no_namespace/expected/logger.rs +++ b/templates/code/rust/tests/no_namespace/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/no_namespace/expected/tracer.rs b/templates/code/rust/tests/no_namespace/expected/tracer.rs index d684a8d..e23c603 100644 --- a/templates/code/rust/tests/no_namespace/expected/tracer.rs +++ b/templates/code/rust/tests/no_namespace/expected/tracer.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) } diff --git a/templates/code/rust/tests/params/expected/logger.rs b/templates/code/rust/tests/params/expected/logger.rs index 78bcc02..170920a 100644 --- a/templates/code/rust/tests/params/expected/logger.rs +++ b/templates/code/rust/tests/params/expected/logger.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Logger::Logger>(L); impl Logger { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let logger = provider.logger_with_scope(options.scope.into()); Self(logger) } diff --git a/templates/code/rust/tests/params/expected/meter.rs b/templates/code/rust/tests/params/expected/meter.rs index a330bd2..991a3d3 100644 --- a/templates/code/rust/tests/params/expected/meter.rs +++ b/templates/code/rust/tests/params/expected/meter.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Meter(opentelemetry::metrics::Meter); impl Meter { - pub fn new(provider: &impl opentelemetry::metrics::MeterProvider, options: InstrumentationOptions) -> Self { + pub fn new(provider: &(impl opentelemetry::metrics::MeterProvider + ?Sized), options: InstrumentationOptions) -> Self { let meter = provider.meter_with_scope(options.scope.into()); Self(meter) } diff --git a/templates/code/rust/tests/params/expected/tracer.rs b/templates/code/rust/tests/params/expected/tracer.rs index d684a8d..e23c603 100644 --- a/templates/code/rust/tests/params/expected/tracer.rs +++ b/templates/code/rust/tests/params/expected/tracer.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) } diff --git a/templates/code/rust/tests/spans/expected/tracer.rs b/templates/code/rust/tests/spans/expected/tracer.rs index d684a8d..e23c603 100644 --- a/templates/code/rust/tests/spans/expected/tracer.rs +++ b/templates/code/rust/tests/spans/expected/tracer.rs @@ -4,7 +4,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) } diff --git a/templates/code/rust/tracer.rs.j2 b/templates/code/rust/tracer.rs.j2 index e1cd4be..3645be4 100644 --- a/templates/code/rust/tracer.rs.j2 +++ b/templates/code/rust/tracer.rs.j2 @@ -5,7 +5,7 @@ use super::options::InstrumentationOptions; pub struct Tracer(T); impl Tracer { - pub fn new>(provider: &P, options: InstrumentationOptions) -> Self { + pub fn new + ?Sized>(provider: &P, options: InstrumentationOptions) -> Self { let tracer = provider.tracer_with_scope(options.scope.into()); Self(tracer) }