Бесплатный мониторинг сервера с оповещением в Telegram/sms
Aug 3, 2017 10:01 · 535 words · 3 minute read
Nixstats — бесплатный сервис для мониторинга, отображения статистики сервера и оповещения о проблемах. По заверениям автора сервис находится в процессе разработки, поэтому он пока бесплатен.
Давайте разберемся с настройкой мониторинга сервера и рассмотрим простой пример отправки оповещений о проблемах!
Для мониторинга сервера необходимо зарегистрироваться на сервисе и установить агент на сервер. Сделать это можно командой:
wget --no-check-certificate -N https://www.nixstats.com/nixstatsagent.sh && bash nixstatsagent.sh your_token_id
Токен придет в письме после регистрации, и будет выглядеть примерно так: 535cae83389a4b05f304185b
. Через несколько минут после установки агента данные уже будут доступны в web-интерфейсе сервиса Nixstats.
Далее можно настроить мониторинг домена (вкладка Monitors) и страницу статуса, но самое главное — необходимо создать контакт для получения оповещений о проблемах. На момент написания статьи доступны следующие варианты уведомлений: e-mail, sms (бесплатный лимит 5 шт/мес), pushover, pushbullet, webhook, hipchat и slack. Стоит отметить, что у меня не заработал вариант с оповещением о проблемах через sms — на мой взгляд, самый важный и полезный вариант уведомлений.
Nixstats передает данные для вебхука в следующем формате:
{
"server_id": "server_id",
"notification_id": "notification_id",
"alert_id": "alert_id",
"server_name": "web-server",
"metric": "pct-cpu",
"status": “open”,
"value": 99.928,
"subject": "CPU overall higher 99% - currently: 100 %",
"threshold": 99,
"start_time": 1491992292,
"time": 1491992322
}
{
"domain_id": "554be6e94303ed9c2d8b4568",
"notification_id": "58eb5d0d22607e0791308ac5",
"name": "uptimetest.nixstats.com",
"status": "close",
"subject": "Monitor uptimetest.nixstats.com is back online",
"start_time": 1491819789,
"end_time": 1492187938,
"time": 1492187938
}
Для отправки уведомлений о проблемах на сервере в Telegram, необходимо создать бота (как это сделать здесь) и выяснить ваш chat_id (подробнее). Напомню, чтобы бот заработал, необходимо первым отправить ему сообщение (любого содержания).
Далее создаем файл webhook.php
следующего содержания:
<?php
$telegrambot = "123456789:SCR8NwQtqFoD3dPSmu99z8um8vN8jfQNYps";
$telegramchatid = "12345678";
$timezone = 2; // 2 for UTC+2
function telegram($message)
{
global $telegrambot, $telegramchatid;
$url = 'https://api.telegram.org/bot'.$telegrambot.'/sendMessage';
$data = array('chat_id' => $telegramchatid, 'text' => $message, 'disable_web_page_preview' => 1);
$options = array('http' => array('method' => 'POST', 'header' => "Content-Type:application/x-www-form-urlencoded\r\n", 'content' => http_build_query($data)));
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return $result;
}
if(isset($_POST['payload']))
{
$data = json_decode($_POST['payload'], true);
if(empty($data['domain_id']))
{
$server_id = $data['server_id'];
$notification_id = $data['notification_id'];
$alert_id = $data['alert_id'];
$server_name = $data['server_name'];
$metric = $data['metric'];
$status = $data['status'];
$value = $data['value'];
$subject = $data['subject'];
$threshold = $data['threshold'];
$start_time = date('Y-m-d H:i:s', $data['start_time']+($timezone*3600));
$time = date('Y-m-d H:i:s', $data['time']+($timezone*3600));
if($status == "open")
{
telegram($subject."\n".$start_time."\nView server statistics on https://nixstats.com/server/".$server_id);
}
else
{
telegram($subject."\n".$time."\nView server statistics on https://nixstats.com/server/".$server_id);
}
}
else
{
$domain_id = $data['domain_id'];
$notification_id = $data['notification_id'];
$name = $data['name'];
$status = strtoupper($data['status']);
$subject = $data['subject'];
$start_time = date('Y-m-d H:i:s', $data['start_time']+($timezone*3600));
$end_time = date('Y-m-d H:i:s', $data['end_time']+($timezone*3600));
if($status == "OPEN")
{
telegram($status." - ".$name." ".$subject."\n".$start_time."\nView domain statistics on https://nixstats.com/domain/".$domain_id);
}
else
{
telegram($status." - ".$name." ".$subject."\n".$end_time."\nView domain statistics on https://nixstats.com/domain/".$domain_id);
}
}
}
Этот же webhook можно доработать, и слать с его помощью sms-оповещения. В качестве провайдера будем использовать шлюз TURBOSMS (выбран исключительно за низкую стоимость услуг) — естественно, сначала регистрируемся и пополняем счет. Функция отправки sms будет выглядеть так:
...
function sms($message)
{
$client = new SoapClient ('http://turbosms.in.ua/api/wsdl.html');
$auth = array('login' => 'mylogin', 'password' => 'myverystrongpassword');
$result = $client->Auth ($auth);
$sms = Array ('sender' => 'NIXStats','destination' => '+380XXXXXXXXX','text' => $message);
$result = $client->SendSMS ($sms);
return $result;
}
...
Полностью готовое решение можно взять здесь.
После написания вебхука в настройках контакта нужно вставить ссылку на него. Далее в настройках мониторинга отдельного сервиса указываем своего пользователя и ставим чекбокс Webhook.