Cleanup metrics (#4230)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
//! The `metrics` module enables sending measurements to an InfluxDB instance
|
||||
//! The `metrics` module enables sending measurements to an `InfluxDB` instance
|
||||
|
||||
use influx_db_client as influxdb;
|
||||
use lazy_static::lazy_static;
|
||||
@@ -12,6 +12,51 @@ use std::thread;
|
||||
use std::time::{Duration, Instant};
|
||||
use sys_info::hostname;
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! datapoint {
|
||||
(@field $point:ident $name:expr, $string:expr, String) => {
|
||||
$point.add_field(
|
||||
$name,
|
||||
$crate::influxdb::Value::String($string));
|
||||
};
|
||||
(@field $point:ident $name:expr, $value:expr, i64) => {
|
||||
$point.add_field(
|
||||
$name,
|
||||
$crate::influxdb::Value::Integer($value as i64));
|
||||
};
|
||||
(@field $point:ident $name:expr, $value:expr, f64) => {
|
||||
$point.add_field(
|
||||
$name,
|
||||
$crate::influxdb::Value::Float($value as f64));
|
||||
};
|
||||
(@field $point:ident $name:expr, $value:expr, bool) => {
|
||||
$point.add_field(
|
||||
$name,
|
||||
$crate::influxdb::Value::Boolean($value as bool));
|
||||
};
|
||||
|
||||
(@fields $point:ident) => {};
|
||||
(@fields $point:ident ($name:expr, $value:expr, $type:ident) , $($rest:tt)*) => {
|
||||
$crate::datapoint!(@field $point $name, $value, $type);
|
||||
$crate::datapoint!(@fields $point $($rest)*);
|
||||
};
|
||||
(@fields $point:ident ($name:expr, $value:expr, $type:ident)) => {
|
||||
$crate::datapoint!(@field $point $name, $value, $type);
|
||||
};
|
||||
|
||||
(@point $name:expr, $($fields:tt)+) => {
|
||||
{
|
||||
let mut point = $crate::influxdb::Point::new(&$name);
|
||||
$crate::datapoint!(@fields point $($fields)+);
|
||||
point
|
||||
}
|
||||
};
|
||||
|
||||
($name:expr, $($fields:tt)+) => {
|
||||
$crate::submit($crate::datapoint!(@point $name, $($fields)+));
|
||||
};
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref HOST_INFO: String = {
|
||||
let v = env::var("SOLANA_METRICS_DISPLAY_HOSTNAME")
|
||||
@@ -48,7 +93,7 @@ struct InfluxDbMetricsWriter {
|
||||
|
||||
impl InfluxDbMetricsWriter {
|
||||
fn new() -> Self {
|
||||
InfluxDbMetricsWriter {
|
||||
Self {
|
||||
client: Self::build_client().ok(),
|
||||
}
|
||||
}
|
||||
@@ -96,7 +141,7 @@ impl MetricsAgent {
|
||||
fn new(writer: Arc<MetricsWriter + Send + Sync>, write_frequency: Duration) -> Self {
|
||||
let (sender, receiver) = channel::<MetricsCommand>();
|
||||
thread::spawn(move || Self::run(&receiver, &writer, write_frequency));
|
||||
MetricsAgent { sender }
|
||||
Self { sender }
|
||||
}
|
||||
|
||||
fn run(
|
||||
@@ -379,4 +424,67 @@ mod test {
|
||||
agent.submit(point);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_datapoint() {
|
||||
macro_rules! matches {
|
||||
($e:expr, $p:pat) => {
|
||||
match $e {
|
||||
$p => true,
|
||||
_ => false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
datapoint!("name", ("field name", "test".to_string(), String));
|
||||
datapoint!("name", ("field name", 12.34_f64, f64));
|
||||
datapoint!("name", ("field name", true, bool));
|
||||
datapoint!("name", ("field name", 1, i64));
|
||||
datapoint!("name", ("field name", 1, i64),);
|
||||
datapoint!("name", ("field1 name", 2, i64), ("field2 name", 2, i64));
|
||||
datapoint!("name", ("field1 name", 2, i64), ("field2 name", 2, i64),);
|
||||
datapoint!(
|
||||
"name",
|
||||
("field1 name", 2, i64),
|
||||
("field2 name", 2, i64),
|
||||
("field3 name", 3, i64)
|
||||
);
|
||||
datapoint!(
|
||||
"name",
|
||||
("field1 name", 2, i64),
|
||||
("field2 name", 2, i64),
|
||||
("field3 name", 3, i64),
|
||||
);
|
||||
|
||||
let point = datapoint!(@point "name", ("i64", 1, i64), ("String", "string".to_string(), String), ("f64", 12.34_f64, f64), ("bool", true, bool));
|
||||
assert_eq!(point.measurement, "name");
|
||||
assert!(matches!(
|
||||
point.fields.get("i64").unwrap(),
|
||||
influxdb::Value::Integer(1)
|
||||
));
|
||||
assert!(match point.fields.get("String").unwrap() {
|
||||
influxdb::Value::String(ref s) => {
|
||||
if s == "string" {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
_ => false,
|
||||
});
|
||||
assert!(match point.fields.get("f64").unwrap() {
|
||||
influxdb::Value::Float(f) => {
|
||||
if *f == 12.34_f64 {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
_ => false,
|
||||
});
|
||||
assert!(matches!(
|
||||
point.fields.get("bool").unwrap(),
|
||||
influxdb::Value::Boolean(true)
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user