heroku_mongo_watcher 0.1.1.beta → 0.2.1.beta
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.
data/README.md
CHANGED
@@ -34,6 +34,7 @@ The output looks like the following ...
|
|
34
34
|
<tr><td>max</td><td>max request time</td></tr>
|
35
35
|
<tr><td>r_err</td><td>number of router errors, i.e. timeouts</td></tr>
|
36
36
|
<tr><td>w_err</td><td>number of web errros (see below)</td></tr>
|
37
|
+
<tr><td>%err</td><td>total errors divided by total requests</td></tr>
|
37
38
|
<tr><td>wait</td><td>average router wait</td></tr>
|
38
39
|
<tr><td>queue</td><td>average router queue</td></tr>
|
39
40
|
<tr><td>slowest</td><td>path of the url that corresponds to the max request time</td></tr>
|
@@ -51,7 +52,7 @@ At least for me, one of the key features is aggregating signals from my web log
|
|
51
52
|
and other errors). You can can configure the `error_messages` array in your .watcher file to define which String we
|
52
53
|
should report on.
|
53
54
|
|
54
|
-
In concert with that is the `
|
55
|
+
In concert with that is the `print_errors` configuration. If set to true it will aggregate and display the errors
|
55
56
|
found (see output above), set to false it will just put the total in the summary row
|
56
57
|
|
57
58
|
|
@@ -66,3 +67,10 @@ found (see output above), set to false it will just put the total in the summary
|
|
66
67
|
2. create a .watcher file (see the examples) in your user directory ~/.watcher
|
67
68
|
3. then run `bundle exec watcher`
|
68
69
|
4. Ctrl-C out to quit
|
70
|
+
|
71
|
+
## Options
|
72
|
+
|
73
|
+
* `--print-errors` to print a summary of errors during each sample
|
74
|
+
* `--print-requests` to print a summary of requests during each sample
|
75
|
+
|
76
|
+
note: you can set these defaults in your .watcher file
|
data/example/.watcher
CHANGED
@@ -26,4 +26,7 @@ heroku_appname: 'my-heroku-app-name'
|
|
26
26
|
heroku_account: 'my-heroku-account'
|
27
27
|
|
28
28
|
# If you want to display the list of errors in the logs
|
29
|
-
|
29
|
+
print_errors: true
|
30
|
+
|
31
|
+
# If you want to display the list of requests in the logs
|
32
|
+
print_requests: false
|
@@ -72,7 +72,8 @@ class HerokuMongoWatcher::CLI
|
|
72
72
|
|
73
73
|
HerokuMongoWatcher::DataRow.print_header
|
74
74
|
|
75
|
-
IO.popen("mongostat --rowcount 0 #{config[:interval]} --host #{config[:mongo_host]} --username #{config[:mongo_username]} --password #{config[:mongo_password]} --noheaders") do |f|
|
75
|
+
#IO.popen("mongostat --rowcount 0 #{config[:interval]} --host #{config[:mongo_host]} --username #{config[:mongo_username]} --password #{config[:mongo_password]} --noheaders") do |f|
|
76
|
+
IO.popen("mongostat --rowcount 0 10 --host #{config[:mongo_host]} --username #{config[:mongo_username]} --password #{config[:mongo_password]} --noheaders") do |f|
|
76
77
|
while line = f.gets
|
77
78
|
next unless line =~ /^/ && !(line =~ /^connected/)
|
78
79
|
@mutex.synchronize do
|
@@ -163,7 +164,7 @@ class HerokuMongoWatcher::CLI
|
|
163
164
|
"Faults: #{@last_row.faults}",
|
164
165
|
"NetI/O: #{@last_row.net_in}/#{@last_row.net_out}",
|
165
166
|
]
|
166
|
-
content = content + @last_row.error_content_for_email
|
167
|
+
content = content + @last_row.error_content_for_email + @last_row.request_content_for_email
|
167
168
|
|
168
169
|
content = content.join("\r\n")
|
169
170
|
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
|
@@ -15,7 +15,8 @@ class HerokuMongoWatcher::Configuration
|
|
15
15
|
mongo_password: '',
|
16
16
|
heroku_appname: '',
|
17
17
|
heroku_account: '',
|
18
|
-
print_errors:
|
18
|
+
print_errors: false,
|
19
|
+
print_requests: false
|
19
20
|
}
|
20
21
|
|
21
22
|
@@valid_config_keys = @@config.keys
|
@@ -25,7 +26,8 @@ class HerokuMongoWatcher::Configuration
|
|
25
26
|
configure_with(f)
|
26
27
|
|
27
28
|
opts = Trollop::options do
|
28
|
-
opt :print_errors, "show aggregate error summaries", default:
|
29
|
+
opt :print_errors, "show aggregate error summaries", default: false
|
30
|
+
opt :print_requests, "show aggregate requests summaries", default: false
|
29
31
|
end
|
30
32
|
|
31
33
|
@@config.merge!(opts)
|
@@ -5,7 +5,7 @@ class HerokuMongoWatcher::DataRow
|
|
5
5
|
# Heroku Attributes
|
6
6
|
@@attributes = [:total_requests, :total_service, :total_wait,
|
7
7
|
:total_queue, :total_router_errors, :total_web_errors,
|
8
|
-
:max_service, :slowest_request, :errors, :dynos]
|
8
|
+
:max_service, :slowest_request, :errors, :requests,:dynos]
|
9
9
|
|
10
10
|
# Mongo Attributes
|
11
11
|
@@attributes.concat [:inserts, :queries, :ops, :updates, :deletes,
|
@@ -17,6 +17,7 @@ class HerokuMongoWatcher::DataRow
|
|
17
17
|
@@attributes.each { |attr| send "#{attr}=", 0 }
|
18
18
|
self.slowest_request = nil
|
19
19
|
self.errors = {}
|
20
|
+
self.requests = {}
|
20
21
|
end
|
21
22
|
|
22
23
|
def config
|
@@ -58,6 +59,8 @@ class HerokuMongoWatcher::DataRow
|
|
58
59
|
status = items[8].split('=').last if items[8]
|
59
60
|
bytes = items[9].split('=').last if items[9]
|
60
61
|
|
62
|
+
path = URI('http://' + url).path
|
63
|
+
|
61
64
|
if is_number?(service) && is_number?(wait) && is_number?(queue)
|
62
65
|
self.total_requests +=1
|
63
66
|
self.total_service += Integer(service) if service
|
@@ -65,10 +68,17 @@ class HerokuMongoWatcher::DataRow
|
|
65
68
|
self.total_queue += Integer(queue) if queue
|
66
69
|
if Integer(service) > self.max_service
|
67
70
|
self.max_service = Integer(service)
|
68
|
-
self.slowest_request =
|
71
|
+
self.slowest_request = path
|
69
72
|
end
|
70
73
|
end
|
71
74
|
|
75
|
+
if self.requests.has_key? path
|
76
|
+
self.requests[path] = self.requests[path] + 1
|
77
|
+
else
|
78
|
+
self.requests[path] = 1
|
79
|
+
end
|
80
|
+
|
81
|
+
|
72
82
|
end
|
73
83
|
end
|
74
84
|
|
@@ -126,7 +136,8 @@ class HerokuMongoWatcher::DataRow
|
|
126
136
|
end
|
127
137
|
|
128
138
|
def print_row
|
129
|
-
print_errors
|
139
|
+
print_hash(@errors) if config[:print_errors]
|
140
|
+
print_hash(@requests) if config[:print_requests]
|
130
141
|
|
131
142
|
color_print @dynos, length: 4
|
132
143
|
color_print @total_requests, warning: 30_000, critical: 50_000
|
@@ -150,10 +161,10 @@ class HerokuMongoWatcher::DataRow
|
|
150
161
|
printf "\n"
|
151
162
|
end
|
152
163
|
|
153
|
-
def
|
154
|
-
if
|
155
|
-
|
156
|
-
|
164
|
+
def print_hash(hash)
|
165
|
+
if hash && hash.keys && hash.keys.length > 0
|
166
|
+
hash.sort_by{|key,count| -count}.each do |row|
|
167
|
+
printf "\t%10s %s\n", "[#{row.last}]", row.first
|
157
168
|
end
|
158
169
|
end
|
159
170
|
end
|
@@ -161,6 +172,7 @@ class HerokuMongoWatcher::DataRow
|
|
161
172
|
def error_content_for_email
|
162
173
|
content = []
|
163
174
|
if @errors && @errors.keys && @errors.keys.length > 0
|
175
|
+
content << ""
|
164
176
|
content << "Errors"
|
165
177
|
@errors.each do |error,count|
|
166
178
|
content << "\t\t[#{count}] #{error}"
|
@@ -169,6 +181,18 @@ class HerokuMongoWatcher::DataRow
|
|
169
181
|
content
|
170
182
|
end
|
171
183
|
|
184
|
+
def request_content_for_email
|
185
|
+
content = []
|
186
|
+
if @requests && @requests.keys && @requests.keys.length > 0
|
187
|
+
content << ""
|
188
|
+
content << "Requests"
|
189
|
+
@requests.sort_by{|req,count| -count}.each do |row|
|
190
|
+
content << "\t\t[#{row.last}] #{row.first}"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
content
|
194
|
+
end
|
195
|
+
|
172
196
|
private
|
173
197
|
|
174
198
|
def is_number?(string)
|
@@ -183,9 +207,9 @@ class HerokuMongoWatcher::DataRow
|
|
183
207
|
|
184
208
|
def color_print(field, options ={})
|
185
209
|
options[:length] = 7 unless options[:length]
|
186
|
-
print Term::ANSIColor.bold if options[:bold]
|
210
|
+
print Term::ANSIColor.bold if options[:bold]
|
187
211
|
if options[:critical] && is_number?(field) && Float(field) > options[:critical]
|
188
|
-
|
212
|
+
beep
|
189
213
|
print Term::ANSIColor.red
|
190
214
|
print Term::ANSIColor.bold
|
191
215
|
elsif options[:warning] && is_number?(field) && Float(field) > options[:warning]
|
@@ -200,5 +224,9 @@ class HerokuMongoWatcher::DataRow
|
|
200
224
|
print Term::ANSIColor.clear
|
201
225
|
end
|
202
226
|
|
227
|
+
def beep
|
228
|
+
print "\a"
|
229
|
+
end
|
230
|
+
|
203
231
|
|
204
232
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku_mongo_watcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1.beta
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-24 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: term-ansicolor
|
16
|
-
requirement: &
|
16
|
+
requirement: &2156725900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2156725900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: tlsmail
|
27
|
-
requirement: &
|
27
|
+
requirement: &2156724780 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2156724780
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: heroku
|
38
|
-
requirement: &
|
38
|
+
requirement: &2156723920 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2156723920
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: trollop
|
49
|
-
requirement: &
|
49
|
+
requirement: &2156722860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2156722860
|
58
58
|
description: Also notifies you when certain thresholds are hit. I have found this
|
59
59
|
much more accurate than New Relic
|
60
60
|
email:
|