
Kurchatov
Перед вами гем для мониторинга с помощью riemann.
Я люблю chef и ohai,
поэтому здесь есть немного первого и немного второго.
Юзкейз таков:
- Kurchatov попадает в среду (окружение, приложения) которую не знает, и изучает ее с помощью ohai
- Решает какие плагины запускать
- Отсылает сообщения на riemann-хост со присвоеными статусами
DSL
Решено использовать dsl для написания плагинов, плагин выглядит так:
name "человеко читаемое имя"
interval 60
always_start true
default[:nginx][:file] = "/etc/nginx/nginx.conf"
default[:nginx][:cmd] = "nginx -t"
default[:nginx][:url] = "http://127.0.0.1:133233/status"
run_if :os => 'linux' do
File.exists? plugin.file
end
collect :web_some_platform => true, :os => 'linux' do
metric = rest_get(default[:nginx][:url]).split("\n").first.split("Active connections:").last.to_i
event(
:service => "nginx active connections",
:metric => metric,
:warning => 10,
:critical => 20,
:diff => true,
:description => "Что-то для человека-монитора"
)
event(
:service => "nginx test config #{plugin.file}",
:state => shell_out("#{ohai[:nginx][:cmd]}").exitstatus == 0
:desc => "Ой, конфиг не валидный, наверно nginx -t его испортил :("
)
end
Если плагин отправил event, это не означает что он попадает на riemann-server:
- Эвенты группируются и отсылаются асинхронно пачками (все что накопилось за
Kurchatov::Responders::Riemann::FLUSH_INTERVAL
по дефолту 0.5 секунд)
- При отсутвии метрики второй и последующий раз
:state == "ok"
не будет отсылаться
Helpers
- stop! - останавливает запущенный плагин
- rest_get("http://user:password@host/uri") - body
- rest_get("/tmp/file") - body
- http_get("http://ya.ru") - body и http_code. если http_code == 0 - возвращает на SocketError
- runit_service_stat("service_name") - service status. unknown если неизвестный сервис
- runit_service_running?("service_name") - true если сервис запущен
- runit_service_uptime("service_name") - аптайм сервиса, -1 в случае ошибки
Больше примеров вы найдете тут.
Ohai
И в африке ohai. Минимальный пример:
provides "postgres"
postgres Mash.new
cmd = "psql -U postgres -tqc 'select version()'"
status, stdout, stderr = run_command(:command => cmd)
postgres[:version] = stdout.strip
Config
Это обычный yml-файл с настройками плагинов, eго удобно генерить chef'ом :)
plugin name:
settings name:
- 'bla-bla'
Есть небольшая магия, для того чтобы использовать плагин как провайдер (например следить за определенными портами):
web watcher:
- url: http://localhost/
status: 302
- url: https://localhost/login
status: 200
ua: Mozilla
robots txt watcher:
parent: web watcher
url: https://localhost/robots.txt
status: 404
ua: ^Yandex
Почему велосипед
Удобно писать плагины, использовать 1 процесс, 1 коннект, и проч.
Посмотрите официальную реализацию riemann-client,
По сравнению с ней вы тут не найдете search и udp.