hq-log-monitor-server 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/features/submit-event.feature +10 -0
- data/features/support/env.rb +8 -0
- data/features/support/steps.rb +12 -0
- data/lib/hq/log-monitor-server/script.rb +132 -1
- metadata +2 -2
@@ -8,6 +8,12 @@ Feature: Log monitor server submit event via HTTP
|
|
8
8
|
<log-monitor-server-config>
|
9
9
|
<server port="${port}"/>
|
10
10
|
<db host="${db-host}" port="${db-port}" name="${db-name}"/>
|
11
|
+
<icinga command-file="${command-file}">
|
12
|
+
<service name="service" icinga-host="host" icinga-service="service">
|
13
|
+
<type name="warning" level="warning"/>
|
14
|
+
<type name="critical" level="critical"/>
|
15
|
+
</service>
|
16
|
+
</icinga>
|
11
17
|
</log-monitor-server-config>
|
12
18
|
"""
|
13
19
|
|
@@ -39,3 +45,7 @@ Feature: Log monitor server submit event via HTTP
|
|
39
45
|
},
|
40
46
|
}
|
41
47
|
"""
|
48
|
+
And icinga should receive:
|
49
|
+
"""
|
50
|
+
PROCESS_SERVICE_CHECK_RESULT;host;service;1;WARNING 1 warning
|
51
|
+
"""
|
data/features/support/env.rb
CHANGED
data/features/support/steps.rb
CHANGED
@@ -14,6 +14,7 @@ Given /^the log monitor server config:$/ do
|
|
14
14
|
config_string.gsub! "${db-host}", "localhost"
|
15
15
|
config_string.gsub! "${db-port}", "27017"
|
16
16
|
config_string.gsub! "${db-name}", mongo_db_name("logMonitorServer")
|
17
|
+
config_string.gsub! "${command-file}", @command_file.path
|
17
18
|
|
18
19
|
@log_monitor_server_config.write config_string
|
19
20
|
@log_monitor_server_config.flush
|
@@ -137,3 +138,14 @@ Then /^the (\d+(?:st|nd|rd|th)) summary should be:$/ do
|
|
137
138
|
end
|
138
139
|
|
139
140
|
end
|
141
|
+
|
142
|
+
Then /^icinga should receive:$/ do
|
143
|
+
|expected_command|
|
144
|
+
|
145
|
+
command_contents =
|
146
|
+
File.new(@command_file).to_a.map { |line| line.strip }
|
147
|
+
|
148
|
+
command_contents.should \
|
149
|
+
include expected_command
|
150
|
+
|
151
|
+
end
|
@@ -18,6 +18,7 @@ class Script
|
|
18
18
|
|
19
19
|
def initialize
|
20
20
|
@status = 0
|
21
|
+
@mutex = Mutex.new
|
21
22
|
end
|
22
23
|
|
23
24
|
def main
|
@@ -25,12 +26,14 @@ class Script
|
|
25
26
|
trap "INT" do
|
26
27
|
@web_server.shutdown
|
27
28
|
end
|
29
|
+
Thread.new { background }
|
28
30
|
run
|
29
31
|
end
|
30
32
|
|
31
33
|
def start
|
32
34
|
setup
|
33
35
|
Thread.new { run }
|
36
|
+
Thread.new { background }
|
34
37
|
end
|
35
38
|
|
36
39
|
def stop
|
@@ -48,6 +51,118 @@ class Script
|
|
48
51
|
@web_server.start
|
49
52
|
end
|
50
53
|
|
54
|
+
def background
|
55
|
+
|
56
|
+
@next_check = Time.now
|
57
|
+
|
58
|
+
loop do
|
59
|
+
sleep 1 while Time.now < @next_check
|
60
|
+
do_checks
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def do_checks
|
66
|
+
@mutex.synchronize do
|
67
|
+
|
68
|
+
File.open @icinga_elem["command-file"], "a" do
|
69
|
+
|command_io|
|
70
|
+
|
71
|
+
summaries_by_service =
|
72
|
+
get_summaries_by_service
|
73
|
+
|
74
|
+
@icinga_elem.find("service").each do
|
75
|
+
|service_elem|
|
76
|
+
|
77
|
+
critical_count = 0
|
78
|
+
warning_count = 0
|
79
|
+
unknown_count = 0
|
80
|
+
|
81
|
+
summaries_by_service[service_elem["name"]]["types"].each do
|
82
|
+
|type_name, type_info|
|
83
|
+
|
84
|
+
type_elem =
|
85
|
+
service_elem.find_first("
|
86
|
+
type [@name = #{esc_xp type_name}]
|
87
|
+
")
|
88
|
+
|
89
|
+
if ! type_elem
|
90
|
+
unknown_count += 1
|
91
|
+
elsif type_elem["level"] == "critical"
|
92
|
+
critical_count += 1
|
93
|
+
elsif type_elem["level"] == "warning"
|
94
|
+
warning_count += 1
|
95
|
+
else
|
96
|
+
unknown_count += 1
|
97
|
+
end
|
98
|
+
|
99
|
+
status_int =
|
100
|
+
if critical_count > 0
|
101
|
+
2
|
102
|
+
elsif warning_count > 0
|
103
|
+
1
|
104
|
+
elsif unknown_count > 0
|
105
|
+
3
|
106
|
+
else
|
107
|
+
0
|
108
|
+
end
|
109
|
+
|
110
|
+
status_str =
|
111
|
+
if critical_count > 0
|
112
|
+
"CRITICAL"
|
113
|
+
elsif warning_count > 0
|
114
|
+
"WARNING"
|
115
|
+
elsif unknown_count > 0
|
116
|
+
"UNKNOWN"
|
117
|
+
else
|
118
|
+
"OK"
|
119
|
+
end
|
120
|
+
|
121
|
+
parts = []
|
122
|
+
|
123
|
+
if critical_count > 0
|
124
|
+
parts << "%d critical" % critical_count
|
125
|
+
end
|
126
|
+
|
127
|
+
if warning_count > 0
|
128
|
+
parts << "%d warning" % warning_count
|
129
|
+
end
|
130
|
+
|
131
|
+
if unknown_count > 0
|
132
|
+
parts << "%d unknown" % unknown_count
|
133
|
+
end
|
134
|
+
|
135
|
+
if parts.empty?
|
136
|
+
parts << "no new events"
|
137
|
+
end
|
138
|
+
|
139
|
+
message = "%s %s" % [
|
140
|
+
status_str,
|
141
|
+
parts.join(", "),
|
142
|
+
]
|
143
|
+
|
144
|
+
command = [
|
145
|
+
"PROCESS_SERVICE_CHECK_RESULT",
|
146
|
+
service_elem["icinga-host"],
|
147
|
+
service_elem["icinga-service"],
|
148
|
+
status_int,
|
149
|
+
message,
|
150
|
+
].join ";"
|
151
|
+
|
152
|
+
command_io.print "%s\n" % command
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
@next_check = Time.now + 60
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
51
166
|
def process_args
|
52
167
|
|
53
168
|
@opts, @args =
|
@@ -80,6 +195,9 @@ class Script
|
|
80
195
|
@db_elem =
|
81
196
|
@config_elem.find_first("db")
|
82
197
|
|
198
|
+
@icinga_elem =
|
199
|
+
@config_elem.find_first("icinga")
|
200
|
+
|
83
201
|
end
|
84
202
|
|
85
203
|
def connect_db
|
@@ -183,13 +301,17 @@ class Script
|
|
183
301
|
|
184
302
|
@db["summaries"].save summary
|
185
303
|
|
304
|
+
# perform checks
|
305
|
+
|
306
|
+
do_checks
|
307
|
+
|
186
308
|
# respond successfully
|
187
309
|
|
188
310
|
return 202, {}, []
|
189
311
|
|
190
312
|
end
|
191
313
|
|
192
|
-
def
|
314
|
+
def get_summaries_by_service
|
193
315
|
|
194
316
|
summaries_by_service = {}
|
195
317
|
|
@@ -231,6 +353,15 @@ class Script
|
|
231
353
|
|
232
354
|
end
|
233
355
|
|
356
|
+
return summaries_by_service
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
def overview_page env
|
361
|
+
|
362
|
+
summaries_by_service =
|
363
|
+
get_summaries_by_service
|
364
|
+
|
234
365
|
headers = {}
|
235
366
|
html = []
|
236
367
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hq-log-monitor-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bson_ext
|