feat: Add metrics endpoint to packet-gateway health check server

- Add MetricsResponse struct with status, service, timestamp, tracked_ips, total_bytes_processed, and low_credit_users fields
- Add metrics_handler function calculating tracked IPs count, total bytes processed sum, and low credit users count from EbpfManager stats
- Add GET /metrics route to health check server
- Add ebpf_manager_clone state to health check server for metrics access
This commit is contained in:
nutcas3
2026-04-25 03:46:05 +03:00
parent d7e83c1f0d
commit 5467e22d22
+39 -1
View File
@@ -66,6 +66,41 @@ async fn liveness_handler() -> Json<HealthResponse> {
})
}
#[derive(Serialize)]
struct MetricsResponse {
status: String,
service: String,
timestamp: String,
tracked_ips: usize,
total_bytes_processed: u64,
low_credit_users: usize,
}
async fn metrics_handler(
State(ebpf_manager): State<Arc<EbpfManager>>,
) -> Json<MetricsResponse> {
let tracked_ips = ebpf_manager.get_packet_stats()
.map(|stats| stats.len())
.unwrap_or(0);
let total_bytes_processed = ebpf_manager.get_packet_stats()
.map(|stats| stats.iter().map(|s| s.bytes).sum())
.unwrap_or(0);
let low_credit_users = ebpf_manager.get_credit_info()
.map(|credits| credits.iter().filter(|c| c.credit < 1000).count())
.unwrap_or(0);
Json(MetricsResponse {
status: "ok".to_string(),
service: "packet-gateway".to_string(),
timestamp: chrono::Utc::now().to_rfc3339(),
tracked_ips,
total_bytes_processed,
low_credit_users,
})
}
async fn readiness_handler(
State(redis_client): State<Arc<redis::Client>>,
State(ebpf_attached): State<Arc<AtomicBool>>,
@@ -157,6 +192,7 @@ async fn main() -> Result<()> {
// Start HTTP health check server
let redis_client_arc = Arc::new(redis_client.clone());
let ebpf_attached_clone = Arc::clone(&ebpf_attached);
let ebpf_manager_clone = Arc::clone(&ebpf_manager);
let health_port = args.health_port;
tokio::spawn(async move {
@@ -164,8 +200,10 @@ async fn main() -> Result<()> {
.route("/health", get(health_handler))
.route("/health/ready", get(readiness_handler))
.route("/health/live", get(liveness_handler))
.route("/metrics", get(metrics_handler))
.with_state(redis_client_arc)
.with_state(ebpf_attached_clone);
.with_state(ebpf_attached_clone)
.with_state(ebpf_manager_clone);
let addr = format!("0.0.0.0:{}", health_port);
info!("Health check server listening on {}", addr);