""" Pydantic schemas for defining health check responses, following IETF standards. """ from datetime import datetime from enum import Enum # Import ConfigDict from pydantic to resolve the deprecation warning from pydantic import BaseModel, Field, ConfigDict # Define acceptable statuses as an Enum for robust validation class HealthStatusEnum(str, Enum): """Enumeration for standard health check statuses.""" passed = "pass" warned = "warn" failed = "fail" class ComponentCheck(BaseModel): """ Represents the status and metrics for a single internal component or dependency. """ # Use ConfigDict instead of the class Config approach model_config = ConfigDict( populate_by_name=True # Allows instantiation using either 'observed_value' or 'observedValue' ) name: str = Field(description="The unique name of the component being checked (e.g., 'postgres', 'redis').") status: HealthStatusEnum = Field(description="The status of the check: 'pass', 'warn', or 'fail'.") time: datetime | None = Field(default=None, description="The time at which the check was performed in ISO 8601 format.") output: str | None = Field(default=None, description="Additional details, error messages, or logs if the status is 'fail' or 'warn'.") # Python uses snake_case internally, JSON uses camelCase for the alias observed_value: float | int | None = Field( default=None, alias="observedValue", description="The value observed during the check (e.g., latency in ms)." ) # Python uses snake_case internally, JSON uses camelCase for the alias observed_unit: str | None = Field( default=None, alias="observedUnit", description="The unit of the observed value (e.g., 'ms', 'count', 'bytes')." ) class HealthStatus(BaseModel): """ The overall system health response model, aggregating all individual component checks. """ # Use ConfigDict instead of the class Config approach model_config = ConfigDict( populate_by_name=True ) status: HealthStatusEnum = Field(description="The aggregate status of the entire service: 'pass', 'warn', or 'fail'.") version: str | None = Field(default=None, description="The application version (e.g., Git SHA or semantic version number).") environment: str | None = Field(default=None, description="The deployment environment (e.g., 'production', 'staging').") # Python uses snake_case internally, JSON uses camelCase for the alias service_name: str | None = Field( default=None, alias="serviceName", description="The name of the service." ) description: str | None = Field(default=None, description="A brief description of the service.") checks: dict[str, ComponentCheck] = Field(description="A dictionary mapping check keys (e.g., 'Database') to their detailed ComponentCheck results.")