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__BOT_TOKEN=string
OAA_CFG__TG__CHAT_ID=0 OAA_CFG__TG__CHAT_ID=0
OAA_CFG__TG__DASHBOARD_TRED_ID=0 OAA_CFG__TG__DASHBOARD_TRED_ID=0
OAA_CFG__TG__NET_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__TOKEN=string
OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved OAA_CFG__ZBX__CLOSE_ALERT_PATTERN=^Problem has been resolved

View File

@ -49,6 +49,9 @@ class TelegramConfig(BaseModel):
chat_id: int chat_id: int
dashboard_tred_id: int | None = None dashboard_tred_id: int | None = None
net_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): class FromZabbix(BaseModel):

View File

@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
import logging as log import logging as log
from schemas import scomNetworkMessage from schemas import scomNetworkMessage, scomServerMessage
from auth import verify_token_scom from auth import verify_token_scom
from redis_db import set_value, pop_value from redis_db import set_value, pop_value
from config import conf from config import conf
@ -49,3 +49,92 @@ async def send_message_to_net_chat(
chat_id=conf.tg.chat_id, chat_id=conf.tg.chat_id,
message_thread_id=conf.tg.net_tred_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, MessageToDashboard as zbxMessageToDashboard,
MessageToNetworkChat as zbxMessageToNetworkChat, MessageToNetworkChat as zbxMessageToNetworkChat,
) )
from .from_scom import NetworkMessage as scomNetworkMessage from .from_scom import (
NetworkMessage as scomNetworkMessage,
ServerMessage as scomServerMessage,
)
__all__ = [ __all__ = [
"zbxMessageToDashboard", "zbxMessageToDashboard",
"zbxMessageToNetworkChat", "zbxMessageToNetworkChat",
"scomNetworkMessage", "scomNetworkMessage",
"scomServerMessage",
] ]

View File

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

View File

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