Skip to content

Commit 347cc74

Browse files
committed
Remove as_any from ProvideMeter trait
And some small changes to support that. Mostly moving the Arc wrapping of the ProvideMeter object outside of the constructor so the user can clone the Arc before the TelemetryProvider takes ownership of it
1 parent a93bb34 commit 347cc74

File tree

6 files changed

+19
-59
lines changed

6 files changed

+19
-59
lines changed

rust-runtime/aws-smithy-observability-otel/src/lib.rs

+5-17
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ pub mod meter;
2525
#[cfg(test)]
2626
mod tests {
2727

28+
use std::sync::Arc;
29+
2830
use crate::meter::OtelMeterProvider;
2931
use aws_smithy_observability::{
3032
global::{get_telemetry_provider, set_telemetry_provider},
@@ -43,7 +45,8 @@ mod tests {
4345
let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();
4446

4547
// Create the SDK metrics types from the OTel objects
46-
let sdk_mp = OtelMeterProvider::new(otel_mp);
48+
let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));
49+
let sdk_ref = sdk_mp.clone();
4750
let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();
4851

4952
// Set the global TelemetryProvider and then get it back out
@@ -60,14 +63,7 @@ mod tests {
6063
.build();
6164
mono_counter.add(4, None, None);
6265

63-
// Flush metric pipeline and extract metrics from exporter
64-
global_tp
65-
.meter_provider()
66-
.as_any()
67-
.downcast_ref::<OtelMeterProvider>()
68-
.unwrap()
69-
.shutdown()
70-
.unwrap();
66+
sdk_ref.flush().unwrap();
7167
let finished_metrics = exporter.get_finished_metrics().unwrap();
7268

7369
let extracted_mono_counter_data = &finished_metrics[0].scope_metrics[0].metrics[0]
@@ -78,13 +74,5 @@ mod tests {
7874
.data_points[0]
7975
.value;
8076
assert_eq!(extracted_mono_counter_data, &4);
81-
82-
// Get the OTel TP out and shut it down
83-
let foo = global_tp
84-
.meter_provider()
85-
.as_any()
86-
.downcast_ref::<OtelMeterProvider>()
87-
.unwrap();
88-
foo.shutdown().unwrap();
8977
}
9078
}

rust-runtime/aws-smithy-observability-otel/src/meter.rs

+6-26
Original file line numberDiff line numberDiff line change
@@ -280,24 +280,12 @@ impl OtelMeterProvider {
280280
Err(err) => Err(ObservabilityError::new(ErrorKind::MetricsFlush, err)),
281281
}
282282
}
283-
284-
/// Gracefully shutdown the metric pipeline.
285-
pub fn shutdown(&self) -> Result<(), ObservabilityError> {
286-
match self.meter_provider.force_flush() {
287-
Ok(_) => Ok(()),
288-
Err(err) => Err(ObservabilityError::new(ErrorKind::MetricsShutdown, err)),
289-
}
290-
}
291283
}
292284

293285
impl ProvideMeter for OtelMeterProvider {
294286
fn get_meter(&self, scope: &'static str, _attributes: Option<&Attributes>) -> Meter {
295287
Meter::new(Arc::new(MeterWrap(self.meter_provider.meter(scope))))
296288
}
297-
298-
fn as_any(&self) -> &dyn std::any::Any {
299-
self
300-
}
301289
}
302290

303291
#[cfg(test)]
@@ -325,7 +313,8 @@ mod tests {
325313
let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();
326314

327315
// Create the SDK metrics types from the OTel objects
328-
let sdk_mp = OtelMeterProvider::new(otel_mp);
316+
let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));
317+
let sdk_ref = sdk_mp.clone();
329318
let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();
330319

331320
// Get the dyn versions of the SDK metrics objects
@@ -345,12 +334,7 @@ mod tests {
345334
histogram.record(1.234, None, None);
346335

347336
// Gracefully shutdown the metrics provider so all metrics are flushed through the pipeline
348-
dyn_sdk_mp
349-
.as_any()
350-
.downcast_ref::<OtelMeterProvider>()
351-
.unwrap()
352-
.shutdown()
353-
.unwrap();
337+
sdk_ref.flush().unwrap();
354338

355339
// Extract the metrics from the exporter and assert that they are what we expect
356340
let finished_metrics = exporter.get_finished_metrics().unwrap();
@@ -390,7 +374,8 @@ mod tests {
390374
let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();
391375

392376
// Create the SDK metrics types from the OTel objects
393-
let sdk_mp = OtelMeterProvider::new(otel_mp);
377+
let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));
378+
let sdk_ref = sdk_mp.clone();
394379
let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();
395380

396381
// Get the dyn versions of the SDK metrics objects
@@ -445,12 +430,7 @@ mod tests {
445430
async_mono_counter.record(4, None, None);
446431

447432
// Gracefully shutdown the metrics provider so all metrics are flushed through the pipeline
448-
dyn_sdk_mp
449-
.as_any()
450-
.downcast_ref::<OtelMeterProvider>()
451-
.unwrap()
452-
.shutdown()
453-
.unwrap();
433+
sdk_ref.flush().unwrap();
454434

455435
// Extract the metrics from the exporter
456436
let finished_metrics = exporter.get_finished_metrics().unwrap();

rust-runtime/aws-smithy-observability/src/instruments.rs

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ impl<'a, T, M> AsyncInstrumentBuilder<'a, T, M> {
144144

145145
/// Takes in the name of function from [ProvideInstrument] and the type of instrument being created
146146
/// (ex: [AsyncMeasure]) and adds a `build` function for it.
147+
//TODO(observability): Can I derive the measurement from the Value of the instrument type or vice versa?
147148
macro_rules! build_async_instrument {
148149
($name:ident, $instrument:ty, $measurement:ty) => {
149150
impl<'a> AsyncInstrumentBuilder<'a, $instrument, $measurement> {

rust-runtime/aws-smithy-observability/src/meter.rs

-5
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ use std::{borrow::Cow, fmt::Debug, sync::Arc};
1717
pub trait ProvideMeter: Send + Sync + Debug {
1818
/// Get or create a named [Meter].
1919
fn get_meter(&self, scope: &'static str, attributes: Option<&Attributes>) -> Meter;
20-
21-
/// Cast to [std::any::Any]
22-
fn as_any(&self) -> &dyn std::any::Any;
2320
}
2421

2522
/// The entry point to creating instruments. A grouping of related metrics.
@@ -86,8 +83,6 @@ impl Meter {
8683
pub fn create_histogram(
8784
&self,
8885
name: impl Into<Cow<'static, str>>,
89-
// units: Option<impl Into<Cow<'static, str>>>,
90-
// description: Option<impl Into<Cow<'static, str>>>,
9186
) -> InstrumentBuilder<'_, Arc<dyn Histogram>> {
9287
InstrumentBuilder::new(self, name.into())
9388
}

rust-runtime/aws-smithy-observability/src/noop.rs

-4
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ impl ProvideMeter for NoopMeterProvider {
2424
fn get_meter(&self, _scope: &'static str, _attributes: Option<&Attributes>) -> Meter {
2525
Meter::new(Arc::new(NoopMeter))
2626
}
27-
28-
fn as_any(&self) -> &dyn std::any::Any {
29-
self
30-
}
3127
}
3228

3329
#[derive(Debug)]

rust-runtime/aws-smithy-observability/src/provider.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ use crate::{meter::ProvideMeter, noop::NoopMeterProvider};
1212
/// A struct to hold the various types of telemetry providers.
1313
#[non_exhaustive]
1414
pub struct TelemetryProvider {
15-
meter_provider: Box<dyn ProvideMeter + Send + Sync>,
15+
meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
1616
}
1717

1818
impl TelemetryProvider {
1919
/// Returns a builder struct for [TelemetryProvider]
2020
pub fn builder() -> TelemetryProviderBuilder {
2121
TelemetryProviderBuilder {
22-
meter_provider: Box::new(NoopMeterProvider),
22+
meter_provider: Arc::new(NoopMeterProvider),
2323
}
2424
}
2525

2626
/// Returns a noop [TelemetryProvider]
2727
pub fn noop() -> TelemetryProvider {
2828
Self {
29-
meter_provider: Box::new(NoopMeterProvider),
29+
meter_provider: Arc::new(NoopMeterProvider),
3030
}
3131
}
3232

@@ -43,21 +43,21 @@ impl TelemetryProvider {
4343
impl Default for TelemetryProvider {
4444
fn default() -> Self {
4545
Self {
46-
meter_provider: Box::new(NoopMeterProvider),
46+
meter_provider: Arc::new(NoopMeterProvider),
4747
}
4848
}
4949
}
5050

5151
/// A builder for [TelemetryProvider].
5252
#[non_exhaustive]
5353
pub struct TelemetryProviderBuilder {
54-
meter_provider: Box<dyn ProvideMeter + Send + Sync>,
54+
meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
5555
}
5656

5757
impl TelemetryProviderBuilder {
5858
/// Set the [ProvideMeter].
59-
pub fn meter_provider(mut self, meter_provider: impl ProvideMeter + 'static) -> Self {
60-
self.meter_provider = Box::new(meter_provider);
59+
pub fn meter_provider(mut self, meter_provider: Arc<impl ProvideMeter + 'static>) -> Self {
60+
self.meter_provider = meter_provider;
6161
self
6262
}
6363

0 commit comments

Comments
 (0)