fix(metrics): remove duplicate scanner counter producers (#6245)

* fix(metrics): remove duplicate scanner counter producers

* chore(deps): centralize metrics test dependencies

* ci: avoid apt mirror for ripgrep setup

* test(protos): track read-version encoder refactor

---------

Co-authored-by: Henry Guo <marshawcoco@users.noreply.github.com>
Co-authored-by: houseme <housemecn@gmail.com>
This commit is contained in:
Henry Guo
2026-08-19 21:58:22 +08:00
committed by GitHub
parent 9fed675185
commit 24cfce12ed
14 changed files with 71 additions and 32 deletions
+2 -1
View File
@@ -163,4 +163,5 @@ libc = { workspace = true }
[dev-dependencies]
tempfile = { workspace = true }
temp-env = { workspace = true }
log = "0.4"
log.workspace = true
metrics-util = { workspace = true, features = ["debugging"] }
@@ -465,6 +465,57 @@ fn bool_metric_value(enabled: bool) -> f64 {
mod tests {
use super::*;
use crate::metrics::report::report_metrics;
use metrics_util::debugging::DebuggingRecorder;
use rustfs_common::metrics::{Metric, Metrics};
fn prometheus_counter_name(name: &str) -> String {
if name.ends_with("_total") {
name.to_string()
} else {
format!("{name}_total")
}
}
#[test]
fn scanner_lifetime_counters_have_one_prometheus_producer() {
let recorder = DebuggingRecorder::new();
let snapshotter = recorder.snapshotter();
let scanner_metrics = collect_scanner_metrics(&ScannerStats {
directories_scanned: 3,
objects_scanned: 7,
..Default::default()
});
metrics::with_local_recorder(&recorder, || {
Metrics::time(Metric::ScanObject)();
Metrics::time(Metric::ScanFolder)();
report_metrics(&scanner_metrics);
});
let normalized_counter_names: Vec<_> = snapshotter
.snapshot()
.into_vec()
.into_iter()
.filter_map(|(composite, _, _, value)| {
matches!(value, metrics_util::debugging::DebugValue::Counter(_))
.then(|| prometheus_counter_name(composite.key().name()))
})
.collect();
for name in [
"rustfs_scanner_objects_scanned_total",
"rustfs_scanner_directories_scanned_total",
] {
assert_eq!(
normalized_counter_names
.iter()
.filter(|candidate| candidate.as_str() == name)
.count(),
1,
"scanner lifetime counter must have exactly one producer after Prometheus name normalization"
);
}
}
#[test]
fn test_collect_scanner_metrics() {