#![allow(clippy::indexing_slicing, reason = "panic is fine in tests")]
use std::thread;
use nm::{Event, Magnitude, Report};
const TEST_BUCKETS: &[Magnitude] = &[10, 50, 100, 500];
thread_local! {
static COUNTER_EVENT: Event = Event::builder()
.name("integration_test_counter")
.build();
static HISTOGRAM_EVENT: Event = Event::builder()
.name("integration_test_histogram")
.histogram(TEST_BUCKETS)
.build();
}
#[test]
fn report_collect_aggregates_data_from_multiple_threads() {
COUNTER_EVENT.with(|e| {
e.observe_once();
e.observe_once();
e.observe_once();
});
HISTOGRAM_EVENT.with(|e| {
e.observe(5); e.observe(75); e.observe(1000); });
thread::scope(|s| {
s.spawn(|| {
COUNTER_EVENT.with(|e| {
e.observe_once();
e.observe_once();
});
HISTOGRAM_EVENT.with(|e| {
e.observe(25); e.observe(200); });
});
s.spawn(|| {
COUNTER_EVENT.with(|e| {
e.batch(5).observe_once();
});
HISTOGRAM_EVENT.with(|e| {
e.observe(1); e.observe(2000); });
});
});
let report = Report::collect();
let counter_metrics = report
.events()
.find(|e| e.name() == "integration_test_counter")
.unwrap();
assert_eq!(counter_metrics.count(), 10);
assert_eq!(counter_metrics.sum(), 10);
assert_eq!(counter_metrics.mean(), 1);
assert!(counter_metrics.histogram().is_none());
let histogram_metrics = report
.events()
.find(|e| e.name() == "integration_test_histogram")
.unwrap();
assert_eq!(histogram_metrics.count(), 7);
assert_eq!(histogram_metrics.sum(), 3306);
assert_eq!(histogram_metrics.mean(), 472);
let histogram = histogram_metrics.histogram().unwrap();
let buckets: Vec<_> = histogram.buckets().collect();
assert_eq!(buckets.len(), 5);
assert_eq!(buckets[0], (10, 2));
assert_eq!(buckets[1], (50, 1));
assert_eq!(buckets[2], (100, 1));
assert_eq!(buckets[3], (500, 1));
assert_eq!(buckets[4], (Magnitude::MAX, 2));
let display_output = format!("{report}");
assert!(display_output.contains("integration_test_counter"));
assert!(display_output.contains("integration_test_histogram"));
assert!(display_output.contains("10")); assert!(display_output.contains("3306")); assert!(display_output.contains("472")); }