hq-log-monitor-server 0.2.2 → 0.3.0

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.
@@ -0,0 +1,109 @@
1
+ module HQ
2
+ module LogMonitorServer
3
+
4
+ class Script
5
+
6
+ def service_host_page env, context
7
+
8
+ events =
9
+ @db["events"]
10
+ .find({
11
+ "source.service" => context[:service],
12
+ "source.host" => context[:host],
13
+ })
14
+ .to_a
15
+
16
+ title =
17
+ "%s %s \u2014 Log monitor" % [
18
+ context[:host],
19
+ context[:service],
20
+ ]
21
+
22
+ headers = {}
23
+ html = []
24
+
25
+ headers["content-type"] = "text/html; charset=utf-8"
26
+
27
+ html << "<!DOCTYPE html>\n"
28
+ html << "<html>\n"
29
+ html << "<head>\n"
30
+
31
+ html << "<title>%s</title>\n" % [
32
+ esc_ht(title),
33
+ ]
34
+
35
+ html << "</head>\n"
36
+ html << "<body>\n"
37
+
38
+ html << "<h1>%s</h1>\n" % [
39
+ esc_ht(title),
40
+ ]
41
+
42
+ if events.empty?
43
+ html << "<p>No events have been logged for this service on this " +
44
+ "host</p>\n"
45
+ else
46
+
47
+ html << "<table id=\"events\">\n"
48
+ html << "<thead>\n"
49
+
50
+ html << "<tr>\n"
51
+ html << "<th>Timestamp</th>\n"
52
+ html << "<th>File</th>\n"
53
+ html << "<th>Line</th>\n"
54
+ html << "<th>Type</th>\n"
55
+ html << "<th>View</th>\n"
56
+ html << "</tr>\n"
57
+
58
+ html << "</thead>\n"
59
+ html << "<tbody>\n"
60
+
61
+ events.each do
62
+ |event|
63
+
64
+ html << "<tr class=\"event\">\n"
65
+
66
+ html << "<td class=\"timestamp\">%s</td>\n" % [
67
+ esc_ht(event["timestamp"].to_s),
68
+ ]
69
+
70
+ html << "<td class=\"file\">%s</td>\n" % [
71
+ esc_ht(event["location"]["file"]),
72
+ ]
73
+
74
+ html << "<td class=\"line\">%s</td>\n" % [
75
+ esc_ht(event["location"]["line"].to_s),
76
+ ]
77
+
78
+ html << "<td class=\"type\">%s</td>\n" % [
79
+ esc_ht(event["type"]),
80
+ ]
81
+
82
+ html << "<td class=\"view\">%s</td>\n" % [
83
+ "<a href=\"%s\">view</a>" % [
84
+ "/event/%s" % [
85
+ esc_ue(event["_id"].to_s),
86
+ ],
87
+ ],
88
+ ]
89
+
90
+ html << "</tr>\n"
91
+
92
+ end
93
+
94
+ html << "</tbody>\n"
95
+ html << "</table>\n"
96
+
97
+ end
98
+
99
+ html << "</body>\n"
100
+ html << "</html>\n"
101
+
102
+ return 200, headers, html
103
+
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,112 @@
1
+ module HQ
2
+ module LogMonitorServer
3
+
4
+ class Script
5
+
6
+ def service_page env, context
7
+
8
+ summaries =
9
+ @db["summaries"]
10
+ .find({
11
+ "_id.service" => context[:service]
12
+ })
13
+ .to_a
14
+
15
+ title =
16
+ "%s - Log monitor" % [
17
+ context[:service],
18
+ ]
19
+
20
+ headers = {}
21
+ html = []
22
+
23
+ headers["content-type"] = "text/html; charset=utf-8"
24
+
25
+ html << "<!DOCTYPE html>\n"
26
+ html << "<html>\n"
27
+ html << "<head>\n"
28
+
29
+ html << "<title>%s</title>\n" % [
30
+ esc_ht(title),
31
+ ]
32
+
33
+ html << "</head>\n"
34
+ html << "<body>\n"
35
+
36
+ html << "<h1>%s</h1>\n" % [
37
+ esc_ht(title),
38
+ ]
39
+
40
+ if summaries.empty?
41
+ html << "<p>No events have been logged for this service</p>\n"
42
+ else
43
+
44
+ html << "<table id=\"summaries\">\n"
45
+ html << "<thead>\n"
46
+
47
+ html << "<tr>\n"
48
+ html << "<th>Host</th>\n"
49
+ html << "<th>Class</th>\n"
50
+ html << "<th>Alerts</th>\n"
51
+ html << "<th>Details</th>\n"
52
+ html << "<th>View</th>\n"
53
+ html << "</tr>\n"
54
+
55
+ html << "</thead>\n"
56
+ html << "<tbody>\n"
57
+
58
+ summaries.each do
59
+ |summary|
60
+
61
+ html << "<tr class=\"summary\">\n"
62
+
63
+ html << "<td class=\"host\">%s</td>\n" % [
64
+ esc_ht(summary["_id"]["host"]),
65
+ ]
66
+
67
+ html << "<td class=\"service\">%s</td>\n" % [
68
+ esc_ht(summary["_id"]["class"]),
69
+ ]
70
+
71
+ html << "<td class=\"alerts\">%s</td>\n" % [
72
+ esc_ht(summary["combined"]["new"].to_s),
73
+ ]
74
+
75
+ html << "<td class=\"detail\">%s</td>\n" % [
76
+ esc_ht(
77
+ summary["types"].map {
78
+ |type, counts|
79
+ "%s %s" % [ counts["new"], type ]
80
+ }.join ", "
81
+ ),
82
+ ]
83
+
84
+ html << "<td class=\"view\">%s</td>\n" % [
85
+ "<a href=\"%s\">view</a>" % [
86
+ "/service/%s/host/%s" % [
87
+ esc_ue(summary["_id"]["service"]),
88
+ esc_ue(summary["_id"]["host"]),
89
+ ],
90
+ ],
91
+ ]
92
+
93
+ html << "</tr>\n"
94
+
95
+ end
96
+
97
+ html << "</tbody>\n"
98
+ html << "</table>\n"
99
+
100
+ end
101
+
102
+ html << "</body>\n"
103
+ html << "</html>\n"
104
+
105
+ return 200, headers, html
106
+
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,58 @@
1
+ module HQ
2
+ module LogMonitorServer
3
+
4
+ class Script
5
+
6
+ def submit_log_event env
7
+
8
+ # decode it
9
+
10
+ event = MultiJson.load env["rack.input"].read
11
+
12
+ # add some fields
13
+
14
+ event["timestamp"] = Time.now
15
+ event["status"] = "unseen"
16
+
17
+ # insert it
18
+
19
+ @db["events"].insert event
20
+
21
+ # update summary
22
+
23
+ summary =
24
+ @db["summaries"].find({
25
+ "_id" => event["source"],
26
+ }).first
27
+
28
+ summary ||= {
29
+ "_id" => event["source"],
30
+ "combined" => { "new" => 0, "total" => 0 },
31
+ "types" => {},
32
+ }
33
+
34
+ summary["types"][event["type"]] ||=
35
+ { "new" => 0, "total" => 0 }
36
+
37
+ summary["types"][event["type"]]["new"] += 1
38
+ summary["types"][event["type"]]["total"] += 1
39
+
40
+ summary["combined"]["new"] += 1
41
+ summary["combined"]["total"] += 1
42
+
43
+ @db["summaries"].save summary
44
+
45
+ # perform checks
46
+
47
+ do_checks
48
+
49
+ # respond successfully
50
+
51
+ return 202, {}, []
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+ end
metadata CHANGED
@@ -1,181 +1,206 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hq-log-monitor-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - James Pharaoh
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-04-30 00:00:00.000000000 Z
12
+ date: 2013-05-08 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bson_ext
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - '>='
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: 1.8.2
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - '>='
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: 1.8.2
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: hq-tools
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - '>='
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: 0.2.0
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - '>='
43
+ - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: 0.2.0
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: libxml-ruby
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - '>='
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
53
  version: 2.6.0
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - '>='
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: 2.6.0
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: mongo
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - '>='
67
+ - - ! '>='
60
68
  - !ruby/object:Gem::Version
61
69
  version: 1.8.2
62
70
  type: :runtime
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - '>='
75
+ - - ! '>='
67
76
  - !ruby/object:Gem::Version
68
77
  version: 1.8.2
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: multi_json
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - '>='
83
+ - - ! '>='
74
84
  - !ruby/object:Gem::Version
75
85
  version: 1.6.1
76
86
  type: :runtime
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - '>='
91
+ - - ! '>='
81
92
  - !ruby/object:Gem::Version
82
93
  version: 1.6.1
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: rack
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - '>='
99
+ - - ! '>='
88
100
  - !ruby/object:Gem::Version
89
101
  version: 1.5.1
90
102
  type: :runtime
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - '>='
107
+ - - ! '>='
95
108
  - !ruby/object:Gem::Version
96
109
  version: 1.5.1
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: capybara
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
- - - '>='
115
+ - - ! '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: 2.0.2
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
- - - '>='
123
+ - - ! '>='
109
124
  - !ruby/object:Gem::Version
110
125
  version: 2.0.2
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: cucumber
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
- - - '>='
131
+ - - ! '>='
116
132
  - !ruby/object:Gem::Version
117
133
  version: 1.2.1
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
- - - '>='
139
+ - - ! '>='
123
140
  - !ruby/object:Gem::Version
124
141
  version: 1.2.1
125
142
  - !ruby/object:Gem::Dependency
126
143
  name: rake
127
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
128
146
  requirements:
129
- - - '>='
147
+ - - ! '>='
130
148
  - !ruby/object:Gem::Version
131
149
  version: 10.0.3
132
150
  type: :development
133
151
  prerelease: false
134
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
135
154
  requirements:
136
- - - '>='
155
+ - - ! '>='
137
156
  - !ruby/object:Gem::Version
138
157
  version: 10.0.3
139
158
  - !ruby/object:Gem::Dependency
140
159
  name: rspec
141
160
  requirement: !ruby/object:Gem::Requirement
161
+ none: false
142
162
  requirements:
143
- - - '>='
163
+ - - ! '>='
144
164
  - !ruby/object:Gem::Version
145
165
  version: 2.12.0
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
149
170
  requirements:
150
- - - '>='
171
+ - - ! '>='
151
172
  - !ruby/object:Gem::Version
152
173
  version: 2.12.0
153
174
  - !ruby/object:Gem::Dependency
154
175
  name: rspec_junit_formatter
155
176
  requirement: !ruby/object:Gem::Requirement
177
+ none: false
156
178
  requirements:
157
- - - '>='
179
+ - - ! '>='
158
180
  - !ruby/object:Gem::Version
159
181
  version: '0'
160
182
  type: :development
161
183
  prerelease: false
162
184
  version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
163
186
  requirements:
164
- - - '>='
187
+ - - ! '>='
165
188
  - !ruby/object:Gem::Version
166
189
  version: '0'
167
190
  - !ruby/object:Gem::Dependency
168
191
  name: simplecov
169
192
  requirement: !ruby/object:Gem::Requirement
193
+ none: false
170
194
  requirements:
171
- - - '>='
195
+ - - ! '>='
172
196
  - !ruby/object:Gem::Version
173
197
  version: '0'
174
198
  type: :development
175
199
  prerelease: false
176
200
  version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
177
202
  requirements:
178
- - - '>='
203
+ - - ! '>='
179
204
  - !ruby/object:Gem::Version
180
205
  version: '0'
181
206
  description: HQ log monitor system, central component
@@ -186,37 +211,49 @@ executables:
186
211
  extensions: []
187
212
  extra_rdoc_files: []
188
213
  files:
214
+ - lib/hq/log-monitor-server/overview-page.rb
215
+ - lib/hq/log-monitor-server/do-checks.rb
216
+ - lib/hq/log-monitor-server/submit-log-event.rb
189
217
  - lib/hq/log-monitor-server/script.rb
218
+ - lib/hq/log-monitor-server/service-host-page.rb
219
+ - lib/hq/log-monitor-server/service-page.rb
220
+ - lib/hq/log-monitor-server/event-page.rb
221
+ - lib/hq/log-monitor-server/logic.rb
222
+ - features/event-page.feature
190
223
  - features/submit-event.feature
191
- - features/overview.feature
224
+ - features/overview-page.feature
192
225
  - features/support/steps.rb
193
226
  - features/support/env.rb
227
+ - features/support/ui-steps.rb
194
228
  - bin/hq-log-monitor-server
195
229
  homepage: https://github.com/jamespharaoh/hq-log-monitor-server
196
230
  licenses: []
197
- metadata: {}
198
231
  post_install_message:
199
232
  rdoc_options: []
200
233
  require_paths:
201
234
  - lib
202
235
  required_ruby_version: !ruby/object:Gem::Requirement
236
+ none: false
203
237
  requirements:
204
- - - '>='
238
+ - - ! '>='
205
239
  - !ruby/object:Gem::Version
206
240
  version: '0'
207
241
  required_rubygems_version: !ruby/object:Gem::Requirement
242
+ none: false
208
243
  requirements:
209
- - - '>='
244
+ - - ! '>='
210
245
  - !ruby/object:Gem::Version
211
246
  version: 1.3.6
212
247
  requirements: []
213
248
  rubyforge_project: hq-log-monitor-server
214
- rubygems_version: 2.0.3
249
+ rubygems_version: 1.8.23
215
250
  signing_key:
216
- specification_version: 4
251
+ specification_version: 3
217
252
  summary: HQ log monitor server
218
253
  test_files:
254
+ - features/event-page.feature
219
255
  - features/submit-event.feature
220
- - features/overview.feature
256
+ - features/overview-page.feature
221
257
  - features/support/steps.rb
222
258
  - features/support/env.rb
259
+ - features/support/ui-steps.rb