use metrique::emf::Emf;
use metrique::unit::Millisecond;
use metrique::unit_of_work::metrics;
use metrique::writer::{FormatExt, sink::FlushImmediatelyBuilder};
use metrique_aggregation::aggregate;
use metrique_aggregation::aggregator::Aggregate;
use metrique_aggregation::histogram::Histogram;
use metrique_aggregation::value::Sum;
use std::time::Duration;
#[aggregate]
#[metrics]
struct ShardResult {
#[aggregate(strategy = Sum)]
rows_scanned: usize,
#[aggregate(strategy = Histogram<Duration>)]
#[metrics(unit = Millisecond)]
per_row_latency: Histogram<Duration>,
}
#[metrics(rename_all = "PascalCase")]
struct QueryMetrics {
query_id: &'static str,
#[metrics(flatten)]
shard_results: Aggregate<ShardResult>,
}
fn main() {
let emf_sink = Emf::builder("HistogramAggregation".to_string(), vec![vec![]])
.build()
.output_to_makewriter(|| std::io::stdout().lock());
let sink = FlushImmediatelyBuilder::new().build_boxed(emf_sink);
let mut query = QueryMetrics {
query_id: "q-12345",
shard_results: Aggregate::default(),
};
for shard_idx in 0..3 {
let mut shard = ShardResult {
rows_scanned: 100,
per_row_latency: Histogram::default(),
};
for row in 0..10 {
let latency = Duration::from_micros(200 + (shard_idx * 50) + (row * 10));
shard.per_row_latency.add_value(latency);
}
query.shard_results.insert(shard);
}
drop(query.append_on_drop(sink));
}