v1.1.0: Alembic, pytest, домен и документация

- Миграции PostgreSQL через Alembic; DDL убран из lifespan приложения.
- Тесты: health, status, ingress Grafana; моки Vault/Grafana/Forgejo.
- Пакет onguard24/domain/ (сущности, шина событий), docs/DOMAIN.md.
- Обновлены README, CHANGELOG, ARCHITECTURE.

Made-with: Cursor
This commit is contained in:
Alexandr
2026-04-03 08:36:35 +03:00
parent 4da9b13a86
commit 85eb61b576
21 changed files with 611 additions and 32 deletions

View File

@ -0,0 +1,59 @@
"""Сущности домена (пока без таблиц БД — контракт для следующих версий)."""
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)