Мониторинг и оповещение для трафика приложений
В настоящее время я помещаю почасовой трафик (общее количество запросов ввода) моего веб-сайта в таблицу MySQL. Я храню данные за последние 90 дней.
Я хочу проверять каждый час, скажем, 6-й час, что трафик увеличился / уменьшился за порогом, чем последние 7 дней или последние 30 дней 6-часовой трафик. В основном, я вижу схему движения. Разные часы имеют разные значения.
Чтобы генерировать оповещения, я хочу найти различные статистические показатели. Прочитав немного, я узнал, что Statsd
может быть использован для этой цели.
Это правильные вещи, чтобы использовать для отправки оповещений, как это? Есть ли лучшее / простое решение для этого?
Я не собираюсь создавать какие-либо инструментальные панели.
Мои текущие данные выглядят так:
+---------------------+---------------------+-----------+----------+
| startTime | endTime | component | traffic |
+---------------------+---------------------+-----------+----------+
| 2015-05-01 00:00:00 | 2015-05-01 01:00:00 | rest | 29090345 |
| 2015-05-01 01:00:00 | 2015-05-01 02:00:00 | rest | 32224087 |
| 2015-05-01 02:00:00 | 2015-05-01 03:00:00 | rest | 35165799 |
| 2015-05-01 03:00:00 | 2015-05-01 04:00:00 | rest | 36903464 |
| 2015-05-01 04:00:00 | 2015-05-01 05:00:00 | rest | 40394130 |
| 2015-05-01 05:00:00 | 2015-05-01 06:00:00 | rest | 44874862 |
| 2015-05-01 06:00:00 | 2015-05-01 07:00:00 | rest | 49988600 |
| 2015-05-01 07:00:00 | 2015-05-01 08:00:00 | rest | 52240544 |
| 2015-05-01 08:00:00 | 2015-05-01 09:00:00 | rest | 54517705 |
| 2015-05-01 09:00:00 | 2015-05-01 10:00:00 | rest | 55277967 |
| 2015-05-01 10:00:00 | 2015-05-01 11:00:00 | rest | 55285309 |
| 2015-05-01 11:00:00 | 2015-05-01 12:00:00 | rest | 55572614 |
2 ответа
Вы можете использовать следующий сценарий SQL для сравнения трафика.
set @threshold = 50; /*threshold for comparing the traffic*/
set @limit = 30 /*how many days to consider while generating avg value*/
/*calculate the time range, comparison is done for the last hour*/
set @end_time = current_timestamp();
set @end_time = timestamp(date(@end_time), maketime(hour(@end_time), 0, 0));
set @start_time = date_sub(@end_time, interval 1 hour);
/*find out the traffic for the last hour*/
select traffic
from test.traffic_stats
where startTime >= @start_time
and endTime <= @end_time
into @curr_traffic;
/*now find out the avg traffic for the past @limit days*/
select ifnull(avg(traffic), 0)
from test.traffic_stats
where startTime < @start_time
and startTime >= date_sub(@start_time, interval @limit day)
and time(startTime) >= time(@start_time)
and time(endTime) <= time(@end_time)
into @avg_traffic;
/*generate the report*/
select concat(
'Current traffic '
@curr_traffic,
' is '
if(@curr_traffic > @avg_traffic + @threshold,
'more',
if(@curr_traffic < @avg_traffic - @threshold,
'less',
'same'
)
),
' compared to the avg traffic ',
@avg_traffic
) as result;
Сценарий будет генерировать отчет на основе среднего трафика за последние 30 дней путем запроса test.traffic_stats
Таблица. Пожалуйста, измените скрипт, чтобы он соответствовал вашим требованиям. Теперь сохраните этот SQL-скрипт как report.sql
и вы можете использовать Cron
запускать его через определенные промежутки времени, используя командную строку mysql, как указано ниже.
mysql -hhost -uuser -ppassword -s <report.sql | awk '{print $1}'
Это извлечет результат и выведет на стандартный вывод. Теперь вы можете использовать GNU Mailutils для отправки оповещения на ваш адрес электронной почты.
mail -s "$(mysql -hhost -uuser -ppassword -s <report.sql | awk '{print $1}')" you@example.com
Возможно, InfluxDB может быть вам интересен. InfluxDB - это база данных временных рядов.
Вы можете отправить свои данные напрямую в InfluxDB через
- statsd
- двоичный интерфейс collectd
- графитовый протокол
- REST API
Вы можете запросить InfluxDB через REST-API, и графический интерфейс не нужен. Но Графана прекрасно с этим работает.