v0.33.0
This commit is contained in:
1 parent
bbfa8cbc3f
commit
2ccc598b12
49 files changed
+4771
-639
No files matched your search
@@ -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(),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user