Pull to refresh
70.46
Слёрм
Учебный центр для тех, кто работает в IT

Короткие заметки: связка Redmine + StatusCake

Reading time 3 min
Views 6.9K
У нас используется система управления проектами и задачами Redmine . На нее у нас завязан и Zabbix и другие системы мониторинга. И вот как то появилась идея интегрировать ее со StatusCake для удобства контроля всех задач в одной системе.

Есть такая система онлайн мониторинга 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.

Автор: Magvai69
Tags:
Hubs:
+6
Comments 2
Comments Comments 2

Articles

Information

Website
slurm.io
Registered
Founded
Employees
51–100 employees
Location
Россия
Representative
Антон Скобин