Skip to content

Commit

Permalink
filter metrics by metric name
Browse files Browse the repository at this point in the history
  • Loading branch information
Keksoj committed Aug 23, 2022
1 parent 7b213e5 commit b0844e3
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 57 deletions.
15 changes: 1 addition & 14 deletions bin/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ pub enum QueryCmd {
#[clap(
short = 'n',
long = "names",
help = "metric names",
help = "Filter by metric names. Coma-separated list.",
use_delimiter = true
)]
names: Vec<String>,
Expand All @@ -766,19 +766,6 @@ pub enum QueryCmd {
},
}

fn split_slash(input: &str) -> Result<(String, String), String> {
let mut it = input.split('/').map(|s| s.trim().to_string());

if let (Some(cluster), Some(backend)) = (it.next(), it.next()) {
Ok((cluster, backend))
} else {
Err(format!(
"could not split cluster id and backend id in '{}', they must have the form 'cluster_id/backend_id'",
input
))
}
}

#[derive(Subcommand, PartialEq, Clone, Debug)]
pub enum ConfigCmd {
#[clap(name = "check", about = "check configuration file syntax and exit")]
Expand Down
12 changes: 5 additions & 7 deletions bin/src/ctl/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -777,22 +777,20 @@ impl CommandManager {
json: bool,
list: bool,
refresh: Option<u32>,
names: Vec<String>,
metric_names: Vec<String>,
cluster_ids: Vec<String>,
backend_ids: Vec<String>,
backend_ids: Vec<String>,
) -> Result<(), anyhow::Error> {
let query = match (list, cluster_ids.is_empty(), backend_ids.is_empty()) {
(true, _, _) => QueryMetricsType::List,
(false, true, true) => QueryMetricsType::All,
(false, true, true) => QueryMetricsType::All { metric_names },
(false, false, _) => QueryMetricsType::Cluster {
metrics: names,
cluster_ids,
date: None,
metric_names,
},
(false, true, false) => QueryMetricsType::Backend {
metrics: names,
backend_ids,
date: None,
metric_names,
},
};

Expand Down
11 changes: 6 additions & 5 deletions command/src/proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -806,16 +806,17 @@ pub enum QueryCertificateType {
pub enum QueryMetricsType {
List,
Cluster {
metrics: Vec<String>,
cluster_ids: Vec<String>,
date: Option<i64>,
metric_names: Vec<String>,
},
Backend {
metrics: Vec<String>,
backend_ids: Vec<String>,
date: Option<i64>,
metric_names: Vec<String>,
},
/// dump proxy and cluster metrics
All {
metric_names: Vec<String>,
},
All, // dump proxy and cluster metrics
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
Expand Down
92 changes: 61 additions & 31 deletions lib/src/metrics/local_drain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,18 +184,16 @@ impl LocalDrain {
let worker_metrics = match query_type {
QueryMetricsType::List => return self.list_all_metric_names(),
QueryMetricsType::Cluster {
metrics,
metric_names,
cluster_ids,
date, // to be removed
} => self.query_clusters(metrics, cluster_ids),
} => self.query_clusters(cluster_ids, metric_names),

QueryMetricsType::Backend {
metrics,
metric_names,
backend_ids,
date, // to be removed
} => self.query_backends(metrics, backend_ids),
} => self.query_backends(backend_ids, metric_names),

QueryMetricsType::All => self.dump_all_metrics(),
QueryMetricsType::All { metric_names } => self.dump_all_metrics(metric_names),
};

match worker_metrics {
Expand All @@ -217,40 +215,56 @@ impl LocalDrain {
QueryAnswerMetrics::List((proxy_metrics_names, cluster_metrics_names))
}

pub fn dump_all_metrics(&mut self) -> Result<WorkerMetrics, String> {
pub fn dump_all_metrics(
&mut self,
metric_names: &Vec<String>,
) -> Result<WorkerMetrics, String> {
Ok(WorkerMetrics {
proxy: Some(self.dump_proxy_metrics()),
clusters: Some(self.dump_cluster_metrics()?),
proxy: Some(self.dump_proxy_metrics(metric_names)),
clusters: Some(self.dump_cluster_metrics(metric_names)?),
})
}

pub fn dump_proxy_metrics(&mut self) -> BTreeMap<String, FilteredData> {
pub fn dump_proxy_metrics(
&mut self,
metric_names: &Vec<String>,
) -> BTreeMap<String, FilteredData> {
self.proxy_metrics
.iter()
.filter(|(key, _)| {
if metric_names.is_empty() {
true
} else {
metric_names.contains(key)
}
})
.map(|(key, value)| (key.to_string(), value.to_filtered()))
.collect()
}

pub fn dump_cluster_metrics(&mut self) -> Result<BTreeMap<String, ClusterMetricsData>, String> {
pub fn dump_cluster_metrics(
&mut self,
metric_names: &Vec<String>,
) -> Result<BTreeMap<String, ClusterMetricsData>, String> {
let mut cluster_data = BTreeMap::new();

for cluster_id in self.get_cluster_ids() {
cluster_data.insert(
cluster_id.to_owned(),
self.metrics_of_one_cluster(&cluster_id)?,
self.metrics_of_one_cluster(&cluster_id, metric_names)?,
);
}

Ok(cluster_data)
}

// TODO: filter with metric names
fn metrics_of_one_cluster(&self, cluster_id: &str) -> Result<ClusterMetricsData, String> {
let cluster: BTreeMap<String, FilteredData> = match self.cluster_metrics.get(cluster_id) {
Some(cluster_metrics) => cluster_metrics
.iter()
.map(|entry| (entry.0.to_owned(), entry.1.to_filtered()))
.collect::<BTreeMap<String, FilteredData>>(),
fn metrics_of_one_cluster(
&self,
cluster_id: &str,
metric_names: &Vec<String>,
) -> Result<ClusterMetricsData, String> {
let raw_metrics = match self.cluster_metrics.get(cluster_id) {
Some(raw_metrics) => raw_metrics,
None => {
return Err(format!(
"No metrics found for cluster with id {}",
Expand All @@ -259,11 +273,23 @@ impl LocalDrain {
}
};

let cluster: BTreeMap<String, FilteredData> = raw_metrics
.iter()
.filter(|entry| {
if metric_names.is_empty() {
true
} else {
metric_names.contains(entry.0)
}
})
.map(|entry| (entry.0.to_owned(), entry.1.to_filtered()))
.collect::<BTreeMap<String, FilteredData>>();

let mut backends = BTreeMap::new();
for backend_id in self.get_backend_ids(&cluster_id) {
backends.insert(
backend_id.to_owned(),
self.metrics_of_one_backend(&backend_id)?,
self.metrics_of_one_backend(&backend_id, metric_names)?,
);
}
Ok(ClusterMetricsData {
Expand All @@ -272,14 +298,21 @@ impl LocalDrain {
})
}

// TODO: filter with metric names
fn metrics_of_one_backend(
&self,
backend_id: &str,
metric_names: &Vec<String>,
) -> Result<BTreeMap<String, FilteredData>, String> {
match self.cluster_metrics.get(backend_id) {
Some(backend_metrics) => Ok(backend_metrics
.iter()
.filter(|entry| {
if metric_names.is_empty() {
true
} else {
metric_names.contains(entry.0)
}
})
.map(|entry| (entry.0.to_owned(), entry.1.to_filtered()))
.collect::<BTreeMap<String, FilteredData>>()),
None => Err(format!(
Expand All @@ -291,17 +324,16 @@ impl LocalDrain {

fn query_clusters(
&mut self,
metric_names: &Vec<String>, // TODO: filter with metric names
cluster_ids: &Vec<String>,
metric_names: &Vec<String>,
) -> Result<WorkerMetrics, String> {
debug!("Querying cluster with ids: {:?}", cluster_ids);
let mut clusters: BTreeMap<String, ClusterMetricsData> = BTreeMap::new();

// TODO if metric_names is Some(names), filter. If empty, provide all metrics
for cluster_id in cluster_ids {
clusters.insert(
cluster_id.to_owned(),
self.metrics_of_one_cluster(cluster_id)?,
self.metrics_of_one_cluster(cluster_id, metric_names)?,
);
}

Expand All @@ -314,12 +346,11 @@ impl LocalDrain {

fn query_backends(
&mut self,
metric_names: &[String], // TODO: filter with metric names
backend_ids: &[String],
backend_ids: &Vec<String>,
metric_names: &Vec<String>,
) -> Result<WorkerMetrics, String> {
let mut clusters: BTreeMap<String, ClusterMetricsData> = BTreeMap::new();

// if metric_names is empty, provide all metrics for those backends
for backend_id in backend_ids {
let cluster_id = match self.backend_to_cluster.get(backend_id) {
Some(id) => id.to_owned(),
Expand All @@ -334,7 +365,7 @@ impl LocalDrain {
let mut backend_map: BTreeMap<String, BTreeMap<String, FilteredData>> = BTreeMap::new();
backend_map.insert(
backend_id.to_owned(),
self.metrics_of_one_backend(&backend_id)?,
self.metrics_of_one_backend(&backend_id, metric_names)?,
);

clusters.insert(
Expand Down Expand Up @@ -364,8 +395,7 @@ impl LocalDrain {
return;
}

// TODO: make this trace! again
debug!(
trace!(
"cluster metric: {} {} {:?} {:?}",
metric_name, cluster_id, backend_id, metric_value
);
Expand Down

0 comments on commit b0844e3

Please sign in to comment.