Skip to content

Commit

Permalink
metrics: return histograms for time metrics
Browse files Browse the repository at this point in the history
create local type MetricsMap
implement receive_metric function for local types
add error management
iterate logarithmically (base 2) to produce prometheus buckets
  • Loading branch information
Keksoj committed Jul 8, 2024
1 parent c533a01 commit b2d1cb0
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 137 deletions.
17 changes: 16 additions & 1 deletion command/src/command.proto
Original file line number Diff line number Diff line change
Expand Up @@ -602,13 +602,15 @@ message BackendMetrics {
map<string, FilteredMetrics> metrics = 2;
}

// A metric, in a "filtered" format, which means: sendable to outside programs.
message FilteredMetrics {
oneof inner {
uint64 gauge = 1;
int64 count = 2;
uint64 time = 3;
Percentiles percentiles = 4;
FilteredTimeSerie time_serie = 5;
FilteredHistogram histogram = 6;
}
}

Expand All @@ -618,7 +620,6 @@ message FilteredTimeSerie {
repeated uint32 last_hour = 3;
}


message Percentiles {
required uint64 samples = 1;
required uint64 p_50 = 2;
Expand All @@ -631,6 +632,20 @@ message Percentiles {
required uint64 sum = 9;
}

// a histogram meant to be translated to prometheus
message FilteredHistogram {
required uint64 sum = 1;
required uint64 count = 2;
repeated Bucket buckets = 3;
}

// a prometheus histogram bucket
message Bucket {
required uint64 count = 1;
// upper range of the bucket (le = less or equal)
required uint64 le = 2;
}

message RequestCounts {
map<string, int32> map = 1;
}
Expand Down
53 changes: 53 additions & 0 deletions command/src/proto/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ use crate::{
AsString,
};

use super::command::FilteredHistogram;

impl Display for CertificateAndKey {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let versions = self.versions.iter().fold(String::new(), |acc, tls_v| {
Expand Down Expand Up @@ -252,6 +254,7 @@ fn print_proxy_metrics(proxy_metrics: &BTreeMap<String, FilteredMetrics>) {
let filtered = filter_metrics(proxy_metrics);
print_gauges_and_counts(&filtered);
print_percentiles(&filtered);
print_histograms(&filtered);
}

fn print_worker_metrics(worker_metrics: &WorkerMetrics) -> Result<(), DisplayError> {
Expand Down Expand Up @@ -392,6 +395,56 @@ fn print_percentiles(filtered_metrics: &BTreeMap<String, FilteredMetrics>) {
percentile_table.printstd();
}

fn print_histograms(filtered_metrics: &BTreeMap<String, FilteredMetrics>) {
let histograms: BTreeMap<String, FilteredHistogram> = filtered_metrics
.iter()
.filter_map(|(name, metric)| match metric.inner.clone() {
Some(filtered_metrics::Inner::Histogram(hist)) => Some((name.to_owned(), hist)),
_ => None,
})
.collect();

let mut histogram_titles: Vec<String> = histograms.keys().map(ToOwned::to_owned).collect();
histogram_titles.sort();
if histogram_titles.is_empty() {
return;
}

let mut histogram_table = Table::new();
histogram_table.set_format(*prettytable::format::consts::FORMAT_BOX_CHARS);

let mut first_row = Row::new(vec![cell!("Histograms (ms)"), cell!("sum"), cell!("count")]);

let biggest_hist_length = histograms
.values()
.map(|hist| hist.buckets.len())
.max()
.unwrap_or(0);

// 0, 1, 3, 7... in the upper row
for exponent in 0..biggest_hist_length {
first_row.add_cell(cell!(format!("{}", (1 << exponent) - 1)));
}
histogram_table.set_titles(first_row);

for title in histogram_titles {
if let Some(hist) = histograms.get(&title) {
let trimmed_name = title.strip_suffix("_hist").unwrap_or_default();
let mut row = Row::new(vec![
cell!(trimmed_name),
cell!(hist.sum),
cell!(hist.count),
]);
for bucket in &hist.buckets {
row.add_cell(cell!(bucket.count));
}
histogram_table.add_row(row);
}
}

histogram_table.printstd();
}

fn print_available_metrics(available_metrics: &AvailableMetrics) -> Result<(), DisplayError> {
println!("Available metrics on the proxy level:");
for metric_name in &available_metrics.proxy_metrics {
Expand Down
Loading

0 comments on commit b2d1cb0

Please sign in to comment.