66 lines
2.9 KiB
Python
66 lines
2.9 KiB
Python
"""
|
|
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.")
|