kurchatov 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +111 -0
- data/Rakefile +1 -0
- data/Vagrantfile +16 -0
- data/bin/kurchatov +6 -0
- data/examples/check_file_contains.rb +14 -0
- data/examples/count_proc.rb +14 -0
- data/examples/cpu.rb +29 -0
- data/examples/disk.rb +56 -0
- data/examples/disk_stat.rb +28 -0
- data/examples/dns_check.rb +5 -0
- data/examples/exim.rb +12 -0
- data/examples/file_age.rb +11 -0
- data/examples/find_files.rb +21 -0
- data/examples/http.rb +25 -0
- data/examples/iptables.rb +27 -0
- data/examples/la.rb +10 -0
- data/examples/mdadm.rb +43 -0
- data/examples/megacli.rb +12 -0
- data/examples/memory.rb +28 -0
- data/examples/net.rb +25 -0
- data/examples/net_stat.rb +25 -0
- data/examples/nfs.rb +9 -0
- data/examples/nginx.rb +22 -0
- data/examples/nginx_500.rb +48 -0
- data/examples/ntp.rb +15 -0
- data/examples/openfiles.rb +6 -0
- data/examples/pgsql.rb +67 -0
- data/examples/ping_icmp.rb +12 -0
- data/examples/ping_tcp.rb +14 -0
- data/examples/proc_mem.rb +24 -0
- data/examples/process_usage.rb +15 -0
- data/examples/rabbitmq.rb +16 -0
- data/examples/runit.rb +47 -0
- data/examples/sidekiq.rb +21 -0
- data/examples/sidekiq_queue_state.rb +9 -0
- data/examples/status_file.rb +14 -0
- data/examples/tw_cli.rb +17 -0
- data/examples/uptime.rb +14 -0
- data/kurchatov.gemspec +28 -0
- data/lib/kurchatov/application.rb +154 -0
- data/lib/kurchatov/config.rb +14 -0
- data/lib/kurchatov/log.rb +9 -0
- data/lib/kurchatov/mashie.rb +152 -0
- data/lib/kurchatov/mixin/command.rb +31 -0
- data/lib/kurchatov/mixin/event.rb +63 -0
- data/lib/kurchatov/mixin/http.rb +21 -0
- data/lib/kurchatov/mixin/init.rb +6 -0
- data/lib/kurchatov/mixin/ohai.rb +22 -0
- data/lib/kurchatov/mixin/queue.rb +14 -0
- data/lib/kurchatov/monitor.rb +62 -0
- data/lib/kurchatov/plugin/config.rb +68 -0
- data/lib/kurchatov/plugin/dsl.rb +81 -0
- data/lib/kurchatov/plugin/riemann.rb +54 -0
- data/lib/kurchatov/plugin.rb +15 -0
- data/lib/kurchatov/queue.rb +28 -0
- data/lib/kurchatov/responders/http.rb +36 -0
- data/lib/kurchatov/responders/init.rb +3 -0
- data/lib/kurchatov/responders/riemann.rb +46 -0
- data/lib/kurchatov/responders/udp.rb +32 -0
- data/lib/kurchatov/riemann/client.rb +49 -0
- data/lib/kurchatov/riemann/event.rb +42 -0
- data/lib/kurchatov/riemann/message.rb +18 -0
- data/lib/kurchatov/version.rb +3 -0
- data/lib/kurchatov.rb +3 -0
- data/lib/ohai/plugins/darwin/hostname.rb +22 -0
- data/lib/ohai/plugins/darwin/platform.rb +38 -0
- data/lib/ohai/plugins/hostname.rb +27 -0
- data/lib/ohai/plugins/linux/hostname.rb +26 -0
- data/lib/ohai/plugins/linux/platform.rb +113 -0
- data/lib/ohai/plugins/linux/virtualization.rb +125 -0
- data/lib/ohai/plugins/os.rb +53 -0
- data/lib/ohai/plugins/platform.rb +28 -0
- data/lib/ohai/plugins/virtualization.rb +86 -0
- data/lib/ohai/plugins/windows/hostname.rb +33 -0
- data/lib/ohai/plugins/windows/platform.rb +27 -0
- data/tests/run.sh +55 -0
- metadata +209 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'file-tail'
|
2
|
+
|
3
|
+
interval 60
|
4
|
+
warning 10
|
5
|
+
critical 60
|
6
|
+
default[:check_interval] = 300
|
7
|
+
default[:check_last_lines] = 300
|
8
|
+
default[:file] = '/var/log/nginx/app-500.log'
|
9
|
+
default[:nginx_time_local] = "[^\\x20]+\\x20\\+\\d{4}\\]"
|
10
|
+
|
11
|
+
collect do
|
12
|
+
|
13
|
+
def get_unix_time_from_line(text)
|
14
|
+
match = text.match(plugin.nginx_time_local)
|
15
|
+
return nil unless match
|
16
|
+
time = parse_local_time(match[0]) rescue nil
|
17
|
+
time
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_local_time(token)
|
21
|
+
day, month, year, hour, minute, second, _ = token.split(/[\/: ]/) # работаем с local_time
|
22
|
+
Time.local(year, month, day.gsub('[', ''), hour, minute, second).to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
count_all = 0
|
26
|
+
count_interval = 0
|
27
|
+
file = File::Tail::Logfile.new(plugin.file)
|
28
|
+
file.backward(plugin.check_last_lines)
|
29
|
+
file.readlines.each do |line|
|
30
|
+
line.force_encoding("UTF-8")
|
31
|
+
next unless line.valid_encoding?
|
32
|
+
time = get_unix_time_from_line(line)
|
33
|
+
count_interval += 1 if time > (unixnow - plugin.interval)
|
34
|
+
count_all += 1 if time > (unixnow - plugin.check_interval)
|
35
|
+
end
|
36
|
+
|
37
|
+
event(
|
38
|
+
:service => "nginx log parse #{plugin.file} interval errors",
|
39
|
+
:metric => count_all,
|
40
|
+
:desc => "Count errors in file #{plugin.file}, last #{plugin.check_interval} sec"
|
41
|
+
)
|
42
|
+
event(
|
43
|
+
:service => "nginx log parse #{plugin.file} realtime errors",
|
44
|
+
:metric => count_interval,
|
45
|
+
:state => 'ok',
|
46
|
+
:desc => "Count errors in file #{plugin.file}, last #{plugin.interval} sec"
|
47
|
+
)
|
48
|
+
end
|
data/examples/ntp.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'net/ntp'
|
2
|
+
|
3
|
+
interval 60
|
4
|
+
default[:host] = 'pool.ntp.org'
|
5
|
+
default[:timeout] = 30
|
6
|
+
|
7
|
+
collect do
|
8
|
+
event(
|
9
|
+
:service => "ntp #{plugin.host}",
|
10
|
+
:desc => "Ntp lag with host #{plugin.host}",
|
11
|
+
:metric => (::Net::NTP.get(plugin.host, 'ntp', plugin.timeout).time.to_f - Time.now.to_f).abs,
|
12
|
+
:critical => 0.5,
|
13
|
+
:warning => 0.1
|
14
|
+
)
|
15
|
+
end
|
data/examples/pgsql.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
default[:host] = '127.0.0.1'
|
2
|
+
default[:user] = 'postgres'
|
3
|
+
default[:pgsql] = '/usr/bin/psql'
|
4
|
+
default[:db4monit] = 'riemann_monit'
|
5
|
+
default[:conn_warn] = 5 # reserved pool connections
|
6
|
+
default[:conn_crit] = 3 # reserved pool connections
|
7
|
+
|
8
|
+
run_if do
|
9
|
+
File.exists? plugin.pgsql
|
10
|
+
end
|
11
|
+
|
12
|
+
collect do
|
13
|
+
|
14
|
+
# helpers
|
15
|
+
def run_sql(sql, db='postgres')
|
16
|
+
shell_out!("#{plugin.psql} -h #{plugin.host} -U #{plugin.user} -tnc \"#{sql}\" #{db}").stdout
|
17
|
+
end
|
18
|
+
|
19
|
+
def in_recovery?
|
20
|
+
run_sql('select pg_is_in_recovery()') == 't'
|
21
|
+
end
|
22
|
+
|
23
|
+
def db4monit_exists?
|
24
|
+
run_sql("select 1 from pg_database where datname = '#{plugin.db4monit}'") == '1'
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_master_sql
|
28
|
+
run_sql("create database #{plugin.db4monit}") unless db4monit_exists?
|
29
|
+
run_sql(
|
30
|
+
"drop table if exists timestamp; \
|
31
|
+
create table timestamp ( id int primary key, value timestamp default now() ); \
|
32
|
+
insert into timestamp (id) values (1); \
|
33
|
+
", plugin.db4monit)
|
34
|
+
end
|
35
|
+
|
36
|
+
def repl_lag
|
37
|
+
unixnow - run_sql("select extract(epoch from value::timestamp) from timestamp where id = 1;", plugin.db4monit).to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
def connections
|
41
|
+
max_conn = run_sql('show max_connections').to_i
|
42
|
+
res_conn = run_sql('show superuser_reserved_connections').to_i
|
43
|
+
cur_conn = run_sql('select count(1) from pg_stat_activity;').to_i
|
44
|
+
[cur_conn, (max_conn - res_conn - cur_conn)]
|
45
|
+
end
|
46
|
+
|
47
|
+
# check status
|
48
|
+
|
49
|
+
cur_conn, res_conn = connections
|
50
|
+
if in_recovery?
|
51
|
+
event(:service => 'pgsql replication lag', :desc => 'Postgresql replication lag', :metric => repl_lag, :warning => 120, :critical => 500)
|
52
|
+
else
|
53
|
+
run_master_sql
|
54
|
+
end
|
55
|
+
|
56
|
+
event(:service => 'pgsql connections', :desc => 'Postgresql current connections', :state => 'ok', :metric => cur_conn)
|
57
|
+
|
58
|
+
# check reserved pool size
|
59
|
+
if res_conn < plugin.conn_warn
|
60
|
+
if res_conn > plugin.conn_crit
|
61
|
+
event(:service => 'pgsql reserved connections', :desc => 'Postgresql reserved connections state', :state => 'warning', :metric => res_conn)
|
62
|
+
else
|
63
|
+
event(:service => 'pgsql reserved connections', :desc => 'Postgresql reserved connections state', :state => 'critical', :metric => res_conn)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'net/ping'
|
2
|
+
|
3
|
+
default[:host] = "localhost"
|
4
|
+
default[:port] = 22
|
5
|
+
default[:timeout] = 5
|
6
|
+
|
7
|
+
collect do
|
8
|
+
::Net::Ping::TCP.econnrefused = true
|
9
|
+
event(
|
10
|
+
:service => "ping tcp #{plugin.host}:#{plugin.port}",
|
11
|
+
:state => ::Net::Ping::TCP.new(plugin.host, plugin.port, plugin.timeout).ping,
|
12
|
+
:description => "Ping tcp #{plugin.host}:#{plugin.port}"
|
13
|
+
)
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'sys/proctable'
|
2
|
+
|
3
|
+
default[:pidfile] = '/var/run/service.pid'
|
4
|
+
|
5
|
+
collect do
|
6
|
+
|
7
|
+
@pagesize ||= shell('/usr/bin/getconf PAGESIZE').to_i
|
8
|
+
master_pid = File.read(plugin.pidfile).to_i
|
9
|
+
mem_total = 0
|
10
|
+
::Sys::ProcTable.ps do |p|
|
11
|
+
next unless p.pid == master_pid || p.ppid == master_pid
|
12
|
+
mem_total += (p.rss * @pagesize).to_f / 1024
|
13
|
+
end
|
14
|
+
|
15
|
+
event(
|
16
|
+
:diff => true,
|
17
|
+
:description => "RSS usage delta #{plugin.pidfile}",
|
18
|
+
:metric => mem_total,
|
19
|
+
:service => "procmem #{plugin.pidfile}",
|
20
|
+
:warning => 30*1024, #kibibytes
|
21
|
+
:critical => 90*1024
|
22
|
+
) if File.stat(plugin.pidfile).mtime > interval
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
interval 60
|
2
|
+
|
3
|
+
default[:pid_file] = '/etc/service/name/supervise/pid'
|
4
|
+
|
5
|
+
collect do
|
6
|
+
if File.exists? plugin.pid_file
|
7
|
+
pid = File.read(plugin.pid_file).chomp
|
8
|
+
cpu_usage = shell("ps -p #{pid} S -o pcpu h").to_i
|
9
|
+
mem_usage = shell("ps -p #{pid} S -o rss h").to_i
|
10
|
+
event(:service => "process pid cpu #{plugin.pid_file}", :metric => cpu_usage, :description => "Cpu usage for process pid: #{plugin.pid_file}", :warning => 70, :critical => 90)
|
11
|
+
event(:service => "process pid mem #{plugin.pid_file}", :metric => mem_usage.to_f / 1024, :description => "Mem (Mb) usage for process pid: #{plugin.pid_file}", :state => 'ok')
|
12
|
+
else
|
13
|
+
event(:service => "process pid #{plugin.pid_file}", :state => 'critical', :description => "File #{plugin.pid_file} not found")
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
default[:api_url] = 'http://admin:admin@127.0.0.1:55672/api'
|
2
|
+
default[:vhost] = ['notexists']
|
3
|
+
|
4
|
+
collect do
|
5
|
+
plugin.vhosts.each do |vhost|
|
6
|
+
vhost_uri = "#{plugin.api_url}/queues/#{CGI.escape(vhost)}"
|
7
|
+
JSON.parse(rest_get(vhost_uri)).each do |queue|
|
8
|
+
event(
|
9
|
+
:service => "rabbitmq queue #{queue['name'].gsub('.', '_')} messages count",
|
10
|
+
:metric => queue['messages'].to_i,
|
11
|
+
:desc => "Rabbitmq queue count in #{queue['name']}",
|
12
|
+
:critical => 1000
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/examples/runit.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
always_start true
|
2
|
+
|
3
|
+
run_if do
|
4
|
+
Dir.exists? '/etc/service'
|
5
|
+
end
|
6
|
+
|
7
|
+
collect do
|
8
|
+
|
9
|
+
@status_history ||= Array.new
|
10
|
+
|
11
|
+
def uptime(service)
|
12
|
+
pid_file = File.join(service, 'supervise', 'pid')
|
13
|
+
return 0 unless File.exist?(pid_file)
|
14
|
+
unixnow - File.mtime(pid_file).to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
def runned?(service)
|
18
|
+
stat_file = File.join(service, 'supervise', 'stat')
|
19
|
+
return false unless File.exists?(stat_file)
|
20
|
+
File.read(stat_file).strip == 'run'
|
21
|
+
end
|
22
|
+
|
23
|
+
def human_srv(service)
|
24
|
+
service.gsub(/\/etc\/service\//, '')
|
25
|
+
end
|
26
|
+
|
27
|
+
Dir.glob('/etc/service/*').each do |srv|
|
28
|
+
srv_uptime = uptime(srv)
|
29
|
+
srv_runned = runned?(srv)
|
30
|
+
srv_name = human_srv(srv)
|
31
|
+
|
32
|
+
# сервис запущен и работает дольше чем мы приходили к нему в прошлый раз
|
33
|
+
if srv_runned && srv_uptime > interval
|
34
|
+
@status_history.delete(srv_name)
|
35
|
+
event(:service => "runit #{srv_name}", :state => 'ok', :description => "runit service #{srv_name} running")
|
36
|
+
else
|
37
|
+
# сервис запущен но работает подозрительно мало, но последний раз замечен не был
|
38
|
+
if srv_uptime < interval && srv_runned && !@status_history.include?(srv_name)
|
39
|
+
@status_history << srv_name
|
40
|
+
else
|
41
|
+
# во всех остальных случаях сообщаем о проблеме
|
42
|
+
event(:service => "runit #{srv_name}", :state => 'critical', :description => "runit service #{srv_name} not running", :metric => srv_uptime)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/examples/sidekiq.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
default[:url] = 'http://localhost/admin/sidekiq/dashboard/stats'
|
2
|
+
|
3
|
+
collect do
|
4
|
+
stats = JSON.parse(rest_get(plugin.url))
|
5
|
+
stats = stats["sidekiq"] ? stats["sidekiq"] : stats
|
6
|
+
event(
|
7
|
+
:service => "#{name} #{plugin.url}",
|
8
|
+
:metric => stats["enqueued"].to_i,
|
9
|
+
:description => "sidekiq queue from #{plugin.url}",
|
10
|
+
:warning => 10,
|
11
|
+
:critical => 60
|
12
|
+
)
|
13
|
+
event(
|
14
|
+
:service => "#{name} #{plugin.url}",
|
15
|
+
:metric => stats["failed"].to_i,
|
16
|
+
:diff => true,
|
17
|
+
:description => "sidekiq failed from #{plugin.url}",
|
18
|
+
:warning => 10,
|
19
|
+
:critical => 60
|
20
|
+
)
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
default[:file] = '/var/tmp/error.txt'
|
2
|
+
default[:max_lines] = 100
|
3
|
+
default[:report_lines] = 5
|
4
|
+
default[:service] = 'check state file'
|
5
|
+
|
6
|
+
collect do
|
7
|
+
content = File.read(plugin.file).split("\n").delete_if { |x| x.strip.empty? }
|
8
|
+
event(
|
9
|
+
:service => "#{plugin.service} #{plugin.file}",
|
10
|
+
:description => content.last(plugin.report_lines).join("\n"),
|
11
|
+
:metric => content.count,
|
12
|
+
:critical => 1
|
13
|
+
)
|
14
|
+
end
|
data/examples/tw_cli.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
interval 180
|
2
|
+
always_start true
|
3
|
+
|
4
|
+
default[:cmd] = "/usr/sbin/tw_cli show | awk '/^c/{print $1}' | xargs -rI{} /usr/sbin/tw_cli /{} show | awk '/^[upb]/&&!/[ \t](OK|VERIFYING|VERIFY-PAUSED)/' |wc -l"
|
5
|
+
|
6
|
+
run_if do
|
7
|
+
File.exists? '/usr/sbin/tw_cli'
|
8
|
+
end
|
9
|
+
|
10
|
+
collect do
|
11
|
+
event(
|
12
|
+
:service => 'twcli',
|
13
|
+
:metric => shell(plugin.cmd).to_i,
|
14
|
+
:description => 'Hardware raid tw_cli status',
|
15
|
+
:critical => 1
|
16
|
+
)
|
17
|
+
end
|
data/examples/uptime.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
interval 60
|
2
|
+
always_start true
|
3
|
+
|
4
|
+
collect :os => "linux" do
|
5
|
+
event(
|
6
|
+
:metric => File.read('/proc/uptime').split(' ').first.to_f
|
7
|
+
)
|
8
|
+
end
|
9
|
+
|
10
|
+
collect :os => "darwin" do
|
11
|
+
event(
|
12
|
+
:metric => shell('uptime | cut -d":" -f4- | sed s/,//g').to_f
|
13
|
+
)
|
14
|
+
end
|
data/kurchatov.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'kurchatov/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "kurchatov"
|
8
|
+
spec.version = Kurchatov::VERSION
|
9
|
+
spec.authors = ["Vasiliev Dmitry"]
|
10
|
+
spec.email = ["vadv.mkn@gmail.com"]
|
11
|
+
spec.summary = %q{Gem for monitoring with riemann.}
|
12
|
+
spec.description = %q{Gem for monitoring with riemann.}
|
13
|
+
spec.homepage = "https://github.com/vadv/kurchatov"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "beefcake", ">= 0.3.5"
|
22
|
+
spec.add_dependency "ohai", ">= 6.20.0"
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
25
|
+
spec.add_development_dependency "rake"
|
26
|
+
spec.add_development_dependency "pry"
|
27
|
+
spec.add_development_dependency "ruby-prof"
|
28
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "mixlib/cli"
|
4
|
+
require "kurchatov/version"
|
5
|
+
require "kurchatov/config"
|
6
|
+
require "kurchatov/mixin/init"
|
7
|
+
require "kurchatov/log"
|
8
|
+
require "kurchatov/plugin/config"
|
9
|
+
require "kurchatov/monitor"
|
10
|
+
require "kurchatov/responders/init"
|
11
|
+
|
12
|
+
module Kurchatov
|
13
|
+
class Aplication
|
14
|
+
include Mixlib::CLI
|
15
|
+
include Kurchatov::Mixin::Ohai
|
16
|
+
|
17
|
+
option :help,
|
18
|
+
:short => "-h",
|
19
|
+
:long => "--help",
|
20
|
+
:description => "Show this message",
|
21
|
+
:on => :tail,
|
22
|
+
:boolean => true,
|
23
|
+
:show_options => true,
|
24
|
+
:exit => 1
|
25
|
+
|
26
|
+
option :version,
|
27
|
+
:short => "-v",
|
28
|
+
:long => "--version",
|
29
|
+
:description => "Show version",
|
30
|
+
:boolean => true,
|
31
|
+
:proc => lambda {|v| puts "Kurchatov: #{Kurchatov::VERSION}"},
|
32
|
+
:exit => 0
|
33
|
+
|
34
|
+
option :log_level,
|
35
|
+
:short => "-l LEVEL",
|
36
|
+
:long => "--log_level LEVEL",
|
37
|
+
:description => "Set the log level (debug, info, warn, error, fatal)",
|
38
|
+
:proc => lambda {|l| l.to_sym}
|
39
|
+
|
40
|
+
option :log_location,
|
41
|
+
:short => "-L LOGLOCATION",
|
42
|
+
:long => "--logfile LOGLOCATION",
|
43
|
+
:description => "Set the log file location"
|
44
|
+
|
45
|
+
option :test_plugin,
|
46
|
+
:short => "-T FILE",
|
47
|
+
:long => "--test-plugin FILE",
|
48
|
+
:description => "Test plugin"
|
49
|
+
|
50
|
+
option :config_file,
|
51
|
+
:short => "-c FILE",
|
52
|
+
:long => "--config FILE",
|
53
|
+
:description => "Config file"
|
54
|
+
|
55
|
+
option :plugin_paths,
|
56
|
+
:short => "-d DIR1,DIR2",
|
57
|
+
:long => "--plugins DIR1,DIR2",
|
58
|
+
:description => "Plugin directories",
|
59
|
+
:proc => lambda {|l| l.split(',') }
|
60
|
+
|
61
|
+
option :ohai_plugins_paths,
|
62
|
+
:short => "-o DIR1,DIR2",
|
63
|
+
:long => "--ohai--plugins DIR1,DIR2",
|
64
|
+
:description => "Plugin directories",
|
65
|
+
:proc => lambda {|l| l.split(',') }
|
66
|
+
|
67
|
+
option :host,
|
68
|
+
:long => "--host HOSTNAME",
|
69
|
+
:description => "Set hostname for events",
|
70
|
+
:proc => lambda {|l| l.split(',') }
|
71
|
+
|
72
|
+
option :tags,
|
73
|
+
:short => "-t tag1,tag2,tag3",
|
74
|
+
:long => "--tags tag1,tag2,tag3",
|
75
|
+
:description => "Set tags for events",
|
76
|
+
:proc => lambda {|l| l.split(',') }
|
77
|
+
|
78
|
+
option :riemann_responder,
|
79
|
+
:short => "-H HOST1,HOST2:55655",
|
80
|
+
:long => "--hosts HOST1,HOST2:55655",
|
81
|
+
:description => "Set riemann hosts for send events",
|
82
|
+
:proc => lambda {|l| l.split(',') }
|
83
|
+
|
84
|
+
option :http_responder,
|
85
|
+
:long => "--http 0.0.0.0:55755",
|
86
|
+
:description => "Set http responder for information"
|
87
|
+
|
88
|
+
option :udp_responder,
|
89
|
+
:long => "--udp 0.0.0.0:55955",
|
90
|
+
:description => "Set udp responder for information"
|
91
|
+
|
92
|
+
option :stop_on_error,
|
93
|
+
:long => "--stop-on-error",
|
94
|
+
:description => "Stop on plugin or connection problem",
|
95
|
+
:boolean => true,
|
96
|
+
:proc => lambda {|l| !!l }
|
97
|
+
|
98
|
+
def configure_opts
|
99
|
+
@attributes = parse_options
|
100
|
+
@attributes = nil if @attributes.empty?
|
101
|
+
Config.merge!(config)
|
102
|
+
end
|
103
|
+
|
104
|
+
def configure_logging
|
105
|
+
Log.init(Config[:log_location])
|
106
|
+
Log.level = Config[:log_level]
|
107
|
+
end
|
108
|
+
|
109
|
+
def configure_defaults
|
110
|
+
::Ohai::Config[:plugin_path] = [ File.expand_path(File.join('..', 'ohai', 'plugins'), File.dirname(__FILE__)) ]
|
111
|
+
if Config[:ohai_plugins_paths]
|
112
|
+
::Ohai::Config[:plugin_path] += Config[:ohai_plugins_paths]
|
113
|
+
end
|
114
|
+
Config[:host] ||= ohai[:fqdn] || ohai[:hostname]
|
115
|
+
end
|
116
|
+
|
117
|
+
def configure_responders
|
118
|
+
return if Config[:test_plugin]
|
119
|
+
Log.error("Please set riemann host") and exit Config[:ERROR_CONFIG] unless
|
120
|
+
Config[:riemann_responder]
|
121
|
+
if Config[:udp_responder]
|
122
|
+
@monitor << Responders::Udp.new( Config[:udp_responder] )
|
123
|
+
end
|
124
|
+
if Config[:http_responder]
|
125
|
+
@monitor << Responders::Http.new( Config[:http_responder] )
|
126
|
+
end
|
127
|
+
@monitor << Responders::Riemann.new( Config[:riemann_responder] )
|
128
|
+
end
|
129
|
+
|
130
|
+
def configure_plugins
|
131
|
+
return if Config[:test_plugin]
|
132
|
+
plugins = Kurchatov::Plugins::Config.load_plugins(Config[:plugin_paths],
|
133
|
+
Config[:config_file])
|
134
|
+
plugins.each {|p| @monitor << p }
|
135
|
+
end
|
136
|
+
|
137
|
+
def configure_test_plugin
|
138
|
+
return if !Config[:test_plugin]
|
139
|
+
@monitor << Kurchatov::Plugins::DSL.load_riemann_plugin(Config[:test_plugin])
|
140
|
+
end
|
141
|
+
|
142
|
+
def run
|
143
|
+
configure_opts
|
144
|
+
configure_logging
|
145
|
+
configure_defaults
|
146
|
+
@monitor = Monitor.new(Config[:stop_on_error] || !!Config[:test_plugin])
|
147
|
+
configure_responders
|
148
|
+
configure_plugins
|
149
|
+
configure_test_plugin
|
150
|
+
@monitor.run
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "mixlib/config"
|
2
|
+
|
3
|
+
module Kurchatov
|
4
|
+
class Config
|
5
|
+
extend Mixlib::Config
|
6
|
+
default :log_level, :info
|
7
|
+
default :log_location, STDERR
|
8
|
+
default :plugin_paths, ['/usr/share/kurchatov/plugins']
|
9
|
+
default :config_file, '/etc/kurchatov/config.yml'
|
10
|
+
# errors
|
11
|
+
default :ERROR_CONFIG, 2
|
12
|
+
default :ERROR_PLUGIN_REQ, 3
|
13
|
+
end
|
14
|
+
end
|