diff --git a/rust_snuba/Cargo.lock b/rust_snuba/Cargo.lock index b0f58aaeb6..1af216f4a0 100644 --- a/rust_snuba/Cargo.lock +++ b/rust_snuba/Cargo.lock @@ -302,6 +302,15 @@ dependencies = [ "uuid 1.3.1", ] +[[package]] +name = "dogstatsd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4609d1443932a4fcee5d2df820ef0597d039fa4154a5c60f798650a5b4f48e14" +dependencies = [ + "chrono", +] + [[package]] name = "encoding_rs" version = "0.8.32" @@ -1356,8 +1365,10 @@ version = "0.1.0" dependencies = [ "anyhow", "ctrlc", + "dogstatsd", "env_logger 0.10.0", "glob", + "lazy_static", "log", "pyo3", "rust_arroyo", diff --git a/rust_snuba/Cargo.toml b/rust_snuba/Cargo.toml index 54d588339d..781d8c54eb 100644 --- a/rust_snuba/Cargo.toml +++ b/rust_snuba/Cargo.toml @@ -28,8 +28,7 @@ pyo3 = { version = "0.18.1", features = ["chrono", "extension-module"] } ctrlc = "3.2.5" sentry = "0.31.0" -# these are unofficial libs. haven't validated them yet +# unofficial lib. haven't validated it yet dogstatsd = "0.8.0" -cadence = "0.29.0" lazy_static = "1.4.0" diff --git a/rust_snuba/rust_arroyo/src/utils/metrics.rs b/rust_snuba/rust_arroyo/src/utils/metrics.rs index 69076e9395..c85628fff4 100644 --- a/rust_snuba/rust_arroyo/src/utils/metrics.rs +++ b/rust_snuba/rust_arroyo/src/utils/metrics.rs @@ -210,16 +210,11 @@ mod tests { fn test_metrics() { init("my_host", "0.0.0.0:8125"); - assert!(!METRICS_CLIENT - .read() - .clone() - .unwrap() - .should_sample(Some(0.0)),); assert!(METRICS_CLIENT .read() .clone() - .unwrap() - .should_sample(Some(1.0)),); + .is_some() + ); increment( "a", diff --git a/rust_snuba/src/lib.rs b/rust_snuba/src/lib.rs index 0a558ff294..390078057e 100644 --- a/rust_snuba/src/lib.rs +++ b/rust_snuba/src/lib.rs @@ -2,7 +2,7 @@ mod config; mod consumer; mod strategies; mod types; -mod utils; +pub mod utils; use pyo3::prelude::*; diff --git a/rust_snuba/src/utils/metrics/backends/abstract_backend.rs b/rust_snuba/src/utils/metrics/backends/abstract_backend.rs index a731eeeda7..83820f31ad 100644 --- a/rust_snuba/src/utils/metrics/backends/abstract_backend.rs +++ b/rust_snuba/src/utils/metrics/backends/abstract_backend.rs @@ -1,9 +1,6 @@ use rust_arroyo::utils::metrics::MetricsClientTrait; pub trait MetricsBackend: MetricsClientTrait { - // fn increment(&self, name: &str, value: i64, tags: &[&str]); - // fn gauge(&self, name: &str, value: f64, tags: &[&str]); - // fn timing(&self, name: &str, value: i64, tags: &[&str]); fn events( &self, title: &str, @@ -12,6 +9,4 @@ pub trait MetricsBackend: MetricsClientTrait { priority: &str, tags: &[&str], ); - // fn counter(&self, name: &str, value: f64, tags: &[&str]) -> Result<(), Error>; - // fn histogram(&self, name: &str, value: f64, tags: &[&str]) -> Result<(), Error>; } diff --git a/rust_snuba/src/utils/metrics/backends/datadog.rs b/rust_snuba/src/utils/metrics/backends/datadog.rs index 8a9b701321..3a5c2fbe6c 100644 --- a/rust_snuba/src/utils/metrics/backends/datadog.rs +++ b/rust_snuba/src/utils/metrics/backends/datadog.rs @@ -1,10 +1,10 @@ -use rust_arroyo::utils::metrics::{gauge, increment, init, time, MetricsClientTrait}; +use rust_arroyo::utils::metrics::{MetricsClientTrait}; use dogstatsd; use super::abstract_backend::MetricsBackend; pub struct DatadogMetricsBackend { client_sd: dogstatsd::Client, - tags: Vec, + _tags: Vec, } impl MetricsBackend for DatadogMetricsBackend { @@ -12,12 +12,12 @@ impl MetricsBackend for DatadogMetricsBackend { &self, title: &str, text: &str, - alert_type: &str, - priority: &str, + _alert_type: &str, + _priority: &str, tags: &[&str], ) { // TODO figure out how to send priority and alert_type - self.client_sd.event(title, text, tags ); + self.client_sd.event(title, text, tags ).unwrap() } } @@ -25,14 +25,14 @@ impl MetricsBackend for DatadogMetricsBackend { impl DatadogMetricsBackend { pub fn new(host: String, port: u16 , tags:Vec) -> Self { - let host_port: String = format!("{}:{}", host, port); - let built_options = dogstatsd::OptionsBuilder::new() + let host_port: String = format!("{host}:{port}"); + let options = dogstatsd::OptionsBuilder::new() .to_addr(host_port).build(); - let client = dogstatsd::Client::new(dogstatsd::Options::default()).unwrap(); + let client = dogstatsd::Client::new(options).unwrap(); DatadogMetricsBackend { client_sd: client, - tags + _tags: tags } } } @@ -43,9 +43,9 @@ impl MetricsClientTrait for DatadogMetricsBackend { key: &str, value: Option, tags: Option>, - sample_rate: Option, + _sample_rate: Option, ) { - let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{}:{}", k, v)).collect(); + let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{k}:{v}")).collect(); match value { Some(v) => { @@ -70,11 +70,10 @@ impl MetricsClientTrait for DatadogMetricsBackend { key: &str, value: u64, tags: Option>, - sample_rate: Option, + _sample_rate: Option, ) { - let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{}:{}", k, v)).collect(); - let res = self.client_sd.gauge(key, value.to_string(), tags_str).unwrap(); - println!("ok = {:?}", res) + let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{k}:{v}")).collect(); + self.client_sd.gauge(key, value.to_string(), tags_str).unwrap(); } fn time( @@ -82,9 +81,9 @@ impl MetricsClientTrait for DatadogMetricsBackend { key: &str, value: u64, tags: Option>, - sample_rate: Option, + _sample_rate: Option, ) { - let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{}:{}", k, v)).collect(); + let tags_str: Vec = tags.unwrap().iter().map(|(k, v)| format!("{k}:{v}")).collect(); self.client_sd.timing(key, value.try_into().unwrap(), tags_str).unwrap(); } } @@ -93,7 +92,6 @@ impl MetricsClientTrait for DatadogMetricsBackend { mod tests { use std::collections::HashMap; - use dogstatsd::Options; use rust_arroyo::utils::metrics::{configure_metrics, MetricsClientTrait, self}; use crate::utils::metrics::backends::{datadog::DatadogMetricsBackend}; @@ -101,14 +99,12 @@ mod tests { #[test] fn test_testing_backend() { - - let custom_options = Options::new("0.0.0.0:9000", "0.0.0.0:8125", "analytics", vec!(String::new())); - // let client = dogstatsd::Client::new(dogstatsd::Options::default()).unwrap(); - let client = dogstatsd::Client::new(custom_options).unwrap(); + // default client sends metrics to statsd daemon on localhost:8125 + let client = dogstatsd::Client::new(dogstatsd::Options::default()).unwrap(); let client_tags: Vec = Vec::new(); let testing_backend = DatadogMetricsBackend { client_sd: client, - tags: client_tag + _tags: client_tags }; let mut tags: HashMap<&str, &str> = HashMap::new(); @@ -122,5 +118,9 @@ mod tests { // check configure_metrics writes to METRICS configure_metrics(testing_backend); metrics::time("c", 30, Some(HashMap::from([("tag3", "value3")])), None); + + // test constructor + DatadogMetricsBackend::new("0.0.0.0".to_owned(), 8125, Vec::new()) + .counter("test_counter2", Some(2), Some(tags.clone()), None); } } diff --git a/rust_snuba/src/utils/metrics/backends/testing.rs b/rust_snuba/src/utils/metrics/backends/testing.rs index c24ef60d8d..a28b609784 100644 --- a/rust_snuba/src/utils/metrics/backends/testing.rs +++ b/rust_snuba/src/utils/metrics/backends/testing.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, sync::{Arc, Mutex}}; +use std::{collections::HashMap, sync::{Mutex}}; use rust_arroyo::utils::metrics::MetricsClientTrait; @@ -6,80 +6,79 @@ use super::abstract_backend::MetricsBackend; use lazy_static::lazy_static; lazy_static! { - // static ref METRICS_CLIENT: RwLock>> = RwLock::new(None); static ref METRICS: Mutex>> = { - let mut m = HashMap::new(); + let m = HashMap::new(); Mutex::new(m) }; } -// static METRICS: Arc>> = Arc::new(HashMap::new()); pub struct MetricCall { - value: String, - tags: Vec, + _value: String, + _tags: Vec, } + pub struct TestingMetricsBackend { } impl MetricsBackend for TestingMetricsBackend { fn events( &self, - title: &str, - text: &str, - alert_type: &str, - priority: &str, - tags: &[&str], + _title: &str, + _text: &str, + _alert_type: &str, + _priority: &str, + _tags: &[&str], ) { todo!() } } impl MetricsClientTrait for TestingMetricsBackend{ - fn counter(&self, name: &str, value: Option, tags: Option>, sample_rate: Option) { + fn counter(&self, name: &str, value: Option, tags: Option>, _sample_rate: Option) { let mut tags_vec = Vec::new(); if let Some(tags) = tags { for (k, v) in tags { - tags_vec.push(format!("{}:{}", k, v)); + tags_vec.push(format!("{k}:{v}")); } } let mut metrics_map = METRICS.lock().unwrap(); let metric = metrics_map.entry(name.to_string()).or_insert(Vec::new()); metric.push(MetricCall { - value: value.unwrap().to_string(), - tags: tags_vec, + _value: value.unwrap().to_string(), + _tags: tags_vec, }); } - fn gauge(&self, name: &str, value: u64, tags: Option>, sample_rate: Option) { + fn gauge(&self, name: &str, value: u64, tags: Option>, _sample_rate: Option) { let mut tags_vec = Vec::new(); if let Some(tags) = tags { for (k, v) in tags { - tags_vec.push(format!("{}:{}", k, v)); + tags_vec.push(format!("{k}:{v}")); } } let mut metrics_map = METRICS.lock().unwrap(); let metric = metrics_map.entry(name.to_string()).or_insert(Vec::new()); metric.push(MetricCall { - value: value.to_string(), - tags: tags_vec, + _value: value.to_string(), + _tags: tags_vec, }); } - fn time(&self, name: &str, value: u64, tags: Option>, sample_rate: Option) { + fn time(&self, name: &str, value: u64, tags: Option>, _sample_rate: Option) { let mut tags_vec = Vec::new(); if let Some(tags) = tags { for (k, v) in tags { - tags_vec.push(format!("{}:{}", k, v)); + tags_vec.push(format!("{k}:{v}")); } } let mut metrics_map = METRICS.lock().unwrap(); let metric = metrics_map.entry(name.to_string()).or_insert(Vec::new()); metric.push(MetricCall { - value: value.to_string(), - tags: tags_vec, + _value: value.to_string(), + _tags: tags_vec, }); } diff --git a/rust_snuba/src/utils/metrics/mod.rs b/rust_snuba/src/utils/metrics/mod.rs index de9ee6ff27..257edb5a63 100644 --- a/rust_snuba/src/utils/metrics/mod.rs +++ b/rust_snuba/src/utils/metrics/mod.rs @@ -1,3 +1 @@ -pub mod metrics; pub mod backends; -pub mod metrics_wrapper;