Epimetheus
An easy-to-use prometheus-compatible metrics library.
Epimetheus is probably the easiest way to get your Rust application serving metrics. Just set the metrics, and everything else happens automatically.
Watch your hashmaps grow!
metric!.set;
metric!.set;
Monitor the latency of your functions!
let start = now;
my_function;
metric!.add;
metric!.add;
Track the status codes of your responses!
let resp = compute_response;
metric!.add;
Ok
Now, run your app with RUST_METRICS_PORT set:
$ RUST_METRICS_PORT=9898 cargo run
...and connect to see what's happening:
$ curl localhost:9898
my_data_cap 1024
my_data_len 764
my_function_duration_count 6032
my_function_duration_sum 8.32
responses{code="200 OK"} 5443
responses{code="404 Not Found"} 587
responses{code="500 Internal Server Error"} 2
Your program can also call epimetheus::query() to inspect its own metrics.
Features
- Multi-threaded OK! Everyone shares the same set of metrics.
- The format is prometheus-compatible. Point prometheus' watchful eye at your program and get nice graphs.
- Updating metrics is fast (...mostly. See below.)
- The port number can be customised via the
RUST_METRICS_PORTenvironment variable. - The code is very readable - under 200 sloc. Take a look!
- Public domain.
Performance
- Updating an unlabelled metric (like
my_data_lenabove) is fast (~500ns uncontended, ~5us contended). - Updating a labelled metric (like
responsesabove) is slower (~1us uncontended, ~10us contended). - The HTTP server is extremely dumb and can only handle one client at a time; typically this doesn't matter.
Other stuff
Epimetheus is the brother of Prometheus, hence the crate's name.