Бесплатный мониторинг сервера с оповещением в Telegram/sms

Aug 3, 2017 10:01 · 535 words · 3 minute read nixstats monitoring sms

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.

tweet Share