This commit is contained in:
Mateusz Gruszczyński committed 2026-10-04 11:15:58 +02:00
1 parent 87e571c170
commit fa7abc9e53
308 files changed
+49746 -50237

No files matched your search

+159
View File
@@ -0,0 +1,159 @@
impl Pool {
pub fn view(&self) -> Value {
let members = self
.members
.iter()
.map(|m| {
let h = lock(&m.state.health);
let failure = lock(&m.state.last_failure);
let status = if !m.definition.enabled {
"disabled"
} else if m.definition.drain {
"draining"
} else if h.healthy {
"up"
} else if !h.checked && self.settings.health_check.mode != HealthMode::Off {
"checking"
} else {
"down"
};
// Keep this as explicit Map construction instead of one very large
// json! invocation. serde_json's json_internal! macro is recursive
// and the diagnostics payload is large enough to hit rustc's default
// macro recursion limit on supported stable toolchains.
let mut item = serde_json::Map::new();
item.insert("id".into(), json!(m.definition.id));
item.insert("url".into(), json!(m.definition.url));
item.insert("weight".into(), json!(m.definition.weight));
item.insert("backup".into(), json!(m.definition.backup));
item.insert(
"max_concurrent_requests".into(),
json!(m.definition.max_concurrent_requests),
);
item.insert("queue_timeout_ms".into(), json!(m.definition.queue_timeout_ms));
item.insert("status".into(), json!(status));
item.insert("healthy".into(), json!(h.healthy));
item.insert("active".into(), json!(m.state.active.load(Ordering::Relaxed)));
item.insert(
"requests".into(),
json!(m.state.requests.load(Ordering::Relaxed)),
);
item.insert("errors".into(), json!(m.state.errors.load(Ordering::Relaxed)));
item.insert(
"bytes_in".into(),
json!(m.state.bytes_in.load(Ordering::Relaxed)),
);
item.insert(
"bytes_out".into(),
json!(m.state.bytes_out.load(Ordering::Relaxed)),
);
item.insert("traffic_bytes_per_second".into(), json!(m.state.traffic_rate()));
item.insert("latency_ms".into(), json!(h.latency_us as f64 / 1000.0));
item.insert("ewma_latency_ms".into(), json!(h.ewma_us as f64 / 1000.0));
item.insert("last_probe_ms".into(), json!(h.last_probe_ms));
item.insert("last_result".into(), json!(h.result));
item.insert("last_passive_result".into(), json!(h.passive_result));
item.insert("failures".into(), json!(h.failures));
item.insert("passive_failures".into(), json!(h.passive_failures));
item.insert("successes".into(), json!(h.successes));
item.insert("passive_successes".into(), json!(h.passive_successes));
item.insert("transitions".into(), json!(h.transitions));
item.insert("unhealthy_source".into(), json!(h.unhealthy_source));
item.insert("unhealthy_reason".into(), json!(h.unhealthy_reason));
item.insert(
"http_5xx_total".into(),
json!(m.state.http_5xx_total.load(Ordering::Relaxed)),
);
item.insert(
"timeouts_total".into(),
json!(m.state.timeouts_total.load(Ordering::Relaxed)),
);
item.insert(
"connect_errors_total".into(),
json!(m.state.connect_errors_total.load(Ordering::Relaxed)),
);
item.insert(
"io_errors_total".into(),
json!(m.state.io_errors_total.load(Ordering::Relaxed)),
);
item.insert(
"slow_responses_total".into(),
json!(m.state.slow_responses_total.load(Ordering::Relaxed)),
);
item.insert(
"retry_attempts_total".into(),
json!(m.state.retry_attempts_total.load(Ordering::Relaxed)),
);
item.insert(
"retry_successes_total".into(),
json!(m.state.retry_successes_total.load(Ordering::Relaxed)),
);
item.insert(
"capacity_rejections_total".into(),
json!(m.state.capacity_rejections_total.load(Ordering::Relaxed)),
);
item.insert(
"queue_timeouts_total".into(),
json!(m.state.queue_timeouts_total.load(Ordering::Relaxed)),
);
item.insert(
"dns_errors_total".into(),
json!(m.state.dns_errors_total.load(Ordering::Relaxed)),
);
item.insert(
"tls_errors_total".into(),
json!(m.state.tls_errors_total.load(Ordering::Relaxed)),
);
item.insert(
"response_header_timeouts_total".into(),
json!(m.state.response_header_timeouts_total.load(Ordering::Relaxed)),
);
item.insert(
"read_timeouts_total".into(),
json!(m.state.read_timeouts_total.load(Ordering::Relaxed)),
);
item.insert(
"send_timeouts_total".into(),
json!(m.state.send_timeouts_total.load(Ordering::Relaxed)),
);
item.insert("last_failure_at_ms".into(), json!(failure.at_ms));
item.insert("last_failure_class".into(), json!(failure.class));
item.insert("last_failure_detail".into(), json!(failure.detail.as_str()));
item.insert(
"last_ejected_ms".into(),
json!(m.state.last_ejected_ms.load(Ordering::Relaxed)),
);
item.insert(
"last_recovered_ms".into(),
json!(m.state.last_recovered_ms.load(Ordering::Relaxed)),
);
item.insert(
"active_health_failures_total".into(),
json!(m.state.active_health_failures_total.load(Ordering::Relaxed)),
);
item.insert(
"passive_health_failures_total".into(),
json!(m.state.passive_health_failures_total.load(Ordering::Relaxed)),
);
item.insert(
"last_status".into(),
json!(m.state.last_status.load(Ordering::Relaxed)),
);
Value::Object(item)
})
.collect::<Vec<_>>();
json!({
"id": self.id,
"algorithm": self.settings.algorithm,
"ready": self.ready(),
"health_mode": self.settings.health_check.mode,
"passive_health": self.settings.passive_health,
"retry": self.settings.retry,
"sticky_mode": self.settings.sticky.mode,
"keepalive": self.settings.keepalive,
"members": members,
})
}
}