Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Порівняння попередніх версій Попередня ревізія Наступна ревізія | Попередня ревізія | ||
watchdog [2023/01/22 09:53] nightfly [Действия выполняемые в результате прохождения условий] |
watchdog [2025/02/24 14:52] (поточний) nightfly [Моніторинг BGP пірів] |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
====== Собака-спостерігака aka Watchdog ====== | ====== Собака-спостерігака aka Watchdog ====== | ||
- | {{: | + | {{: |
- | Собака-спостерігака призначена для < | + | Собака-спостерігака призначена для < |
===== Можливі перевірки ===== | ===== Можливі перевірки ===== | ||
Рядок 56: | Рядок 56: | ||
| script | | script | ||
- | ===== Логика работы ===== | + | ===== Логіка роботи ===== |
- | Каждую | + | Кожне завдання |
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр ^ Оператор ^ Условие ^ Действия | + | ^ Ім`я ^ Тип перевірки ^ Параметр ^ Оператор ^ Умова ^ Дії |
- | | X | + | | Гугл не пінгається | icmpping |
- | При | + | При настанні події, коли ping на адресу google.com поверне значення "хибно" собака-спостерігака |
- | А что делать, | ||
- | ^ Активный ^ Имя | ||
- | | X | Чего-то изменилось | icmpping | ||
+ | А що робити, | ||
- | В принципе никто не запрещает | + | ^ Ім`я |
+ | | Щось змінилось | icmpping | ||
- | ^ Активный ^ Имя | ||
- | | X | В серверной пожар | script | ||
+ | В принципі, | ||
- | Вызывая внешний скрипт, снимающий температуру с термодатчиков и при превышении 22 градусов орать всеми известными способами также дописывая в сообщении о температуре | + | ^ Ім`я ^ Тип перевірки |
+ | | В серверній пожежа | script | ||
- | Если творчески подойти к парсингу вывода внешнего ПО - можно мониторить много интересных вещей без дописывания внешних скриптов: | ||
- | ^ Активный ^ Имя | ||
- | | X | DNS сломался | ||
- | Также мы можем очень просто и элегантно контролировать запущенность важных | + | Викликаючи зовнішній скрипт, що знімає температуру з термодатчиків і при перевищенні 22 градусів кричати всіма |
- | ^ Активный ^ Имя | + | |
- | | X | Stargazer упал | script | + | |
- | Хотя ту же самую по сути задачу мы можем оформить как | + | Якщо творчо підійти до парсингу виведення зовнішнього |
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр ^ Оператор ^ Условие | + | |
- | | X | Stargazer упал | fileexists | + | |
+ | ^ Ім`я | ||
+ | | DNS зламався | ||
- | Чтобы не сосредотачиваться | + | Також ми можемо дуже просто та елегантно контролювати |
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр | + | ^ Ім`я ^ Тип перевірки ^ Параметр ^ Оператор ^ Умова ^ Дії |
- | | X | Важный клиент подох | + | | Stargazer впав | script |
- | Окей, а если мы хотим также эту же СМС-ку послать скажем администратору этого же важного клиента, чтобы он точно знал, что он подох? | + | Хоча те саме завдання |
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр | + | ^ Ім`я ^ Тип перевірки ^ Параметр ^ Оператор ^ Умова ^ Дії |
- | | X | + | | Stargazer впав |
- | а если | + | Щоб не зосереджуватись на теоретичних речах, ми можемо передбачити |
- | + | ||
- | log, | + | ^ Ім`я |
+ | | Важливий клієнт подох | hopeping | ||
+ | |||
+ | |||
+ | Окей, | ||
+ | |||
+ | ^ Ім`я | ||
+ | | Важливий клієнт подох | hopeping | ||
+ | |||
+ | |||
+ | а якщо ми хочемо надіслати СМС лише | ||
| | ||
+ | log,sms {+380509999999} noprimary | ||
- | а если мы хотим послать алерт только в дополнительный/е чат/ы Telegram? | + | а якщо ми хочемо надіслати алерт тільки в додатковий чат Telegram? |
| | ||
log, | log, | ||
Рядок 115: | Рядок 120: | ||
- | а можно миксовать СМС | + | а можна міксувати СМС |
| | ||
log, | log, | ||
| | ||
+ | Хоча знову ж таки ніхто не забороняє нам, скажімо моніторити цього клієнта наприклад зовнішнім скриптом, | ||
+ | |||
+ | < | ||
+ | */10 * * * * / | ||
+ | </ | ||
+ | |||
+ | А ще ми можемо реагувати не лише на зміни поточних значень щодо якихось порогів, | ||
+ | |||
+ | |||
+ | ^ Ім`я | ||
+ | | Помилки полізли | onepunch | ||
+ | |||
+ | |||
+ | Ну або якийсь рівень зростання помилок ми вважаємо припустимим, | ||
+ | |||
+ | ^ Ім`я | ||
+ | | Помилки полізли активно | onepunch | ||
+ | |||
+ | |||
+ | Також ми можемо у такий спосіб відловлювати або різкі сплески або падіння утилізації, | ||
+ | ^ Ім`я | ||
+ | | Канал якось розігнався | onepunch | ||
- | Хотя опять же никто | + | Ну чи навпаки різкі падіння щодо попередніх значень (типу |
- | А еще | + | ^ Ім`я ^ Тип перевірки |
+ | | Трафік рухнов | ||
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр ^ Оператор | + | А ще ми можемо дуже просто |
- | | X | Ошибки полезли | onepunch | + | |
- | Ну либо какой-то уровень | + | ^ Ім`я |
+ | | http на хості | tcpping | ||
- | ^ Активный ^ Имя | ||
- | | X | Ошибки полезли резво | onepunch | ||
- | Также мы можем таким способом отлавливать либо резкие всплески либо падения утилизации, | + | ^ Ім`я |
+ | | https на хості | tcpping | ||
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр | + | ^ Ім`я ^ Тип перевірки ^ Параметр ^ Оператор ^ Умова ^ Дії |
- | | X | Канал разогнался как-то | onepunch | + | | syslogd |
- | Ну или наоборот резкие падения относительно предыдущих значений (типа утилизация аплинка провалилась на 20 гиг от последнего запуска собаки) | ||
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр ^ Оператор ^ Условие ^ Действия ^ | + | А ще ми можемо отримувати та перевіряти будь-які дані з будь-якого OID за допомогою snmpwalk: |
- | | X | Трафик рухнул куда-то | onepunch | + | |
- | А еще | + | ^ Ім`я ^ Тип перевірки ^ Параметр ^ Оператор |
+ | | Версія OS змінилась | snmpwalk | ||
- | ^ Активный ^ Имя | + | Або банально нотифікувати себе |
- | | X | http на хосте | tcpping | + | |
+ | ^ Ім`я | ||
+ | | В корені закінчується місце | freediskspace | ||
- | ^ Активный ^ Имя | + | ===== Відправка |
- | | X | https на хосте | tcpping | + | |
- | ^ Активный ^ Имя ^ Тип проверки ^ Параметр ^ Оператор ^ Условие ^ Действия ^ | + | Весь функціонал |
- | | X | syslogd | + | |
- | А еще мы можем получать и проверять любые | + | ===== Відсилка |
- | ^ Активный ^ Имя | + | |
- | | X | Версия OS | snmpwalk | + | |
- | Или банально нотифицировать себя о том, что в корневом разделе заканчивается место | + | Здійснюється також під час |
- | ^ Активный ^ Имя | + | |
- | | X | Место в корне заканчивается | freediskspace | + | |
- | ===== Отсылка SMS ===== | ||
- | Не требует включенного модуля рассылки [[turbosms|TurboSMS]]. Весь функционал отправки реализован посредством подсистемы [[senddog|" | ||
- | ===== Отсылка Telegram ===== | + | ===== Приклади скриптів ===== |
- | Осуществляется тоже при проходе " | + | |
- | ===== Примеры скриптов ===== | + | Як вже сказано вище, за допомогою |
- | Как уже говорилось выше, при | + | |
- | ==== Получение трафика с порта | + | ==== Отримання |
<file php switch_traffic> | <file php switch_traffic> | ||
# | # | ||
Рядок 214: | Рядок 231: | ||
</ | </ | ||
- | ==== Снятие температуры с eping3 | + | ==== Зняття температури з ping3 ==== |
<file php eping_temp> | <file php eping_temp> | ||
Рядок 237: | Рядок 254: | ||
</ | </ | ||
- | ==== Наличие электропитания с eping3 | + | ==== Наявність |
<file php eping_power> | <file php eping_power> | ||
Рядок 261: | Рядок 278: | ||
</ | </ | ||
- | ==== Количество свободного места в /var/ ==== | + | ==== Кількість вільного місця в /var/ ==== |
<file php var_stat> | <file php var_stat> | ||
Рядок 287: | Рядок 304: | ||
<?php | <?php | ||
- | $wallet=' | + | $wallet=' |
$workersStatsUrl = ' | $workersStatsUrl = ' | ||
$jsonRaw = file_get_contents($workersStatsUrl); | $jsonRaw = file_get_contents($workersStatsUrl); | ||
Рядок 305: | Рядок 322: | ||
- | ==== PPS на интерфейсе ==== | + | ==== PPS на інтерфейсі ==== |
<file bash stat_pps> | <file bash stat_pps> | ||
Рядок 313: | Рядок 330: | ||
- | ==== Утилизация CPU Linux хоста ==== | + | ==== Утилізація CPU Linux хоста ==== |
<file php lin_cpustats> | <file php lin_cpustats> | ||
Рядок 349: | Рядок 366: | ||
$raw=trim($raw[1]); | $raw=trim($raw[1]); | ||
if (!empty($raw)) { | if (!empty($raw)) { | ||
- | print($raw); | + | |
} else { | } else { | ||
- | print(' | + | |
} | } | ||
Рядок 358: | Рядок 375: | ||
</ | </ | ||
- | ===== Использование One-Punch скриптов ===== | + | ===== Використання One-Punch скриптів ===== |
- | Еще более предпочтительным, является | + | Ще більш доцільним є використання [[onepunch|One-Punch скриптів]] замість просто скриптів, котрі |
- | - Они храняться | + | - Вони зберігаються |
- | - Они выполняются внутри Ubilling | + | - Вони виконуються всередині Ubilling |
- | ===== Как это | + | ===== Як це працює? ===== |
- | Допустим берем | + | Допустимо беремо і створюємо [[onepunch|One-Punch]] скрипт |
<code php> | <code php> | ||
Рядок 373: | Рядок 390: | ||
</ | </ | ||
- | Вот как-то так | + | Ось якось так |
{{: | {{: | ||
- | И допустим мы хотим контролировать не изменятся | + | І припустимо ми хочемо контролювати чи не зміняться дані, що повертаються цим скриптом (з чого б це? ;) |
{{: | {{: | ||
+ | Сподіваюсь очевидно, | ||
- | |||
- | Надеюсь очевидно, | ||
\\ | \\ | ||
- | Также есть еще одно небольшое ограничение относящееся не только к данным возвращаемым | + | Також є ще одне невелике обмеження, що стосується не тільки даних, що повертаються |
- | ==== Трафик с порта ==== | + | ==== Трафік з порта ==== |
- | + | Ось | |
- | Вот | + | |
<code php> | <code php> | ||
Рядок 407: | Рядок 422: | ||
$raw=trim($raw[1]); | $raw=trim($raw[1]); | ||
if (!empty($raw)) { | if (!empty($raw)) { | ||
- | $cacheName=' | + | |
- | if (file_exists($cacheName)) { | + | if (file_exists($cacheName)) { |
- | $oldTime=filemtime($cacheName); | + | $oldTime=filemtime($cacheName); |
- | $oldOctets=file_get_contents($cacheName); | + | $oldOctets=file_get_contents($cacheName); |
- | $traffDiff=$raw-$oldOctets; | + | $traffDiff=$raw-$oldOctets; |
- | $timeDiff=$newTime-$oldTime; | + | $timeDiff=$newTime-$oldTime; |
- | if ($timeDiff!=0) { | + | if ($timeDiff!=0) { |
- | $speed=($traffDiff*8*100)/ | + | $speed=($traffDiff*8*100)/ |
- | $watchdogCallbackResult=round($speed/ | + | $watchdogCallbackResult=round($speed/ |
- | } else { | + | } else { |
- | $watchdogCallbackResult=' | + | $watchdogCallbackResult=' |
- | } | + | } |
- | | + | file_put_contents($cacheName, |
- | } else { | + | } else { |
- | file_put_contents($cacheName, | + | file_put_contents($cacheName, |
- | $watchdogCallbackResult=' | + | $watchdogCallbackResult=' |
- | } | + | } |
} | } | ||
Рядок 431: | Рядок 446: | ||
- | ==== Свободное место | + | ==== Вільне місце на диску ==== |
<code php> | <code php> | ||
Рядок 439: | Рядок 454: | ||
</ | </ | ||
- | ==== Load Average | + | ==== Load Average |
<code php> | <code php> | ||
Рядок 459: | Рядок 474: | ||
</ | </ | ||
- | ==== Мониторинг isc-dhcpd ==== | + | ==== Моніторинг isc-dhcpd ==== |
<code php> | <code php> | ||
Рядок 473: | Рядок 488: | ||
- | ==== Мониторинг TrassirServer ==== | + | ==== Моніторинг TrassirServer ==== |
<code php> | <code php> | ||
$watchdogCallbackResult = ''; | $watchdogCallbackResult = ''; | ||
Рядок 492: | Рядок 507: | ||
</ | </ | ||
- | ==== Мониторинг температуры на Equicom PING3 ==== | + | ==== Моніторинг температури з Equicom PING3 ==== |
<code php> | <code php> | ||
$ip = ' | $ip = ' | ||
Рядок 510: | Рядок 526: | ||
- | ==== Мониторинг наличия питания на Equicom PING3 === | + | ==== Моніторинг наявності живлення на Equicom PING3 === |
<code php> | <code php> | ||
$ip = ' | $ip = ' | ||
Рядок 527: | Рядок 543: | ||
</ | </ | ||
- | ==== Мониторинг температур на OLT-ах === | + | ==== Моніторинг температур на OLT-ах === |
<code php> | <code php> | ||
Рядок 586: | Рядок 602: | ||
} | } | ||
+ | </ | ||
+ | |||
+ | ==== Моніторинг живості OLT-ів === | ||
+ | |||
+ | <code php> | ||
+ | $watchdogCallbackResult = ' '; | ||
+ | $deadOltCount=0; | ||
+ | $deadSwitches = zb_SwitchesGetAllDead(); | ||
+ | |||
+ | if (!empty($deadSwitches)) { | ||
+ | $switchesDb=new NyanOrm(' | ||
+ | $switchesDb-> | ||
+ | $allOlts=$switchesDb-> | ||
+ | if (!empty($allOlts)) { | ||
+ | foreach ($allOlts as $oltIp=> | ||
+ | if (isset($deadSwitches[$oltIp])) { | ||
+ | $deadOltCount++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | if ($deadOltCount> | ||
+ | $watchdogCallbackResult .= $deadOltCount.' | ||
+ | } else { | ||
+ | $watchdogCallbackResult .= 'зі всіма наразі все гаразд.'; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Моніторинг BGP сесій === | ||
+ | |||
+ | <code php> | ||
+ | $watchdogCallbackResult = ''; | ||
+ | $deadPeersList = ''; | ||
+ | $bgpMon = new BGPMon(); | ||
+ | $allPeersStats = $bgpMon-> | ||
+ | $deadCount = 0; | ||
+ | if (!empty($allPeersStats)) { | ||
+ | foreach ($allPeersStats as $eachRouterId => $eachRouterStats) { | ||
+ | if (!empty($eachRouterStats)) { | ||
+ | foreach ($eachRouterStats as $io => $each) { | ||
+ | if ($each[' | ||
+ | $deadCount++; | ||
+ | $deadPeersList .= $each[' | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if ($deadCount > 0) { | ||
+ | $watchdogCallbackResult .= ' | ||
+ | $watchdogCallbackResult .= $deadPeersList; | ||
+ | } else { | ||
+ | $watchdogCallbackResult .= 'Зі всіма BGP пірами все гаразд'; | ||
+ | } | ||
+ | |||
+ | deb($watchdogCallbackResult); | ||
</ | </ |