use segment_buffer::{SegmentBuffer, SegmentConfig};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
struct Metric {
name: String,
value: f64,
}
enum Priority {
Critical,
Standard,
Ephemeral,
}
fn should_accept(priority: Priority, pressure: f32) -> bool {
match priority {
Priority::Critical => true,
Priority::Standard => pressure < 0.95,
Priority::Ephemeral => pressure < 0.90,
}
}
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
let tmp = tempfile::tempdir()?;
let config = SegmentConfig::builder()
.flush_manually()
.max_size_bytes(100_000) .compression_level(3)
.build();
let buffer = SegmentBuffer::<Metric>::open(tmp.path(), config)?;
let mut accepted = 0;
let mut rejected = 0;
for i in 0..10_000 {
let priority = if i % 10 == 0 {
Priority::Critical
} else if i % 3 == 0 {
Priority::Ephemeral
} else {
Priority::Standard
};
let pressure = buffer.store_pressure();
if should_accept(priority, pressure) {
buffer.append(Metric {
name: format!("metric_{i}"),
value: i as f64,
})?;
accepted += 1;
} else {
rejected += 1;
}
if i % 500 == 0 {
buffer.flush()?;
}
}
buffer.flush()?;
let final_pressure = buffer.store_pressure();
println!("Accepted: {accepted}");
println!("Rejected (backpressure): {rejected}");
println!("Final disk pressure: {:.1}%", final_pressure * 100.0);
println!("Overloaded: {}", buffer.is_overloaded());
Ok(())
}