feat(bot): show actual response on failure, flap threshold, pause/rename/baseline, komodo fleet control and alert intake
This commit is contained in:
+47
-2
@@ -1,4 +1,4 @@
|
||||
from pydantic import Field, SecretStr
|
||||
from pydantic import Field, SecretStr, computed_field
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
|
||||
|
||||
@@ -11,6 +11,40 @@ class MonitorSettings(BaseSettings):
|
||||
reminder_interval: int = 1800 # как часто напоминать что всё ещё лежит, сек
|
||||
request_timeout: int = 10 # таймаут одного запроса, сек
|
||||
|
||||
# Сколько проверок подряд должны провалиться, прежде чем объявить падение.
|
||||
# Одна неудачная проверка — это обычно моргнувшая сеть, а не упавший
|
||||
# сервис. При 1 бот будит по любому чиху; при 2 ложные тревоги почти
|
||||
# исчезают, а реакция замедляется всего на один интервал.
|
||||
failure_threshold: int = 2
|
||||
|
||||
# Сколько символов ответа показывать в уведомлении.
|
||||
body_preview: int = 400
|
||||
|
||||
|
||||
class KomodoSettings(BaseSettings):
|
||||
"""Связь с Komodo. Всё опционально — без неё бот работает как раньше."""
|
||||
|
||||
url: str = "" # https://komod.example.com
|
||||
key: SecretStr = SecretStr("")
|
||||
secret: SecretStr = SecretStr("")
|
||||
timeout: int = 20
|
||||
|
||||
@computed_field
|
||||
@property
|
||||
def enabled(self) -> bool:
|
||||
return bool(self.url and self.key.get_secret_value())
|
||||
|
||||
|
||||
class WebSettings(BaseSettings):
|
||||
"""Приёмник входящих алертов (Komodo Alerter с endpoint type Custom)."""
|
||||
|
||||
enabled: bool = False
|
||||
host: str = "0.0.0.0" # noqa: S104
|
||||
port: int = 8080
|
||||
# Общий секрет. Komodo произвольные заголовки слать не умеет, поэтому
|
||||
# принимаем и в X-Alert-Token, и в query-параметре ?token=
|
||||
token: SecretStr = SecretStr("")
|
||||
|
||||
|
||||
class DbSettings(BaseSettings):
|
||||
path: str = "data/healthbot.db"
|
||||
@@ -24,9 +58,15 @@ class LogSettings(BaseSettings):
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
admin_id: int
|
||||
# Оставлено для совместимости: раньше админ был ровно один.
|
||||
admin_id: int = 0
|
||||
# Несколько админов — чтобы бот годился не только владельцу-одиночке.
|
||||
admin_ids: list[int] = Field(default_factory=list)
|
||||
|
||||
bot: BotSettings = Field(default_factory=BotSettings)
|
||||
monitor: MonitorSettings = Field(default_factory=MonitorSettings)
|
||||
komodo: KomodoSettings = Field(default_factory=KomodoSettings)
|
||||
web: WebSettings = Field(default_factory=WebSettings)
|
||||
db: DbSettings = Field(default_factory=DbSettings)
|
||||
log: LogSettings = Field(default_factory=LogSettings)
|
||||
|
||||
@@ -34,5 +74,10 @@ class Settings(BaseSettings):
|
||||
case_sensitive=False, env_file=".env", env_nested_delimiter="__", extra="ignore"
|
||||
)
|
||||
|
||||
@computed_field
|
||||
@property
|
||||
def admins(self) -> set[int]:
|
||||
return {i for i in (self.admin_id, *self.admin_ids) if i}
|
||||
|
||||
|
||||
env = Settings()
|
||||
|
||||
Reference in New Issue
Block a user