134 lines
6.4 KiB
Python
134 lines
6.4 KiB
Python
from datetime import datetime
|
||
from typing import Optional
|
||
|
||
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
|
||
from sqlalchemy.dialects.postgresql import ARRAY, JSONB
|
||
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
||
from .base import Base, TimestampMixin
|
||
|
||
CHECK_STATUS_VALUES = (
|
||
"online",
|
||
"offline",
|
||
"unknown",
|
||
"ok",
|
||
"warn",
|
||
"failed",
|
||
)
|
||
|
||
MONITOR_POLICY_MODES = ("inherit", "include", "exclude")
|
||
|
||
|
||
class DashboardCheckDefinition(Base, TimestampMixin):
|
||
__tablename__ = "dashboard_check_definitions"
|
||
|
||
check_key: Mapped[str] = mapped_column(String(64), primary_key=True)
|
||
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
|
||
interval_sec_default: Mapped[int] = mapped_column(Integer, nullable=False, default=300)
|
||
plugin_action: Mapped[str] = mapped_column(String(128), nullable=False)
|
||
categories: Mapped[list[str]] = mapped_column(ARRAY(String), nullable=False, default=list)
|
||
timeout_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=30)
|
||
concurrency: Mapped[int] = mapped_column(Integer, nullable=False, default=20)
|
||
|
||
|
||
class DashboardObjectCheckOverride(Base, TimestampMixin):
|
||
__tablename__ = "dashboard_object_check_overrides"
|
||
__table_args__ = (UniqueConstraint("object_id", "check_key", name="uq_dashboard_obj_check"),)
|
||
|
||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||
object_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("objects.id", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
check_key: Mapped[str] = mapped_column(
|
||
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False
|
||
)
|
||
enabled_override: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)
|
||
interval_sec_override: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||
categories_override: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String), nullable=True)
|
||
|
||
|
||
class DashboardDeviceLiveState(Base):
|
||
__tablename__ = "dashboard_device_live_state"
|
||
__table_args__ = (UniqueConstraint("device_id", "check_key", name="uq_dashboard_device_check"),)
|
||
|
||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||
device_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
check_key: Mapped[str] = mapped_column(
|
||
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown")
|
||
value_json: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
|
||
error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
||
checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
|
||
duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||
source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor")
|
||
|
||
|
||
class DashboardDeviceCheckHistory(Base):
|
||
__tablename__ = "dashboard_device_check_history"
|
||
|
||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||
device_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
check_key: Mapped[str] = mapped_column(
|
||
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown")
|
||
ping_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||
checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
|
||
duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
|
||
error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
||
source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor")
|
||
|
||
|
||
class DashboardObjectMonitorPolicy(Base, TimestampMixin):
|
||
__tablename__ = "dashboard_object_monitor_policy"
|
||
|
||
object_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("objects.id", ondelete="CASCADE"), primary_key=True
|
||
)
|
||
mode: Mapped[str] = mapped_column(String(16), nullable=False, default="inherit")
|
||
|
||
|
||
class DashboardTagMonitorPolicy(Base, TimestampMixin):
|
||
__tablename__ = "dashboard_tag_monitor_policy"
|
||
|
||
tag_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True
|
||
)
|
||
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
|
||
|
||
|
||
class DashboardObjectStatusBaseline(Base):
|
||
"""Baseline статусов устройств объекта. Устройства с offline/unknown в baseline
|
||
не учитываются в severity карточки, но помечаются как recovered если стали online."""
|
||
|
||
__tablename__ = "dashboard_object_status_baseline"
|
||
__table_args__ = (UniqueConstraint("object_id", "device_id", name="uq_baseline_object_device"),)
|
||
|
||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||
object_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("objects.id", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
device_id: Mapped[int] = mapped_column(
|
||
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
|
||
)
|
||
baseline_status: Mapped[str] = mapped_column(String(20), nullable=False)
|
||
saved_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
|
||
|
||
|
||
class DashboardMonitorRunState(Base):
|
||
__tablename__ = "dashboard_monitor_run_state"
|
||
|
||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||
status: Mapped[str] = mapped_column(String(20), nullable=False, default="idle")
|
||
run_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
|
||
scope: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
|
||
started_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
|
||
finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
|
||
last_success_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
|
||
last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
|
||
last_counts: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
|