我对现有的 prometheus library: prometheus 和 prometheus-client 的一些设计不太满意, 所以从今年年初开始抽空自己实现了一个 library,暴露的API设计接近 prometheus-client,现阶段在公司内部产品中也使用了一段时间,如果你有这方面需求的话,也许可以考虑尝试下,如果能有一些使用反馈提供给我的话就更好了。
use fastmetrics::{
encoder::{EncodeLabelSet, EncodeLabelValue},
format::text,
metrics::{counter::Counter, family::Family},
registry::{Register, Registry},
};
// Define label types
// Need to enable `derive` feature to use `#[derive(EncodeLabelSet)]`
#[derive(Clone, Eq, PartialEq, Hash, EncodeLabelSet)]
struct Labels {
method: Method,
status: u16,
}
// Need to enable `derive` feature to use `#[derive(EncodeLabelValue)]`
#[derive(Clone, Eq, PartialEq, Hash, EncodeLabelValue)]
enum Method {
Get,
Put,
}
// Need to enable `derive` feature to use `#[derive(Register)]`
#[derive(Default, Register)]
struct Metrics {
/// Total requests processed
requests: Counter,
/// Total HTTP requests
http_requests: Family<Labels, Counter>,
}
fn main() -> Box<dyn std::error::Error> {
// Create a registry with a namespace and some constant labels
let mut registry = Registry::builder()
.with_namespace("myapp")
.with_const_labels([("env", "prod")])
.build();
// Register metrics
let metrics = Metrics::default();
metrics.register(&mut registry)?;
// Update the simple counter
metrics.requests.inc();
assert_eq!(metrics.requests.total(), 1);
// Update the counter family
let labels = Labels { method: Method::Get, status: 200 };
metrics.http_requests.with_or_new(&labels, |req| req.inc());
assert_eq!(metrics.http_requests.with(&labels, |req| req.total()), Some(1));
// Export metrics in text format
let mut output = String::new();
text::encode(&mut output, ®istry)?;
println!("{}", output);
Ok(())
}
Ext Link: https://github.com/koushiro/fastmetrics
1
共 0 条评论, 1 页
评论区
写评论还没有评论