diff --git a/examples/io_write.rs b/examples/io_write.rs new file mode 100644 index 0000000..47d1056 --- /dev/null +++ b/examples/io_write.rs @@ -0,0 +1,39 @@ +//! Example showing how one could write to a file or socket instead of a string. +//! For large metrics registries this will be more memory efficient. + +use prometheus_client::{encoding::text::encode, metrics::counter::Counter, registry::Registry}; +use std::io::Write; + +fn main() { + let mut registry = ::with_prefix("stream"); + let request_counter: Counter = Default::default(); + + registry.register( + "requests", + "How many requests the application has received", + request_counter.clone(), + ); + + let mut buf = String::new(); + encode(&mut buf, ®istry).unwrap(); + + let mut file = Vec::new(); + let mut writer = IoWriterWrapper(&mut file); + encode(&mut writer, ®istry).unwrap(); + + assert!(buf.as_bytes() == file); +} + +pub struct IoWriterWrapper(W); + +impl std::fmt::Write for IoWriterWrapper +where + W: Write, +{ + fn write_str(&mut self, input: &str) -> std::fmt::Result { + self.0 + .write_all(input.as_bytes()) + .map(|_| ()) + .map_err(|_| std::fmt::Error) + } +}