Files
ITWorx_MCP_Hub-Public/services/observability/health.py
T

55 lines
1.7 KiB
Python

"""Safe aggregate health semantics: required failures are unhealthy, optional
connector and Redis failures are isolated and reported as degraded."""
from __future__ import annotations
from collections.abc import Iterable, Mapping
from dataclasses import dataclass
from typing import Any
@dataclass(frozen=True)
class DependencyHealth:
name: str
status: str
required: bool = True
authoritative: bool = True
detail: str = ""
def payload(self) -> dict[str, Any]:
return {
"status": self.status
if self.status in {"healthy", "ready", "degraded", "unhealthy", "unknown"}
else "unknown",
"required": self.required,
"authoritative": self.authoritative,
"detail": self.detail[:160],
}
@dataclass(frozen=True)
class AggregateHealth:
status: str
dependencies: Mapping[str, Mapping[str, Any]]
def payload(self, *, service: str, trace_id: str) -> dict[str, Any]:
return {
"status": self.status,
"service": service,
"traceId": trace_id,
"dependencies": self.dependencies,
}
def aggregate_health(dependencies: Iterable[DependencyHealth]) -> AggregateHealth:
values = list(dependencies)
if not values:
return AggregateHealth("unhealthy", {})
payload = {item.name: item.payload() for item in values}
required_failure = any(
item.required and item.status not in {"healthy", "ready"} for item in values
)
degraded = any(not item.required and item.status not in {"healthy", "ready"} for item in values)
status = "unhealthy" if required_failure else "degraded" if degraded else "healthy"
return AggregateHealth(status, payload)