From 780eb00a04282ff9844abc31b0cc2ac9e82465ae Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Thu, 12 Sep 2024 21:17:30 +0000 Subject: [PATCH 1/3] Remove ObjectSafeMeterProvider --- opentelemetry-sdk/benches/metric.rs | 9 +- opentelemetry-sdk/benches/metrics_counter.rs | 2 +- opentelemetry-sdk/benches/metrics_gauge.rs | 2 +- .../benches/metrics_histogram.rs | 2 +- opentelemetry-sdk/src/metrics/meter.rs | 2 +- .../src/metrics/meter_provider.rs | 59 ++++++++---- opentelemetry-sdk/src/metrics/mod.rs | 30 +++--- .../src/metrics/periodic_reader.rs | 2 +- .../src/testing/metrics/in_memory_exporter.rs | 2 +- opentelemetry/src/global/metrics.rs | 92 ++----------------- opentelemetry/src/metrics/meter.rs | 23 ++--- opentelemetry/src/metrics/noop.rs | 8 +- stress/src/metrics_counter.rs | 5 +- stress/src/metrics_gauge.rs | 5 +- stress/src/metrics_histogram.rs | 5 +- stress/src/metrics_overflow.rs | 5 +- 16 files changed, 106 insertions(+), 147 deletions(-) diff --git a/opentelemetry-sdk/benches/metric.rs b/opentelemetry-sdk/benches/metric.rs index 88143bccff..2a4bdbcad7 100644 --- a/opentelemetry-sdk/benches/metric.rs +++ b/opentelemetry-sdk/benches/metric.rs @@ -149,7 +149,10 @@ fn bench_counter(view: Option>, temporality: &str) -> (SharedReade builder = builder.with_view(view); } let provider = builder.build(); - let cntr = provider.meter("test").u64_counter("hello").init(); + let cntr = provider + .meter("test".to_string()) + .u64_counter("hello") + .init(); (rdr, cntr) } @@ -365,7 +368,7 @@ fn bench_histogram(bound_count: usize) -> (SharedReader, Histogram) { if let Some(view) = view { builder = builder.with_view(view); } - let mtr = builder.build().meter("test_meter"); + let mtr = builder.build().meter("test_meter".to_string()); let hist = mtr .u64_histogram(format!("histogram_{}", bound_count)) .init(); @@ -405,7 +408,7 @@ fn benchmark_collect_histogram(b: &mut Bencher, n: usize) { let mtr = SdkMeterProvider::builder() .with_reader(r.clone()) .build() - .meter("sdk/metric/bench/histogram"); + .meter("sdk/metric/bench/histogram".to_string()); for i in 0..n { let h = mtr.u64_histogram(format!("fake_data_{i}")).init(); diff --git a/opentelemetry-sdk/benches/metrics_counter.rs b/opentelemetry-sdk/benches/metrics_counter.rs index b6951664cd..10f3d9f8df 100644 --- a/opentelemetry-sdk/benches/metrics_counter.rs +++ b/opentelemetry-sdk/benches/metrics_counter.rs @@ -41,7 +41,7 @@ fn create_counter(name: &'static str) -> Counter { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks"); + let meter = meter_provider.meter("benchmarks".to_string()); println!("Counter_Created"); meter.u64_counter(name).init() diff --git a/opentelemetry-sdk/benches/metrics_gauge.rs b/opentelemetry-sdk/benches/metrics_gauge.rs index b63c8a7b52..03e1d03d65 100644 --- a/opentelemetry-sdk/benches/metrics_gauge.rs +++ b/opentelemetry-sdk/benches/metrics_gauge.rs @@ -37,7 +37,7 @@ fn create_gauge() -> Gauge { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks"); + let meter = meter_provider.meter("benchmarks".to_string()); meter.u64_gauge("gauge_bench").init() } diff --git a/opentelemetry-sdk/benches/metrics_histogram.rs b/opentelemetry-sdk/benches/metrics_histogram.rs index 517877e673..18ff6b8e69 100644 --- a/opentelemetry-sdk/benches/metrics_histogram.rs +++ b/opentelemetry-sdk/benches/metrics_histogram.rs @@ -39,7 +39,7 @@ fn create_histogram(name: &'static str) -> Histogram { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks"); + let meter = meter_provider.meter("benchmarks".to_string()); meter.u64_histogram(name).init() } diff --git a/opentelemetry-sdk/src/metrics/meter.rs b/opentelemetry-sdk/src/metrics/meter.rs index eace66644f..39e4ec4040 100644 --- a/opentelemetry-sdk/src/metrics/meter.rs +++ b/opentelemetry-sdk/src/metrics/meter.rs @@ -540,7 +540,7 @@ mod tests { #[ignore = "See issue https://github.com/open-telemetry/opentelemetry-rust/issues/1699"] fn test_instrument_creation() { let provider = SdkMeterProvider::builder().build(); - let meter = provider.meter("test"); + let meter = provider.meter("test".to_string()); assert!(meter.u64_counter("test").try_init().is_ok()); let result = meter.u64_counter("test with invalid name").try_init(); // this assert fails, as result is always ok variant. diff --git a/opentelemetry-sdk/src/metrics/meter_provider.rs b/opentelemetry-sdk/src/metrics/meter_provider.rs index c693b2aa56..af5dcdc760 100644 --- a/opentelemetry-sdk/src/metrics/meter_provider.rs +++ b/opentelemetry-sdk/src/metrics/meter_provider.rs @@ -1,6 +1,5 @@ use core::fmt; use std::{ - borrow::Cow, collections::HashMap, sync::{ atomic::{AtomicBool, Ordering}, @@ -139,9 +138,9 @@ impl Drop for SdkMeterProviderInner { impl MeterProvider for SdkMeterProvider { fn versioned_meter( &self, - name: impl Into>, - version: Option>>, - schema_url: Option>>, + name: String, + version: Option, + schema_url: Option, attributes: Option>, ) -> Meter { if self.inner.is_shutdown.load(Ordering::Relaxed) { @@ -443,24 +442,48 @@ mod tests { #[test] fn same_meter_reused_same_scope() { let provider = super::SdkMeterProvider::builder().build(); - let _meter1 = provider.meter("test"); - let _meter2 = provider.meter("test"); + let _meter1 = provider.meter("test".to_string()); + let _meter2 = provider.meter("test".to_string()); assert_eq!(provider.inner.meters.lock().unwrap().len(), 1); - let _meter3 = - provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); - let _meter4 = - provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); - let _meter5 = - provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); + let _meter3 = provider.versioned_meter( + "test".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); + let _meter4 = provider.versioned_meter( + "test".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); + let _meter5 = provider.versioned_meter( + "test".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); assert_eq!(provider.inner.meters.lock().unwrap().len(), 2); // the below are different meters, as meter names are case sensitive - let _meter6 = - provider.versioned_meter("ABC", Some("1.0.0"), Some("http://example.com"), None); - let _meter7 = - provider.versioned_meter("Abc", Some("1.0.0"), Some("http://example.com"), None); - let _meter8 = - provider.versioned_meter("abc", Some("1.0.0"), Some("http://example.com"), None); + let _meter6 = provider.versioned_meter( + "ABC".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); + let _meter7 = provider.versioned_meter( + "Abc".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); + let _meter8 = provider.versioned_meter( + "abc".to_string(), + Some("1.0.0".to_string()), + Some("http://example.com".to_string()), + None, + ); assert_eq!(provider.inner.meters.lock().unwrap().len(), 5); } } diff --git a/opentelemetry-sdk/src/metrics/mod.rs b/opentelemetry-sdk/src/metrics/mod.rs index 0e1f978525..c2b38c2be2 100644 --- a/opentelemetry-sdk/src/metrics/mod.rs +++ b/opentelemetry-sdk/src/metrics/mod.rs @@ -433,7 +433,7 @@ mod tests { let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); // Act - let meter = meter_provider.meter("test"); + let meter = meter_provider.meter("test".to_string()); let counter = meter .u64_counter("my_counter") .with_unit("my_unit") @@ -484,8 +484,8 @@ mod tests { let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); // Act - let meter1 = meter_provider.meter("test.meter1"); - let meter2 = meter_provider.meter("test.meter2"); + let meter1 = meter_provider.meter("test.meter1".to_string()); + let meter2 = meter_provider.meter("test.meter2".to_string()); let counter1 = meter1 .u64_counter("my_counter") .with_unit("my_unit") @@ -576,15 +576,15 @@ mod tests { // Meters are identical except for scope attributes, but scope attributes are not an identifying property. // Hence there should be a single metric stream output for this test. let meter1 = meter_provider.versioned_meter( - "test.meter", - Some("v0.1.0"), - Some("schema_url"), + "test.meter".to_string(), + Some("v0.1.0".to_string()), + Some("schema_url".to_string()), Some(vec![KeyValue::new("key", "value1")]), ); let meter2 = meter_provider.versioned_meter( - "test.meter", - Some("v0.1.0"), - Some("schema_url"), + "test.meter".to_string(), + Some("v0.1.0".to_string()), + Some("schema_url".to_string()), Some(vec![KeyValue::new("key", "value2")]), ); let counter1 = meter1 @@ -670,7 +670,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test"); + let meter = meter_provider.meter("test".to_string()); let histogram = meter .f64_histogram("test_histogram") .with_unit("test_unit") @@ -715,7 +715,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test"); + let meter = meter_provider.meter("test".to_string()); let _observable_counter = meter .u64_observable_counter("my_observable_counter") .with_callback(|observer| { @@ -790,7 +790,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test"); + let meter = meter_provider.meter("test".to_string()); let counter = meter.u64_counter("my_counter").init(); // Normally, this would generate 3 time-series, but since the view @@ -2277,7 +2277,7 @@ mod tests { counter_name: &'static str, unit: Option<&'static str>, ) -> Counter { - let meter = self.meter_provider.meter(meter_name); + let meter = self.meter_provider.meter(meter_name.to_string()); let mut counter_builder = meter.u64_counter(counter_name); if let Some(unit_name) = unit { counter_builder = counter_builder.with_unit(unit_name); @@ -2291,7 +2291,7 @@ mod tests { counter_name: &'static str, unit: Option<&'static str>, ) -> UpDownCounter { - let meter = self.meter_provider.meter(meter_name); + let meter = self.meter_provider.meter(meter_name.to_string()); let mut updown_counter_builder = meter.i64_up_down_counter(counter_name); if let Some(unit_name) = unit { updown_counter_builder = updown_counter_builder.with_unit(unit_name); @@ -2300,7 +2300,7 @@ mod tests { } fn meter(&self) -> Meter { - self.meter_provider.meter("test") + self.meter_provider.meter("test".to_string()) } fn flush_metrics(&self) { diff --git a/opentelemetry-sdk/src/metrics/periodic_reader.rs b/opentelemetry-sdk/src/metrics/periodic_reader.rs index 7821786675..9f01bc0601 100644 --- a/opentelemetry-sdk/src/metrics/periodic_reader.rs +++ b/opentelemetry-sdk/src/metrics/periodic_reader.rs @@ -393,7 +393,7 @@ mod tests { // Act let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); - let meter = meter_provider.meter("test"); + let meter = meter_provider.meter("test".to_string()); let _counter = meter .u64_observable_counter("testcounter") .with_callback(move |_| { diff --git a/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs b/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs index 3f85b360b7..7d24ee82bd 100644 --- a/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs +++ b/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs @@ -41,7 +41,7 @@ use std::sync::{Arc, Mutex}; /// .build(); /// /// // Create and record metrics using the MeterProvider -/// let meter = meter_provider.meter(std::borrow::Cow::Borrowed("example")); +/// let meter = meter_provider.meter("example".to_string()); /// let counter = meter.u64_counter("my_counter").init(); /// counter.add(1, &[KeyValue::new("key", "value")]); /// diff --git a/opentelemetry/src/global/metrics.rs b/opentelemetry/src/global/metrics.rs index 7826f9920e..d60479b4f9 100644 --- a/opentelemetry/src/global/metrics.rs +++ b/opentelemetry/src/global/metrics.rs @@ -1,90 +1,16 @@ use crate::metrics::{self, Meter, MeterProvider}; use crate::KeyValue; -use core::fmt; use once_cell::sync::Lazy; use std::{ borrow::Cow, sync::{Arc, RwLock}, }; -/// The global `MeterProvider` singleton. -static GLOBAL_METER_PROVIDER: Lazy> = Lazy::new(|| { - RwLock::new(GlobalMeterProvider::new( - metrics::noop::NoopMeterProvider::new(), - )) -}); - -/// Allows a specific [MeterProvider] to be used generically by the -/// [GlobalMeterProvider] by mirroring the interface and boxing the return types. -trait ObjectSafeMeterProvider { - /// Creates a versioned named meter instance that is a trait object through the underlying - /// [MeterProvider]. - fn versioned_meter_cow( - &self, - name: Cow<'static, str>, - version: Option>, - schema_url: Option>, - attributes: Option>, - ) -> Meter; -} - -impl

ObjectSafeMeterProvider for P -where - P: MeterProvider, -{ - /// Return a versioned boxed tracer - fn versioned_meter_cow( - &self, - name: Cow<'static, str>, - version: Option>, - schema_url: Option>, - attributes: Option>, - ) -> Meter { - self.versioned_meter(name, version, schema_url, attributes) - } -} +type GlobalMeterProvider = Arc; -/// Represents the globally configured [`MeterProvider`] instance for this -/// application. -#[derive(Clone)] -pub struct GlobalMeterProvider { - provider: Arc, -} - -impl fmt::Debug for GlobalMeterProvider { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("GlobalMeterProvider").finish() - } -} - -impl MeterProvider for GlobalMeterProvider { - fn versioned_meter( - &self, - name: impl Into>, - version: Option>>, - schema_url: Option>>, - attributes: Option>, - ) -> Meter { - self.provider.versioned_meter_cow( - name.into(), - version.map(Into::into), - schema_url.map(Into::into), - attributes, - ) - } -} - -impl GlobalMeterProvider { - /// Create a new global meter provider - fn new

(provider: P) -> Self - where - P: MeterProvider + Send + Sync + 'static, - { - GlobalMeterProvider { - provider: Arc::new(provider), - } - } -} +/// The global `MeterProvider` singleton. +static GLOBAL_METER_PROVIDER: Lazy> = + Lazy::new(|| RwLock::new(Arc::new(metrics::noop::NoopMeterProvider::new()))); /// Sets the given [`MeterProvider`] instance as the current global meter /// provider. @@ -95,7 +21,7 @@ where let mut global_provider = GLOBAL_METER_PROVIDER .write() .expect("GLOBAL_METER_PROVIDER RwLock poisoned"); - *global_provider = GlobalMeterProvider::new(new_provider); + *global_provider = Arc::new(new_provider); } /// Returns an instance of the currently configured global [`MeterProvider`] @@ -113,7 +39,7 @@ pub fn meter_provider() -> GlobalMeterProvider { /// /// This is a more convenient way of expressing `global::meter_provider().meter(name)`. pub fn meter(name: impl Into>) -> Meter { - meter_provider().meter(name.into()) + meter_provider().meter(name.into().into_owned()) } /// Creates a [`Meter`] with the name, version and schema url. @@ -144,9 +70,9 @@ pub fn meter_with_version( attributes: Option>, ) -> Meter { meter_provider().versioned_meter( - name.into(), - version.map(Into::into), - schema_url.map(Into::into), + name.into().into_owned(), + version.map(|v| v.into().into_owned()), + schema_url.map(|s| s.into().into_owned()), attributes, ) } diff --git a/opentelemetry/src/metrics/meter.rs b/opentelemetry/src/metrics/meter.rs index 3422240b48..da242d5d60 100644 --- a/opentelemetry/src/metrics/meter.rs +++ b/opentelemetry/src/metrics/meter.rs @@ -29,23 +29,18 @@ pub trait MeterProvider { /// let provider = global::meter_provider(); /// /// // meter used in applications - /// let meter = provider.meter("my_app"); + /// let meter = provider.meter("my_app".to_string()); /// /// // meter used in libraries/crates that optionally includes version and schema url /// let meter = provider.versioned_meter( - /// "my_library", - /// Some(env!("CARGO_PKG_VERSION")), - /// Some("https://opentelemetry.io/schema/1.0.0"), + /// "my_library".to_string(), + /// Some(env!("CARGO_PKG_VERSION").to_string()), + /// Some("https://opentelemetry.io/schema/1.0.0".to_string()), /// Some(vec![KeyValue::new("key", "value")]), /// ); /// ``` - fn meter(&self, name: impl Into>) -> Meter { - self.versioned_meter( - name, - None::>, - None::>, - None, - ) + fn meter(&self, name: String) -> Meter { + self.versioned_meter(name, None, None, None) } /// Returns a new versioned meter with a given name. @@ -56,9 +51,9 @@ pub trait MeterProvider { /// default name will be used instead. fn versioned_meter( &self, - name: impl Into>, - version: Option>>, - schema_url: Option>>, + name: String, + version: Option, + schema_url: Option, attributes: Option>, ) -> Meter; } diff --git a/opentelemetry/src/metrics/noop.rs b/opentelemetry/src/metrics/noop.rs index 716e4ca3c8..4d0af61661 100644 --- a/opentelemetry/src/metrics/noop.rs +++ b/opentelemetry/src/metrics/noop.rs @@ -10,7 +10,7 @@ use crate::{ }, KeyValue, }; -use std::{any::Any, borrow::Cow, sync::Arc}; +use std::{any::Any, sync::Arc}; /// A no-op instance of a `MetricProvider` #[derive(Debug, Default)] @@ -28,9 +28,9 @@ impl NoopMeterProvider { impl MeterProvider for NoopMeterProvider { fn versioned_meter( &self, - _name: impl Into>, - _version: Option>>, - _schema_url: Option>>, + _name: String, + _version: Option, + _schema_url: Option, _attributes: Option>, ) -> Meter { Meter::new(Arc::new(NoopMeterCore::new())) diff --git a/stress/src/metrics_counter.rs b/stress/src/metrics_counter.rs index 452907f2bf..63e58fb89a 100644 --- a/stress/src/metrics_counter.rs +++ b/stress/src/metrics_counter.rs @@ -31,7 +31,10 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref COUNTER: Counter = PROVIDER.meter("test").u64_counter("hello").init(); + static ref COUNTER: Counter = PROVIDER + .meter("test".to_string()) + .u64_counter("hello") + .init(); } thread_local! { diff --git a/stress/src/metrics_gauge.rs b/stress/src/metrics_gauge.rs index 9f01dabb16..aef440a6df 100644 --- a/stress/src/metrics_gauge.rs +++ b/stress/src/metrics_gauge.rs @@ -28,7 +28,10 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref GAUGE: Gauge = PROVIDER.meter("test").u64_gauge("test_gauge").init(); + static ref GAUGE: Gauge = PROVIDER + .meter("test".to_string()) + .u64_gauge("test_gauge") + .init(); } thread_local! { diff --git a/stress/src/metrics_histogram.rs b/stress/src/metrics_histogram.rs index e0f469fc33..f2e403021a 100644 --- a/stress/src/metrics_histogram.rs +++ b/stress/src/metrics_histogram.rs @@ -31,7 +31,10 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref HISTOGRAM: Histogram = PROVIDER.meter("test").u64_histogram("hello").init(); + static ref HISTOGRAM: Histogram = PROVIDER + .meter("test".to_string()) + .u64_histogram("hello") + .init(); } thread_local! { diff --git a/stress/src/metrics_overflow.rs b/stress/src/metrics_overflow.rs index d2e552ed67..1f90dabab3 100644 --- a/stress/src/metrics_overflow.rs +++ b/stress/src/metrics_overflow.rs @@ -24,7 +24,10 @@ lazy_static! { static ref PROVIDER: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - static ref COUNTER: Counter = PROVIDER.meter("test").u64_counter("hello").init(); + static ref COUNTER: Counter = PROVIDER + .meter("test".to_string()) + .u64_counter("hello") + .init(); } thread_local! { From f5272b8860c299ef3c4b97fed80f90842110bb71 Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Thu, 12 Sep 2024 21:41:10 +0000 Subject: [PATCH 2/3] Fix docs --- opentelemetry/src/global/metrics.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/opentelemetry/src/global/metrics.rs b/opentelemetry/src/global/metrics.rs index d60479b4f9..3e9f3fffbf 100644 --- a/opentelemetry/src/global/metrics.rs +++ b/opentelemetry/src/global/metrics.rs @@ -24,8 +24,7 @@ where *global_provider = Arc::new(new_provider); } -/// Returns an instance of the currently configured global [`MeterProvider`] -/// through [`GlobalMeterProvider`]. +/// Returns an instance of the currently configured global [`MeterProvider`]. pub fn meter_provider() -> GlobalMeterProvider { GLOBAL_METER_PROVIDER .read() @@ -33,7 +32,7 @@ pub fn meter_provider() -> GlobalMeterProvider { .clone() } -/// Creates a named [`Meter`] via the configured [`GlobalMeterProvider`]. +/// Creates a named [`Meter`] via the currently configured global [`MeterProvider`]. /// /// If the name is an empty string, the provider will use a default name. /// From d623da49606cd54b48bb77ab2d90554bd24881ec Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai <66651184+utpilla@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:40:43 +0000 Subject: [PATCH 3/3] Use static string slices --- opentelemetry-sdk/benches/metric.rs | 9 +-- opentelemetry-sdk/benches/metrics_counter.rs | 2 +- opentelemetry-sdk/benches/metrics_gauge.rs | 2 +- .../benches/metrics_histogram.rs | 2 +- opentelemetry-sdk/src/metrics/meter.rs | 2 +- .../src/metrics/meter_provider.rs | 58 ++++++------------- opentelemetry-sdk/src/metrics/mod.rs | 30 +++++----- .../src/metrics/periodic_reader.rs | 2 +- .../src/testing/metrics/in_memory_exporter.rs | 2 +- opentelemetry/src/global/metrics.rs | 22 +++---- opentelemetry/src/metrics/meter.rs | 16 ++--- opentelemetry/src/metrics/noop.rs | 6 +- stress/src/metrics_counter.rs | 5 +- stress/src/metrics_gauge.rs | 5 +- stress/src/metrics_histogram.rs | 5 +- stress/src/metrics_overflow.rs | 5 +- 16 files changed, 63 insertions(+), 110 deletions(-) diff --git a/opentelemetry-sdk/benches/metric.rs b/opentelemetry-sdk/benches/metric.rs index 2a4bdbcad7..88143bccff 100644 --- a/opentelemetry-sdk/benches/metric.rs +++ b/opentelemetry-sdk/benches/metric.rs @@ -149,10 +149,7 @@ fn bench_counter(view: Option>, temporality: &str) -> (SharedReade builder = builder.with_view(view); } let provider = builder.build(); - let cntr = provider - .meter("test".to_string()) - .u64_counter("hello") - .init(); + let cntr = provider.meter("test").u64_counter("hello").init(); (rdr, cntr) } @@ -368,7 +365,7 @@ fn bench_histogram(bound_count: usize) -> (SharedReader, Histogram) { if let Some(view) = view { builder = builder.with_view(view); } - let mtr = builder.build().meter("test_meter".to_string()); + let mtr = builder.build().meter("test_meter"); let hist = mtr .u64_histogram(format!("histogram_{}", bound_count)) .init(); @@ -408,7 +405,7 @@ fn benchmark_collect_histogram(b: &mut Bencher, n: usize) { let mtr = SdkMeterProvider::builder() .with_reader(r.clone()) .build() - .meter("sdk/metric/bench/histogram".to_string()); + .meter("sdk/metric/bench/histogram"); for i in 0..n { let h = mtr.u64_histogram(format!("fake_data_{i}")).init(); diff --git a/opentelemetry-sdk/benches/metrics_counter.rs b/opentelemetry-sdk/benches/metrics_counter.rs index 10f3d9f8df..b6951664cd 100644 --- a/opentelemetry-sdk/benches/metrics_counter.rs +++ b/opentelemetry-sdk/benches/metrics_counter.rs @@ -41,7 +41,7 @@ fn create_counter(name: &'static str) -> Counter { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks".to_string()); + let meter = meter_provider.meter("benchmarks"); println!("Counter_Created"); meter.u64_counter(name).init() diff --git a/opentelemetry-sdk/benches/metrics_gauge.rs b/opentelemetry-sdk/benches/metrics_gauge.rs index 03e1d03d65..b63c8a7b52 100644 --- a/opentelemetry-sdk/benches/metrics_gauge.rs +++ b/opentelemetry-sdk/benches/metrics_gauge.rs @@ -37,7 +37,7 @@ fn create_gauge() -> Gauge { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks".to_string()); + let meter = meter_provider.meter("benchmarks"); meter.u64_gauge("gauge_bench").init() } diff --git a/opentelemetry-sdk/benches/metrics_histogram.rs b/opentelemetry-sdk/benches/metrics_histogram.rs index 18ff6b8e69..517877e673 100644 --- a/opentelemetry-sdk/benches/metrics_histogram.rs +++ b/opentelemetry-sdk/benches/metrics_histogram.rs @@ -39,7 +39,7 @@ fn create_histogram(name: &'static str) -> Histogram { let meter_provider: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - let meter = meter_provider.meter("benchmarks".to_string()); + let meter = meter_provider.meter("benchmarks"); meter.u64_histogram(name).init() } diff --git a/opentelemetry-sdk/src/metrics/meter.rs b/opentelemetry-sdk/src/metrics/meter.rs index d915d736e3..7c2df90e5b 100644 --- a/opentelemetry-sdk/src/metrics/meter.rs +++ b/opentelemetry-sdk/src/metrics/meter.rs @@ -540,7 +540,7 @@ mod tests { #[ignore = "See issue https://github.com/open-telemetry/opentelemetry-rust/issues/1699"] fn test_instrument_creation() { let provider = SdkMeterProvider::builder().build(); - let meter = provider.meter("test".to_string()); + let meter = provider.meter("test"); assert!(meter.u64_counter("test").try_init().is_ok()); let result = meter.u64_counter("test with invalid name").try_init(); // this assert fails, as result is always ok variant. diff --git a/opentelemetry-sdk/src/metrics/meter_provider.rs b/opentelemetry-sdk/src/metrics/meter_provider.rs index af5dcdc760..9f7b682abd 100644 --- a/opentelemetry-sdk/src/metrics/meter_provider.rs +++ b/opentelemetry-sdk/src/metrics/meter_provider.rs @@ -138,9 +138,9 @@ impl Drop for SdkMeterProviderInner { impl MeterProvider for SdkMeterProvider { fn versioned_meter( &self, - name: String, - version: Option, - schema_url: Option, + name: &'static str, + version: Option<&'static str>, + schema_url: Option<&'static str>, attributes: Option>, ) -> Meter { if self.inner.is_shutdown.load(Ordering::Relaxed) { @@ -442,48 +442,24 @@ mod tests { #[test] fn same_meter_reused_same_scope() { let provider = super::SdkMeterProvider::builder().build(); - let _meter1 = provider.meter("test".to_string()); - let _meter2 = provider.meter("test".to_string()); + let _meter1 = provider.meter("test"); + let _meter2 = provider.meter("test"); assert_eq!(provider.inner.meters.lock().unwrap().len(), 1); - let _meter3 = provider.versioned_meter( - "test".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); - let _meter4 = provider.versioned_meter( - "test".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); - let _meter5 = provider.versioned_meter( - "test".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); + let _meter3 = + provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); + let _meter4 = + provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); + let _meter5 = + provider.versioned_meter("test", Some("1.0.0"), Some("http://example.com"), None); assert_eq!(provider.inner.meters.lock().unwrap().len(), 2); // the below are different meters, as meter names are case sensitive - let _meter6 = provider.versioned_meter( - "ABC".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); - let _meter7 = provider.versioned_meter( - "Abc".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); - let _meter8 = provider.versioned_meter( - "abc".to_string(), - Some("1.0.0".to_string()), - Some("http://example.com".to_string()), - None, - ); + let _meter6 = + provider.versioned_meter("ABC", Some("1.0.0"), Some("http://example.com"), None); + let _meter7 = + provider.versioned_meter("Abc", Some("1.0.0"), Some("http://example.com"), None); + let _meter8 = + provider.versioned_meter("abc", Some("1.0.0"), Some("http://example.com"), None); assert_eq!(provider.inner.meters.lock().unwrap().len(), 5); } } diff --git a/opentelemetry-sdk/src/metrics/mod.rs b/opentelemetry-sdk/src/metrics/mod.rs index 3abe40cf7b..cf6e3fb928 100644 --- a/opentelemetry-sdk/src/metrics/mod.rs +++ b/opentelemetry-sdk/src/metrics/mod.rs @@ -432,7 +432,7 @@ mod tests { let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); // Act - let meter = meter_provider.meter("test".to_string()); + let meter = meter_provider.meter("test"); let counter = meter .u64_counter("my_counter") .with_unit("my_unit") @@ -483,8 +483,8 @@ mod tests { let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); // Act - let meter1 = meter_provider.meter("test.meter1".to_string()); - let meter2 = meter_provider.meter("test.meter2".to_string()); + let meter1 = meter_provider.meter("test.meter1"); + let meter2 = meter_provider.meter("test.meter2"); let counter1 = meter1 .u64_counter("my_counter") .with_unit("my_unit") @@ -575,15 +575,15 @@ mod tests { // Meters are identical except for scope attributes, but scope attributes are not an identifying property. // Hence there should be a single metric stream output for this test. let meter1 = meter_provider.versioned_meter( - "test.meter".to_string(), - Some("v0.1.0".to_string()), - Some("schema_url".to_string()), + "test.meter", + Some("v0.1.0"), + Some("schema_url"), Some(vec![KeyValue::new("key", "value1")]), ); let meter2 = meter_provider.versioned_meter( - "test.meter".to_string(), - Some("v0.1.0".to_string()), - Some("schema_url".to_string()), + "test.meter", + Some("v0.1.0"), + Some("schema_url"), Some(vec![KeyValue::new("key", "value2")]), ); let counter1 = meter1 @@ -669,7 +669,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test".to_string()); + let meter = meter_provider.meter("test"); let histogram = meter .f64_histogram("test_histogram") .with_unit("test_unit") @@ -714,7 +714,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test".to_string()); + let meter = meter_provider.meter("test"); let _observable_counter = meter .u64_observable_counter("my_observable_counter") .with_callback(|observer| { @@ -789,7 +789,7 @@ mod tests { .build(); // Act - let meter = meter_provider.meter("test".to_string()); + let meter = meter_provider.meter("test"); let counter = meter.u64_counter("my_counter").init(); // Normally, this would generate 3 time-series, but since the view @@ -2276,7 +2276,7 @@ mod tests { counter_name: &'static str, unit: Option<&'static str>, ) -> Counter { - let meter = self.meter_provider.meter(meter_name.to_string()); + let meter = self.meter_provider.meter(meter_name); let mut counter_builder = meter.u64_counter(counter_name); if let Some(unit_name) = unit { counter_builder = counter_builder.with_unit(unit_name); @@ -2290,7 +2290,7 @@ mod tests { counter_name: &'static str, unit: Option<&'static str>, ) -> UpDownCounter { - let meter = self.meter_provider.meter(meter_name.to_string()); + let meter = self.meter_provider.meter(meter_name); let mut updown_counter_builder = meter.i64_up_down_counter(counter_name); if let Some(unit_name) = unit { updown_counter_builder = updown_counter_builder.with_unit(unit_name); @@ -2299,7 +2299,7 @@ mod tests { } fn meter(&self) -> Meter { - self.meter_provider.meter("test".to_string()) + self.meter_provider.meter("test") } fn flush_metrics(&self) { diff --git a/opentelemetry-sdk/src/metrics/periodic_reader.rs b/opentelemetry-sdk/src/metrics/periodic_reader.rs index 9f01bc0601..7821786675 100644 --- a/opentelemetry-sdk/src/metrics/periodic_reader.rs +++ b/opentelemetry-sdk/src/metrics/periodic_reader.rs @@ -393,7 +393,7 @@ mod tests { // Act let meter_provider = SdkMeterProvider::builder().with_reader(reader).build(); - let meter = meter_provider.meter("test".to_string()); + let meter = meter_provider.meter("test"); let _counter = meter .u64_observable_counter("testcounter") .with_callback(move |_| { diff --git a/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs b/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs index 7d24ee82bd..89eec6e6b7 100644 --- a/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs +++ b/opentelemetry-sdk/src/testing/metrics/in_memory_exporter.rs @@ -41,7 +41,7 @@ use std::sync::{Arc, Mutex}; /// .build(); /// /// // Create and record metrics using the MeterProvider -/// let meter = meter_provider.meter("example".to_string()); +/// let meter = meter_provider.meter("example"); /// let counter = meter.u64_counter("my_counter").init(); /// counter.add(1, &[KeyValue::new("key", "value")]); /// diff --git a/opentelemetry/src/global/metrics.rs b/opentelemetry/src/global/metrics.rs index 3e9f3fffbf..630e9e2ba7 100644 --- a/opentelemetry/src/global/metrics.rs +++ b/opentelemetry/src/global/metrics.rs @@ -1,10 +1,7 @@ use crate::metrics::{self, Meter, MeterProvider}; use crate::KeyValue; use once_cell::sync::Lazy; -use std::{ - borrow::Cow, - sync::{Arc, RwLock}, -}; +use std::sync::{Arc, RwLock}; type GlobalMeterProvider = Arc; @@ -37,8 +34,8 @@ pub fn meter_provider() -> GlobalMeterProvider { /// If the name is an empty string, the provider will use a default name. /// /// This is a more convenient way of expressing `global::meter_provider().meter(name)`. -pub fn meter(name: impl Into>) -> Meter { - meter_provider().meter(name.into().into_owned()) +pub fn meter(name: &'static str) -> Meter { + meter_provider().meter(name) } /// Creates a [`Meter`] with the name, version and schema url. @@ -63,15 +60,10 @@ pub fn meter(name: impl Into>) -> Meter { /// ); /// ``` pub fn meter_with_version( - name: impl Into>, - version: Option>>, - schema_url: Option>>, + name: &'static str, + version: Option<&'static str>, + schema_url: Option<&'static str>, attributes: Option>, ) -> Meter { - meter_provider().versioned_meter( - name.into().into_owned(), - version.map(|v| v.into().into_owned()), - schema_url.map(|s| s.into().into_owned()), - attributes, - ) + meter_provider().versioned_meter(name, version, schema_url, attributes) } diff --git a/opentelemetry/src/metrics/meter.rs b/opentelemetry/src/metrics/meter.rs index da242d5d60..b70291b916 100644 --- a/opentelemetry/src/metrics/meter.rs +++ b/opentelemetry/src/metrics/meter.rs @@ -29,17 +29,17 @@ pub trait MeterProvider { /// let provider = global::meter_provider(); /// /// // meter used in applications - /// let meter = provider.meter("my_app".to_string()); + /// let meter = provider.meter("my_app"); /// /// // meter used in libraries/crates that optionally includes version and schema url /// let meter = provider.versioned_meter( - /// "my_library".to_string(), - /// Some(env!("CARGO_PKG_VERSION").to_string()), - /// Some("https://opentelemetry.io/schema/1.0.0".to_string()), + /// "my_library", + /// Some(env!("CARGO_PKG_VERSION")), + /// Some("https://opentelemetry.io/schema/1.0.0"), /// Some(vec![KeyValue::new("key", "value")]), /// ); /// ``` - fn meter(&self, name: String) -> Meter { + fn meter(&self, name: &'static str) -> Meter { self.versioned_meter(name, None, None, None) } @@ -51,9 +51,9 @@ pub trait MeterProvider { /// default name will be used instead. fn versioned_meter( &self, - name: String, - version: Option, - schema_url: Option, + name: &'static str, + version: Option<&'static str>, + schema_url: Option<&'static str>, attributes: Option>, ) -> Meter; } diff --git a/opentelemetry/src/metrics/noop.rs b/opentelemetry/src/metrics/noop.rs index 4d0af61661..9db39890aa 100644 --- a/opentelemetry/src/metrics/noop.rs +++ b/opentelemetry/src/metrics/noop.rs @@ -28,9 +28,9 @@ impl NoopMeterProvider { impl MeterProvider for NoopMeterProvider { fn versioned_meter( &self, - _name: String, - _version: Option, - _schema_url: Option, + _name: &'static str, + _version: Option<&'static str>, + _schema_url: Option<&'static str>, _attributes: Option>, ) -> Meter { Meter::new(Arc::new(NoopMeterCore::new())) diff --git a/stress/src/metrics_counter.rs b/stress/src/metrics_counter.rs index 63e58fb89a..452907f2bf 100644 --- a/stress/src/metrics_counter.rs +++ b/stress/src/metrics_counter.rs @@ -31,10 +31,7 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref COUNTER: Counter = PROVIDER - .meter("test".to_string()) - .u64_counter("hello") - .init(); + static ref COUNTER: Counter = PROVIDER.meter("test").u64_counter("hello").init(); } thread_local! { diff --git a/stress/src/metrics_gauge.rs b/stress/src/metrics_gauge.rs index aef440a6df..9f01dabb16 100644 --- a/stress/src/metrics_gauge.rs +++ b/stress/src/metrics_gauge.rs @@ -28,10 +28,7 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref GAUGE: Gauge = PROVIDER - .meter("test".to_string()) - .u64_gauge("test_gauge") - .init(); + static ref GAUGE: Gauge = PROVIDER.meter("test").u64_gauge("test_gauge").init(); } thread_local! { diff --git a/stress/src/metrics_histogram.rs b/stress/src/metrics_histogram.rs index f2e403021a..e0f469fc33 100644 --- a/stress/src/metrics_histogram.rs +++ b/stress/src/metrics_histogram.rs @@ -31,10 +31,7 @@ lazy_static! { "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10" ]; - static ref HISTOGRAM: Histogram = PROVIDER - .meter("test".to_string()) - .u64_histogram("hello") - .init(); + static ref HISTOGRAM: Histogram = PROVIDER.meter("test").u64_histogram("hello").init(); } thread_local! { diff --git a/stress/src/metrics_overflow.rs b/stress/src/metrics_overflow.rs index 1f90dabab3..d2e552ed67 100644 --- a/stress/src/metrics_overflow.rs +++ b/stress/src/metrics_overflow.rs @@ -24,10 +24,7 @@ lazy_static! { static ref PROVIDER: SdkMeterProvider = SdkMeterProvider::builder() .with_reader(ManualReader::builder().build()) .build(); - static ref COUNTER: Counter = PROVIDER - .meter("test".to_string()) - .u64_counter("hello") - .init(); + static ref COUNTER: Counter = PROVIDER.meter("test").u64_counter("hello").init(); } thread_local! {