8 个版本 (5 个重大更新)
新功能 0.6.1 | 2024 年 8 月 11 日 |
---|---|
0.6.0 | 2024 年 1 月 19 日 |
0.5.1 | 2023 年 6 月 1 日 |
0.5.0 | 2023 年 4 月 7 日 |
0.1.0 | 2023 年 3 月 1 日 |
#72 在 #instrument
每月 197 次下载
在 function-timer 中使用
17KB
182 行
函数计时器
宏,允许对函数进行计时并使用 metrics crate 输出直方图指标。
注意:在使用另一个属性宏时,声明顺序可能很重要。特别是使用 async-trait 时,取决于哪个先声明,如果时间宏先声明,则计时实际执行函数;如果后声明,则计时未来的创建。
示例
use std::error::Error;
use metrics_exporter_prometheus::PrometheusBuilder;
use function_timer::time;
struct Test {}
impl Test {
#[time("my_metric")]
pub fn impl_function(&self) {
println!("This another test");
}
#[time("another_metric")]
pub fn impl_fail_function(&self, text:&str) -> Result<(), Box<dyn Error>>{
let number:usize = text.parse()?;
println!("{number}");
Ok(())
}
#[time("my_metric")]
pub fn static_function() {
println!("This another test");
}
}
#[time("my_metric")]
pub fn free_function() {
println!("This a test");
}
fn main() -> Result<(), Box<dyn Error>> {
let builder = PrometheusBuilder::new();
let handle = builder.install_recorder()?;
free_function();
Test::static_function();
let t = Test {};
t.impl_function();
let result = t.impl_fail_function("azerty");
assert!(result.is_err());
let result = t.impl_fail_function("1");
assert!(result.is_ok());
println!("{}", handle.render());
Ok(())
}
输出结果
This a test
This another test
This another test
1
# TYPE another_metric summary
another_metric{function="impl_fail_function",quantile="0"} 0.000000677
another_metric{function="impl_fail_function",quantile="0.5"} 0.0000006770639874327633
another_metric{function="impl_fail_function",quantile="0.9"} 0.0000006770639874327633
another_metric{function="impl_fail_function",quantile="0.95"} 0.0000006770639874327633
another_metric{function="impl_fail_function",quantile="0.99"} 0.0000006770639874327633
another_metric{function="impl_fail_function",quantile="0.999"} 0.0000006770639874327633
another_metric{function="impl_fail_function",quantile="1"} 0.000012062
another_metric_sum{function="impl_fail_function"} 0.000012739000000000001
another_metric_count{function="impl_fail_function"} 2
# TYPE my_metric summary
my_metric{function="free_function",quantile="0"} 0.000005702
my_metric{function="free_function",quantile="0.5"} 0.000005701963063845405
my_metric{function="free_function",quantile="0.9"} 0.000005701963063845405
my_metric{function="free_function",quantile="0.95"} 0.000005701963063845405
my_metric{function="free_function",quantile="0.99"} 0.000005701963063845405
my_metric{function="free_function",quantile="0.999"} 0.000005701963063845405
my_metric{function="free_function",quantile="1"} 0.000005702
my_metric_sum{function="free_function"} 0.000005702
my_metric_count{function="free_function"} 1
my_metric{function="impl_function",quantile="0"} 0.000002602
my_metric{function="impl_function",quantile="0.5"} 0.0000026018182046361393
my_metric{function="impl_function",quantile="0.9"} 0.0000026018182046361393
my_metric{function="impl_function",quantile="0.95"} 0.0000026018182046361393
my_metric{function="impl_function",quantile="0.99"} 0.0000026018182046361393
my_metric{function="impl_function",quantile="0.999"} 0.0000026018182046361393
my_metric{function="impl_function",quantile="1"} 0.000002602
my_metric_sum{function="impl_function"} 0.000002602
my_metric_count{function="impl_function"} 1
my_metric{function="static_function",quantile="0"} 0.000002894
my_metric{function="static_function",quantile="0.5"} 0.0000028939157344447597
my_metric{function="static_function",quantile="0.9"} 0.0000028939157344447597
my_metric{function="static_function",quantile="0.95"} 0.0000028939157344447597
my_metric{function="static_function",quantile="0.99"} 0.0000028939157344447597
my_metric{function="static_function",quantile="0.999"} 0.0000028939157344447597
my_metric{function="static_function",quantile="1"} 0.000002894
my_metric_sum{function="static_function"} 0.000002894
my_metric_count{function="static_function"} 1
它也可以放在 impl
块中
use std::error::Error;
use metrics_exporter_prometheus::PrometheusBuilder;
use function_timer::time;
struct Test {}
#[time("my_metric")]
impl Test {
pub fn impl_function(&self) {
println!("This another test");
}
pub fn impl_fail_function(&self, text:&str) -> Result<(), Box<dyn Error>>{
let number:usize = text.parse()?;
println!("{number}");
Ok(())
}
pub fn static_function() {
println!("This another test");
}
}
fn main() -> Result<(), Box<dyn Error>> {
let builder = PrometheusBuilder::new();
let handle = builder.install_recorder()?;
Test::static_function();
let t = Test {};
t.impl_function();
let result = t.impl_fail_function("azerty");
assert!(result.is_err());
let result = t.impl_fail_function("1");
assert!(result.is_ok());
println!("{}", handle.render());
Ok(())
}
它将输出
This another test
This another test
1
# TYPE my_metric summary
my_metric{struct="Test",function="static_function",quantile="0"} 0.000005976
my_metric{struct="Test",function="static_function",quantile="0.5"} 0.000005976352983111928
my_metric{struct="Test",function="static_function",quantile="0.9"} 0.000005976352983111928
my_metric{struct="Test",function="static_function",quantile="0.95"} 0.000005976352983111928
my_metric{struct="Test",function="static_function",quantile="0.99"} 0.000005976352983111928
my_metric{struct="Test",function="static_function",quantile="0.999"} 0.000005976352983111928
my_metric{struct="Test",function="static_function",quantile="1"} 0.000005976
my_metric_sum{struct="Test",function="static_function"} 0.000005976
my_metric_count{struct="Test",function="static_function"} 1
my_metric{struct="Test",function="impl_fail_function",quantile="0"} 0.000000771
my_metric{struct="Test",function="impl_fail_function",quantile="0.5"} 0.0000007710596865495025
my_metric{struct="Test",function="impl_fail_function",quantile="0.9"} 0.0000007710596865495025
my_metric{struct="Test",function="impl_fail_function",quantile="0.95"} 0.0000007710596865495025
my_metric{struct="Test",function="impl_fail_function",quantile="0.99"} 0.0000007710596865495025
my_metric{struct="Test",function="impl_fail_function",quantile="0.999"} 0.0000007710596865495025
my_metric{struct="Test",function="impl_fail_function",quantile="1"} 0.00000257
my_metric_sum{struct="Test",function="impl_fail_function"} 0.000003341
my_metric_count{struct="Test",function="impl_fail_function"} 2
my_metric{struct="Test",function="impl_function",quantile="0"} 0.000003853
my_metric{struct="Test",function="impl_function",quantile="0.5"} 0.000003852839894857494
my_metric{struct="Test",function="impl_function",quantile="0.9"} 0.000003852839894857494
my_metric{struct="Test",function="impl_function",quantile="0.95"} 0.000003852839894857494
my_metric{struct="Test",function="impl_function",quantile="0.99"} 0.000003852839894857494
my_metric{struct="Test",function="impl_function",quantile="0.999"} 0.000003852839894857494
my_metric{struct="Test",function="impl_function",quantile="1"} 0.000003853
my_metric_sum{struct="Test",function="impl_function"} 0.000003853
my_metric_count{struct="Test",function="impl_function"} 1
依赖项
~230–660KB
~16K SLoC