У нас используется система управления проектами и задачами Redmine . На нее у нас завязан и Zabbix и другие системы мониторинга. И вот как то появилась идея интегрировать ее со StatusCake для удобства контроля всех задач в одной системе.
Есть такая система онлайн мониторинга StatusCake. Она позволяет строить достаточно сложные проверки для сайтов, проверяет их доступность, скорость доступа, строит разные красивые графики.
Но нас интересует не этот функционал, как любая система мониторинга она имеет механизм оповещения о проблемах. Способы оповещения достаточно разнообразны. Есть интеграция с разными сервисами, в частности с twitter (зачем??? что бы публиковать когда падает сервер). Но вот интеграции с Redmine там нет. Но зато есть возможность использовать webhook. Чем мы и воспользовались. Ниже под катом, что у нас получилось.
Для начала, на одном из серверов, где у нас расположена система мониторинга был расположен простенький php-скрипт, который вызывался каждый раз при изменение состояние сервера в StatusCake. Данному скрипту передается json, который в общем виде содержит:
Скрипт выполняет всего две функции получает данные и вызывает скрипт на python, которому передает полученные значения. Сам скрипт:
Так пол дела сделано, данные мы уже получаем. Теперь надо, что бы в Redmine создавались задачи когда проверка сайта переходит в состояние 'Down'.
Для Redmine есть модуль Python, который предоставляет доступ к API. Ниже скрипт который добавляет задания в Redmine:
Описывать работу с redmine-python не имеет смысла, у него есть хорошая документация. Расскажу лишь вкратце, что делает скрипт.
Он проверяет по названию есть ли уже открытые задания с таким же именем, если нет то он создает новое, а если есть то добавляет комментарий к этому заданию.
Ну вот и все, теперь при недоступности сайта у нас создаются автоматом задачи в Redmine.
Есть такая система онлайн мониторинга StatusCake. Она позволяет строить достаточно сложные проверки для сайтов, проверяет их доступность, скорость доступа, строит разные красивые графики.
Но нас интересует не этот функционал, как любая система мониторинга она имеет механизм оповещения о проблемах. Способы оповещения достаточно разнообразны. Есть интеграция с разными сервисами, в частности с twitter (зачем??? что бы публиковать когда падает сервер). Но вот интеграции с Redmine там нет. Но зато есть возможность использовать webhook. Чем мы и воспользовались. Ниже под катом, что у нас получилось.
Для начала, на одном из серверов, где у нас расположена система мониторинга был расположен простенький php-скрипт, который вызывался каждый раз при изменение состояние сервера в StatusCake. Данному скрипту передается json, который в общем виде содержит:
<code>
[URL] =>
[Token] =>
[Name] =>
[StatusCode] =>
[Status] =>
</code>
- URL — это url по которому происходит проверка.
- Token — это хэш имени пользователя и API ключа, используется для проверки.
- Name — это название теста в statuscake который изменил свое состояние.
- StatusCode — код который вернул сайт при обращение к указанному URL.
- Status — это состояние хоста, может быть 'UP' и 'DOWN'.
Скрипт выполняет всего две функции получает данные и вызывает скрипт на python, которому передает полученные значения. Сам скрипт:
<?php
$SITE_URL = print_r($_POST['URL'], true);
$TRIGGER_NAME = print_r($_POST['Name'], true);
$STATUS = print_r($_POST['Status'], true);
$result = exec(" python stcake.py $SITE_URL $TRIGGER_NAME $STATUS ");
?>
Так пол дела сделано, данные мы уже получаем. Теперь надо, что бы в Redmine создавались задачи когда проверка сайта переходит в состояние 'Down'.
Для Redmine есть модуль Python, который предоставляет доступ к API. Ниже скрипт который добавляет задания в Redmine:
import sys, time
from redmine import Redmine
import datetime
PROJECT_NAME = 'Project name'
SITE_NAME = sys.argv[1]
TRIGGER_STATUS = sys.argv[3]
TRIGGER_NAME = sys.argv[2]
REDMINE_URL = 'URL'
REDMINE_KEY = 'API key'
ADMINS_ID = 76
priority = 4
redmine = Redmine(REDMINE_URL, key=REDMINE_KEY)
subject_name = 'Attention!!! Status Cake test: ' + TRIGGER_NAME + '. Site: ' + SITE_NAME + ' is DOWN'
issueExist = redmine.issue.filter(
project_id = 'Project name',
subject = subject_name
)
now_time = datetime.datetime.now()
print issueExist
print now_time
print SITE_NAME
print TRIGGER_NAME
#print TRIGGER_STATUS +": "+ TRIGGER_NAME + "\n" + ITEM_VALUE
if issueExist:
print "Issue already exist. Create comment"
issue = redmine.issue.update(
issueExist[0].id,
notes = now_time.strftime("%d.%m.%Y %I:%M %p") + ' Site: ' + SITE_NAME + ' Status: ' + TRIGGER_STATUS
)
else:
print "Issue not exist. Create issue"
issue = redmine.issue.create(
project_id = 'Project name',
subject = subject_name,
tracker_id = 3,
description = now_time.strftime("%d.%m.%Y %I:%M %p") + ' Site: ' + SITE_NAME + ' Status: ' + TRIGGER_STATUS,
status_id = 1,
priority_id = priority,
assigned_to_id =
)
Описывать работу с redmine-python не имеет смысла, у него есть хорошая документация. Расскажу лишь вкратце, что делает скрипт.
Он проверяет по названию есть ли уже открытые задания с таким же именем, если нет то он создает новое, а если есть то добавляет комментарий к этому заданию.
Ну вот и все, теперь при недоступности сайта у нас создаются автоматом задачи в Redmine.
WorksIsGone
php->python->ruby? O_o