This commit is contained in:
Mateusz Gruszczyński committed 2026-10-03 10:05:46 +02:00
1 parent 5e23e9af02
commit 3883a21bc4
56 files changed
+1640 -403

No files matched your search

+49 -1
View File
@@ -1246,9 +1246,32 @@ fn status_payload(state: &App) -> Value {
"locked_listen": state.startup_locks.administration.map(|value| value.to_string())
});
payload["features"] = Value::Object(features);
payload["cache"] = json!(state.cache.view());
let cache_view = state.cache.view();
let transform_resources = crate::transform::resource_usage(&snapshot.envelope.config.transform);
payload["cache"] = json!(&cache_view);
payload["transform_resources"] = json!(&transform_resources);
payload["geoip"] = json!(state.geoip.view());
let system = state.diagnostics.view();
let cache_ram_bytes = (cache_view.hot_allocated_bytes as u64)
.saturating_add(cache_view.transient_bytes);
let non_cache_rss_bytes = system
.process_rss_bytes
.map(|rss| rss.saturating_sub(cache_ram_bytes));
payload["memory_accounting"] = json!({
"process_rss_bytes": system.process_rss_bytes,
"cache_hot_bytes": cache_view.hot_allocated_bytes,
"cache_hot_limit_bytes": cache_view.hot_limit_bytes,
"cache_transient_bytes": cache_view.transient_bytes,
"cache_transient_limit_bytes": cache_view.transient_limit_bytes,
"cache_total_bytes": cache_ram_bytes,
"transform_reserved_bytes": transform_resources.memory_reserved_bytes,
"transform_budget_bytes": transform_resources.memory_budget_bytes,
"transform_inflight": transform_resources.inflight,
"transform_max_inflight": transform_resources.max_inflight,
"non_cache_rss_bytes": non_cache_rss_bytes,
"non_cache_rss_includes_transform": true,
"method": "rss_minus_accounted_cache; transform reservation is an overlapping estimate"
});
payload["runtime"] = json!({
"platform": system.platform,
"statistics_source": system.source,
@@ -2057,6 +2080,30 @@ mod tests {
);
}
#[tokio::test]
async fn status_exposes_runtime_memory_accounting_and_cold_limits() {
let (router, store, _dir, secret, _) = fixture().await;
let response = router
.oneshot(
request("/api/status")
.header("cookie", format!("{}={secret}", auth::COOKIE_NAME))
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
let body = json_body(response).await;
assert_eq!(body["transform_resources"]["memory_budget_bytes"], 128 * 1024 * 1024);
assert_eq!(body["transform_resources"]["max_inflight"], 32);
assert_eq!(body["memory_accounting"]["transform_budget_bytes"], 128 * 1024 * 1024);
assert_eq!(body["memory_accounting"]["cache_hot_limit_bytes"], 256 * 1024 * 1024);
assert_eq!(body["cache"]["cold_limit_bytes"], 4_u64 * 1024 * 1024 * 1024);
assert_eq!(body["cache"]["cold_limit_entries"], 50_000);
assert_eq!(body["memory_accounting"]["non_cache_rss_includes_transform"], true);
store.close().await;
}
#[tokio::test]
async fn rejects_legacy_token_rebinding_and_cross_origin() {
let (router, store, _dir, secret, _) = fixture().await;
@@ -3418,6 +3465,7 @@ async fn transform_status(State(state): State<Arc<App>>) -> Json<Value> {
.collect();
Json(json!({
"settings": global,
"resources": crate::transform::resource_usage(global),
"metrics": state.transform_metrics.view(),
"vhosts": vhosts
}))