add server scom alert

This commit is contained in:
s.mostryukov 2024-10-14 16:59:25 +03:00
parent df76a66d4f
commit 99a1f55a3c
6 changed files with 107 additions and 3 deletions

View File

@ -15,7 +15,11 @@ OAA_CFG__REDIS__PWD=P@ssw0rd!
OAA_CFG__TG__BOT_TOKEN=string
OAA_CFG__TG__CHAT_ID=0
OAA_CFG__TG__DASHBOARD_TRED_ID=0
OAA_CFG__TG__NET_TRED_ID=0
OAA_CFG__TG__NET_DASHBOARD_TRED_ID=0
OAA_CFG__TG__SRV_TRED_ID=0
OAA_CFG__TG__SRV_DASHBOARD_TRED_ID=0
OAA_CFG__ZBX__TOKEN=string
OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved

View File

@ -49,6 +49,9 @@ class TelegramConfig(BaseModel):
chat_id: int
dashboard_tred_id: int | None = None
net_tred_id: int | None = None
net_dashboard_tred_id: int | None = None
srv_tred_id: int | None = None
srv_dashboard_tred_id: int | None = None
class FromZabbix(BaseModel):

View File

@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends
import logging as log
from schemas import scomNetworkMessage
from schemas import scomNetworkMessage, scomServerMessage
from auth import verify_token_scom
from redis_db import set_value, pop_value
from config import conf
@ -49,3 +49,92 @@ async def send_message_to_net_chat(
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.net_tred_id,
)
@router.post("/net")
async def srv_send_message(
message: scomNetworkMessage,
token: str = Depends(verify_token_scom),
):
if message.alert_resolution_state == "New":
text = f"‼️{message.alert_resolution_state} {message.alert_source} is not responding"
result = await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.net_dashboard_tred_id,
)
if result and result["status"] == 200:
await set_value(
f"scom:net_dashboard:{message.alert_source}", result["msg_id"]
)
result = await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.net_tred_id,
)
if result and result["status"] == 200:
await set_value(f"scom:net:{message.alert_source}", result["msg_id"])
else:
text = f"{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}"
dashboard_msg_id = await pop_value(f"scom:net_dashboard:{message.alert_source}")
if dashboard_msg_id:
dashboard_msg_id = int(dashboard_msg_id.decode("utf-8"))
await del_message(message_id=dashboard_msg_id, chat_id=conf.tg.chat_id)
msg_id = await pop_value(f"scom:net:{message.alert_source}")
if msg_id:
msg_id = int(msg_id.decode("utf-8"))
await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.net_tred_id,
reply_to_message_id=msg_id,
)
@router.post("/srv")
async def srv_send_message(
message: scomServerMessage,
token: str = Depends(verify_token_scom),
):
if message.alert_resolution_state == "New":
text = f"‼️{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}"
result = await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.srv_dashboard_tred_id,
)
if result and result["status"] == 200:
await set_value(
f"scom:srv_dashboard:{message.alert_source}-{message.alert_name}",
result["msg_id"],
)
result = await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.srv_tred_id,
)
if result and result["status"] == 200:
await set_value(
f"scom:srv:{message.alert_source}-{message.alert_name}",
result["msg_id"],
)
else:
text = f"{message.alert_source}\nAlert: {message.alert_name}\nState: {message.alert_resolution_state}\nDescription: {message.alert_description}"
dashboard_msg_id = await pop_value(
f"scom:srv_dashboard:{message.alert_source}-{message.alert_name}"
)
if dashboard_msg_id:
dashboard_msg_id = int(dashboard_msg_id.decode("utf-8"))
await del_message(message_id=dashboard_msg_id, chat_id=conf.tg.chat_id)
msg_id = await pop_value(
f"scom:srv:{message.alert_source}-{message.alert_name}"
)
if msg_id:
msg_id = int(msg_id.decode("utf-8"))
await send_message(
text=text,
chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.srv_tred_id,
reply_to_message_id=msg_id,
)

View File

@ -2,10 +2,14 @@ from .from_zabbix import (
MessageToDashboard as zbxMessageToDashboard,
MessageToNetworkChat as zbxMessageToNetworkChat,
)
from .from_scom import NetworkMessage as scomNetworkMessage
from .from_scom import (
NetworkMessage as scomNetworkMessage,
ServerMessage as scomServerMessage,
)
__all__ = [
"zbxMessageToDashboard",
"zbxMessageToNetworkChat",
"scomNetworkMessage",
"scomServerMessage",
]

View File

@ -12,5 +12,4 @@ class NetworkMessage(Message):
class ServerMessage(Message):
alert_name: str
alert_time: str
alert_description: str

View File

@ -8,6 +8,7 @@ async def send_message(
text: str,
chat_id: int,
message_thread_id: int | None = None,
reply_to_message_id: int | None = None,
) -> dict | None:
url = f"https://api.telegram.org/bot{conf.tg.bot_token}/sendMessage"
params = {
@ -16,6 +17,10 @@ async def send_message(
}
if message_thread_id:
params["message_thread_id"] = message_thread_id
if reply_to_message_id:
params["reply_to_message_id"] = reply_to_message_id
log.info(f"Params: {params}")
async with aiohttp.ClientSession() as session:
async with session.post(
url,