// SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 use super::{RouteDoc, service_v2}; use axum::{Json, Router, http::Method, http::StatusCode, response::IntoResponse, routing::get}; use dynamo_runtime::instances::list_all_instances; use serde_json::json; use std::sync::Arc; pub fn health_check_router( state: Arc, path: Option, ) -> (Vec, Router) { let health_path = path.unwrap_or_else(|| "/health".to_string()); let docs: Vec = vec![RouteDoc::new(Method::GET, &health_path)]; let router = Router::new() .route(&health_path, get(health_handler)) .with_state(state); (docs, router) } pub fn live_check_router( state: Arc, path: Option, ) -> (Vec, Router) { let live_path = path.unwrap_or_else(|| "/live".to_string()); let docs: Vec = vec![RouteDoc::new(Method::GET, &live_path)]; let router = Router::new() .route(&live_path, get(live_handler)) .with_state(state); (docs, router) } async fn live_handler( axum::extract::State(_state): axum::extract::State>, ) -> impl IntoResponse { ( StatusCode::OK, Json(json!({ "status": "live", "message": "Service is live" })), ) } async fn health_handler( axum::extract::State(state): axum::extract::State>, ) -> impl IntoResponse { let instances = match list_all_instances(state.discovery()).await { Ok(instances) => instances, Err(err) => { tracing::warn!(%err, "Failed to fetch instances from discovery"); vec![] } }; let mut endpoints: Vec = instances .iter() .map(|instance| instance.endpoint_id().as_url()) .collect(); endpoints.sort(); endpoints.dedup(); ( StatusCode::OK, Json(json!({ "status": "healthy", "endpoints": endpoints, "instances": instances })), ) }