fix(observability): fallback mimalloc requested memory stats (#5695)

Co-authored-by: heihutu <heihutu@gmail.com>
This commit is contained in:
houseme
2026-08-04 21:10:29 +08:00
committed by GitHub
parent c63dba7d3f
commit 93fcd6b6b5
+43 -3
View File
@@ -259,16 +259,32 @@ fn mimalloc_stat_current(value: &Value, metric: &str) -> Option<u64> {
mimalloc_stat_field(value, metric, "current")
}
#[cfg(any(test, not(target_os = "windows")))]
fn mimalloc_stat_sum(value: &Value, metrics: &[&str], field: &str) -> Option<u64> {
metrics
.iter()
.map(|metric| mimalloc_stat_field(value, metric, field))
.try_fold(0_u64, |sum, value| value.map(|value| sum.saturating_add(value)))
.filter(|value| *value > 0)
}
#[cfg(any(test, not(target_os = "windows")))]
fn parse_mimalloc_stats_json(stats_json: &str) -> Option<AllocatorMemoryObservation> {
let value = serde_json::from_str::<Value>(stats_json).ok()?;
let malloc_metrics = ["malloc_normal", "malloc_huge"];
let observation = AllocatorMemoryObservation {
reserved_bytes: mimalloc_stat_current(&value, "reserved"),
committed_bytes: mimalloc_stat_current(&value, "committed"),
page_committed_bytes: mimalloc_stat_current(&value, "page_committed"),
malloc_requested_bytes: mimalloc_stat_current(&value, "malloc_requested"),
malloc_requested_peak_bytes: mimalloc_stat_field(&value, "malloc_requested", "peak"),
malloc_requested_total_bytes: mimalloc_stat_field(&value, "malloc_requested", "total"),
malloc_requested_bytes: mimalloc_stat_current(&value, "malloc_requested")
.filter(|value| *value > 0)
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "current")),
malloc_requested_peak_bytes: mimalloc_stat_field(&value, "malloc_requested", "peak")
.filter(|value| *value > 0)
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "peak")),
malloc_requested_total_bytes: mimalloc_stat_field(&value, "malloc_requested", "total")
.filter(|value| *value > 0)
.or_else(|| mimalloc_stat_sum(&value, &malloc_metrics, "total")),
heap_count: mimalloc_stat_current(&value, "heaps").or_else(|| mimalloc_stat_current(&value, "heap_count")),
};
@@ -504,6 +520,30 @@ mod tests {
assert_eq!(parsed.heap_count, Some(8));
}
#[test]
fn parse_mimalloc_stats_json_falls_back_to_allocated_bytes_when_requested_is_zero() {
let parsed = parse_mimalloc_stats_json(
r#"{
"stat_version": 1,
"mimalloc_version": 300,
"reserved": { "total": 1048576, "peak": 1048576, "current": 1048576 },
"committed": { "total": 524288, "peak": 524288, "current": 524288 },
"malloc_normal": { "total": 7340032, "peak": 262144, "current": 196608 },
"malloc_huge": { "total": 3145728, "peak": 131072, "current": 65536 },
"malloc_requested": { "total": 0, "peak": 0, "current": 0 },
"heaps": { "total": 1, "peak": 1, "current": 1 }
}"#,
)
.expect("mimalloc v3 stats should parse");
assert_eq!(parsed.reserved_bytes, Some(1_048_576));
assert_eq!(parsed.committed_bytes, Some(524_288));
assert_eq!(parsed.malloc_requested_bytes, Some(262_144));
assert_eq!(parsed.malloc_requested_peak_bytes, Some(393_216));
assert_eq!(parsed.malloc_requested_total_bytes, Some(10_485_760));
assert_eq!(parsed.heap_count, Some(1));
}
#[test]
fn parse_mimalloc_stats_json_rejects_unrecognized_payload() {
assert_eq!(parse_mimalloc_stats_json(r#"{ "allocator": "unknown" }"#), None);