- Миграции PostgreSQL через Alembic; DDL убран из lifespan приложения. - Тесты: health, status, ingress Grafana; моки Vault/Grafana/Forgejo. - Пакет onguard24/domain/ (сущности, шина событий), docs/DOMAIN.md. - Обновлены README, CHANGELOG, ARCHITECTURE. Made-with: Cursor
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""Сущности домена (пока без таблиц БД — контракт для следующих версий)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
from typing import Any
|
|
from uuid import UUID, uuid4
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class Severity(str, Enum):
|
|
"""Грубая шкала для алертов и инцидентов."""
|
|
|
|
INFO = "info"
|
|
WARNING = "warning"
|
|
CRITICAL = "critical"
|
|
|
|
|
|
class Alert(BaseModel):
|
|
"""Нормализованный алерт после парсинга ingress (Grafana и др.)."""
|
|
|
|
id: UUID = Field(default_factory=uuid4)
|
|
source: str = Field(..., description="grafana, manual, …")
|
|
external_ref: str | None = Field(None, description="uid правила, fingerprint")
|
|
title: str = ""
|
|
severity: Severity = Severity.WARNING
|
|
labels: dict[str, str] = Field(default_factory=dict)
|
|
payload: dict[str, Any] = Field(default_factory=dict)
|
|
received_at: datetime | None = None
|
|
|
|
|
|
class Incident(BaseModel):
|
|
"""Инцидент в продукте (отдельно от сырого ingress_events)."""
|
|
|
|
id: UUID = Field(default_factory=uuid4)
|
|
title: str = ""
|
|
status: str = Field("open", description="open, acknowledged, resolved, …")
|
|
severity: Severity = Severity.WARNING
|
|
alert_ids: list[UUID] = Field(default_factory=list)
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class EscalationStep(BaseModel):
|
|
"""Один шаг цепочки (уведомление, пауза, повтор)."""
|
|
|
|
order: int = 0
|
|
kind: str = Field(..., description="notify, wait, repeat, …")
|
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
class EscalationPolicy(BaseModel):
|
|
"""Политика эскалации, привязанная к команде/сервису."""
|
|
|
|
id: UUID = Field(default_factory=uuid4)
|
|
name: str = ""
|
|
steps: list[EscalationStep] = Field(default_factory=list)
|