This commit is contained in:
Mateusz Gruszczyński committed 2026-10-15 09:37:47 +02:00
1 parent bbfa8cbc3f
commit 2ccc598b12
49 files changed
+4771 -639

No files matched your search

+40 -5
View File
@@ -14,11 +14,39 @@ fn live_chart_system_payload(state: &App) -> Value {
})
}
// Snapshot already holds bounded, configured Web Service IDs. Do not expose
// paths, FastCGI addresses or PHP INI parameters in a status poll.
fn web_server_metrics_payload(snapshot: &crate::config::Snapshot) -> Value {
let mut services = serde_json::Map::new();
for service in &snapshot.envelope.config.web_services {
let Some(compiled) = snapshot.web_php_services.get(&service.id) else {
continue;
};
let php = compiled.php.as_ref().map(|handler| {
let available = handler.permits.available_permits();
json!({"metrics": handler.metrics.view(), "capacity_limit": handler.max_concurrent,
"capacity_available": available, "capacity_used": handler.max_concurrent.saturating_sub(available)})
});
services.insert(
service.id.clone(),
json!({"web": compiled.web_metrics.view(), "php": php}),
);
}
Value::Object(services)
}
fn live_status_payload(state: &App) -> Value {
let snapshot = state.config.load_full();
let stream_metrics = state.active_streams.iter().filter_map(|stream| {
state.stream_metrics.get(&stream.id).map(|metrics| (stream.id.clone(), metrics.view()))
}).collect::<std::collections::BTreeMap<_, _>>();
let stream_metrics = state
.active_streams
.iter()
.filter_map(|stream| {
state
.stream_metrics
.get(&stream.id)
.map(|metrics| (stream.id.clone(), metrics.view()))
})
.collect::<std::collections::BTreeMap<_, _>>();
json!({
"version": env!("CARGO_PKG_VERSION"),
"uptime_seconds": state.started.elapsed().as_secs(),
@@ -29,6 +57,7 @@ fn live_status_payload(state: &App) -> Value {
"restart_required": snapshot.listeners != state.active_listeners
},
"metrics": state.metrics.view(),
"web_server_metrics": web_server_metrics_payload(&snapshot),
"live_system": live_chart_system_payload(state),
"cache": state.cache.view(),
"transform_metrics": state.transform_metrics.total(),
@@ -47,11 +76,17 @@ struct StatusQuery {
view: Option<String>,
}
async fn status(State(state): State<Arc<App>>, Query(query): Query<StatusQuery>) -> Result<Json<Value>, ApiError> {
async fn status(
State(state): State<Arc<App>>,
Query(query): Query<StatusQuery>,
) -> Result<Json<Value>, ApiError> {
match query.view.as_deref() {
None => Ok(Json(status_payload(&state))),
Some("live") => Ok(Json(live_status_payload(&state))),
_ => Err(ApiError(StatusCode::BAD_REQUEST, "invalid status view".into())),
_ => Err(ApiError(
StatusCode::BAD_REQUEST,
"invalid status view".into(),
)),
}
}