У меня есть вьюшка, с помощью которой я в Zabbix передаю сигнал о появившейся в базе нештатной нагрузке, которой считается любая нагрузка от неизвестного модуля, длящаяся больше 3 минут.
SQL код:
CREATE OR REPLACE FORCE EDITIONABLE VIEW "ZABBIX"."BORED_SESS" ("MODULE") AS
select '<b>Пользователь : </b>'||username||chr(10)||'<b>С терминала : </b>'||terminal||'('||machine||'/'||osuser||')'||chr(10)||'<b>Программа : </b>'||program||'('||module||'/'||action||')'||chr(10)||'<b>Ожидание : </b>'||event||chr(10)||'<b>Время ожидания : </b>'||last_call_et||' сек.'||chr(10)
FROM sys.v_$session
WHERE module NOT IN ('uploader',
'Balance',
'DBMS_SCHEDULER',
'AGENT')
AND TYPE = 'USER'
AND status = 'ACTIVE'
AND last_call_et > 180;
К сожалению, заббикс не очень богат вариантами отправки каких-то достаточно длинных сообщений, особенно многострочных, в связи с чем я накидал простейший скрипт, ругающийся юзерам о том, что на самом деле происходит. Сначала хотел разделять параметры в баше, но возни с разделителями оказалось сильно больше, чем если сразу собирать шаблон сообщения прямо запросом. Вот, не ругайте, это заготовка для реализации каких-то будущих фантазий. Поставил в крон раз в 5 минут.
Код:
#!/bin/bash
. /home/oracle/.bash_profile
send_telegram_message() {
local bot_token="$1"
local chat_id="$2"
local message="$3"
local url="https://api.telegram.org/bot${bot_token}/sendMessage"
curl -s -x 'http://proxy:3128' -X POST $url -d chat_id=$chat_id -d parse_mode='HTML' -d text="$message"
}
BOT_TOKEN="xxxxx"
CHAT_ID="-100xxxxxxxxxxxx"
tmpfile=/tmp/sess_id.tmp
export NLS_LANG=AMERICAN_AMERICA.UTF8
sqlplus -S /nolog <<EOF > /tmp/sess_id.tmp
connect / as sysdba
set head off
set pages 0
set linesize 1000
select * from zabbix.bored_sess;
exit;
EOF
cat /tmp/sess_id.tmp.
MESSAGE=`cat /tmp/sess_id.tmp`
grep 'no rows selected' /tmp/sess_id.tmp|| send_telegram_message "$BOT_TOKEN" "$CHAT_ID" "<b>С прискорбием сообщаю о нештатной нагрузке в базе</b> 💩
$MESSAGE"