Skip to content

Commit 4f7ae7a

Browse files
committed
Add test to confirm bug in metrics sdk
1 parent 58ec379 commit 4f7ae7a

File tree

1 file changed

+107
-0
lines changed
  • opentelemetry-sdk/src/metrics

1 file changed

+107
-0
lines changed

opentelemetry-sdk/src/metrics/mod.rs

+107
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,113 @@ mod tests {
590590
);
591591
}
592592

593+
// "multi_thread" tokio flavor must be used else flush won't
594+
// be able to make progress!
595+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
596+
#[ignore = "Bug bug."]
597+
async fn delta_memory_efficiency_test() {
598+
// Run this test with stdout enabled to see output.
599+
// cargo test delta_memory_efficiency_test --features=metrics,testing -- --nocapture
600+
601+
// Arrange
602+
let exporter = InMemoryMetricsExporterBuilder::new().with_temporality_selector(DeltaTemporalitySelector()).build();
603+
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
604+
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
605+
606+
// Act
607+
let meter = meter_provider.meter("test");
608+
let counter = meter
609+
.u64_counter("my_counter")
610+
.with_unit(Unit::new("my_unit"))
611+
.init();
612+
counter.add(1, &[KeyValue::new("key1", "value1")]);
613+
counter.add(1, &[KeyValue::new("key1", "value1")]);
614+
counter.add(1, &[KeyValue::new("key1", "value1")]);
615+
counter.add(1, &[KeyValue::new("key1", "value1")]);
616+
counter.add(1, &[KeyValue::new("key1", "value1")]);
617+
618+
counter.add(1, &[KeyValue::new("key1", "value2")]);
619+
counter.add(1, &[KeyValue::new("key1", "value2")]);
620+
counter.add(1, &[KeyValue::new("key1", "value2")]);
621+
622+
meter_provider.force_flush().unwrap();
623+
624+
// Assert
625+
let resource_metrics = exporter
626+
.get_finished_metrics()
627+
.expect("metrics are expected to be exported.");
628+
assert!(!resource_metrics.is_empty());
629+
let metric = &resource_metrics[0].scope_metrics[0].metrics[0];
630+
assert_eq!(metric.name, "my_counter");
631+
assert_eq!(metric.unit.as_str(), "my_unit");
632+
let sum = metric
633+
.data
634+
.as_any()
635+
.downcast_ref::<data::Sum<u64>>()
636+
.expect("Sum aggregation expected for Counter instruments by default");
637+
638+
// Expecting 2 time-series.
639+
assert_eq!(sum.data_points.len(), 2);
640+
assert!(sum.is_monotonic, "Counter should produce monotonic.");
641+
assert_eq!(
642+
sum.temporality,
643+
data::Temporality::Delta,
644+
"Should produce Delta as configured"
645+
);
646+
647+
// find and validate key1=value1 datapoint
648+
let mut data_point1 = None;
649+
for datapoint in &sum.data_points {
650+
if datapoint
651+
.attributes
652+
.iter()
653+
.any(|(k, v)| k.as_str() == "key1" && v.as_str() == "value1")
654+
{
655+
data_point1 = Some(datapoint);
656+
}
657+
}
658+
assert_eq!(
659+
data_point1
660+
.expect("datapoint with key1=value1 expected")
661+
.value,
662+
5
663+
);
664+
665+
// find and validate key1=value2 datapoint
666+
let mut data_point1 = None;
667+
for datapoint in &sum.data_points {
668+
if datapoint
669+
.attributes
670+
.iter()
671+
.any(|(k, v)| k.as_str() == "key1" && v.as_str() == "value2")
672+
{
673+
data_point1 = Some(datapoint);
674+
}
675+
}
676+
assert_eq!(
677+
data_point1
678+
.expect("datapoint with key1=value2 expected")
679+
.value,
680+
3
681+
);
682+
683+
// flush again, and validate that nothing is flushed
684+
// as delta temporality.
685+
meter_provider.force_flush().unwrap();
686+
let resource_metrics = exporter
687+
.get_finished_metrics()
688+
.expect("metrics are expected to be exported.");
689+
println!("resource_metrics: {:?}", resource_metrics);
690+
assert!(resource_metrics.is_empty(), "No metrics should be exported as no new measurements were recorded since last collect.");
691+
}
692+
693+
struct DeltaTemporalitySelector();
694+
impl TemporalitySelector for DeltaTemporalitySelector {
695+
fn temporality(&self, _kind: InstrumentKind) -> Temporality {
696+
Temporality::Delta
697+
}
698+
}
699+
593700
struct TestContext {
594701
exporter: InMemoryMetricsExporter,
595702
meter_provider: SdkMeterProvider,

0 commit comments

Comments
 (0)