redis-stat 0.4.1-java → 0.4.2-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d553a2b4d8425825b0e9478ca8a1a5cd0eea842d
4
- data.tar.gz: faac3da66cdf6c54bea638282553106a8a695f37
3
+ metadata.gz: e0c766e709203cbbc8fe84956b58024190103ae0
4
+ data.tar.gz: 38c293db9116acf3334ff68e8948a9a46fe5002c
5
5
  SHA512:
6
- metadata.gz: 8d53092e812d6d9ba9da9bd4f57e1de0dcfd4f133c5450f9b03f4ee973d69ddd9c676e9bb5bc770dfab28606f92b72d6fbd747f71c2c12b3febba54e5e72b247
7
- data.tar.gz: cd6a8a4ca1a94995ec7d8defde3ef8417c5d9eeddef9b3d759fa2127410ed87c73e042a6c6563e9c20d99980d120f6031bbffdb254c32b71af2f40eb0c79a609
6
+ metadata.gz: 6f00650709f31aa0778396c7a5c9c56e89b66a9c327c8fdd6a5f9fb4fd324cd15c6edbf6186a0755a628dbf35bf17a7a728a9ce76bddad55656a9c8704b66435
7
+ data.tar.gz: 5b9a39596bfd0460ca30a410e298e14b5ce78b8122a64d2a8502e148282bf2d02ad3e1efab54e53229d1795563ed2ae7a74cb4647ea78e48eefdfe4d2c5d9f1a
data/lib/redis-stat.rb CHANGED
@@ -52,6 +52,7 @@ class RedisStat
52
52
  end
53
53
 
54
54
  def start output_stream
55
+ @started_at = Time.now
55
56
  @os = output_stream
56
57
  trap('INT') { Thread.main.raise Interrupt }
57
58
 
@@ -60,11 +61,28 @@ class RedisStat
60
61
  update_term_size!
61
62
  authenticate!
62
63
 
63
- @started_at = Time.now
64
- prev_info = nil
65
- server = start_server if @server_port
66
- errors = 0
64
+ # Initial info collection
65
+ info, x = collect
66
+ unless x.empty?
67
+ output_term_errors! format_exceptions(x)
68
+ exit 1
69
+ end
70
+
71
+ # Check elasticsearch status
72
+ if @elasticsearch
73
+ begin
74
+ output_es info
75
+ rescue Exception => e
76
+ output_term_errors! format_exceptions({ :elasticsearch => e })
77
+ exit 1
78
+ end
79
+ end
67
80
 
81
+ # Start web servers
82
+ server = start_server(info) if @server_port
83
+
84
+ # Main loop
85
+ prev_info = nil
68
86
  LPS.interval(@interval).loop do
69
87
  info, exceptions =
70
88
  begin
@@ -78,26 +96,23 @@ class RedisStat
78
96
  next
79
97
  end
80
98
 
81
- output_es info if @elasticsearch
82
-
83
- unless exceptions.empty?
84
- now = Time.now.strftime('%Y/%m/%d %H:%M:%S')
85
- msgs = exceptions.map { |h, x| "[#{now}@#{h}] #{x}" }
86
- @os.puts if (errors += 1) == 1
87
- @os.puts msgs.join($/).red.bold
88
- server.alert msgs.first if server
89
- sleep @interval
90
- next
99
+ begin
100
+ output_es info if @elasticsearch && @count > 0
101
+ rescue Exception => e
102
+ exceptions[:elasticsearch] = e.to_s
91
103
  end
92
-
104
+ error_messages = format_exceptions(exceptions)
93
105
  info_output = process info, prev_info
94
- output_static_info info if @count == 0
95
- output info_output, csv
96
- server.push @hosts, info, Hash[info_output] if server
106
+ unless @daemonized
107
+ output_static_info info if @count == 0
108
+ output_term info_output, error_messages
109
+ end
110
+ server.push @hosts, info, Hash[info_output], error_messages if server
111
+ output_file info_output, csv if csv
112
+
97
113
  prev_info = info
98
114
 
99
115
  @count += 1
100
- errors = 0
101
116
  break if @max_count && @count >= @max_count
102
117
  end
103
118
  @os.puts
@@ -108,6 +123,8 @@ class RedisStat
108
123
  @server_thr.raise Interrupt
109
124
  @server_thr.join
110
125
  end
126
+ rescue SystemExit
127
+ raise
111
128
  rescue Exception => e
112
129
  @os.puts e.to_s.red.bold
113
130
  raise
@@ -118,11 +135,16 @@ class RedisStat
118
135
  end
119
136
 
120
137
  private
121
- def start_server
138
+ def start_server info
122
139
  RedisStat::Server.set :port, @server_port
123
140
  RedisStat::Server.set :redis_stat, self
124
- RedisStat::Server.set :last_info, collect.first
125
- @server_thr = Thread.new { RedisStat::Server.run! }
141
+ RedisStat::Server.set :last_info, info
142
+ @server_thr = Thread.new {
143
+ begin
144
+ RedisStat::Server.run!
145
+ rescue Interrupt
146
+ end
147
+ }
126
148
  RedisStat::Server.wait_until_running
127
149
  trap('INT') { Thread.main.raise Interrupt }
128
150
  RedisStat::Server
@@ -135,7 +157,7 @@ private
135
157
  }
136
158
  class << info
137
159
  def sumf label
138
- self[:instances].values.map { |hash| hash[label].to_f }.inject(:+)
160
+ self[:instances].values.map { |hash| hash[label].to_f }.inject(:+) || 0
139
161
  end
140
162
  end
141
163
  exceptions = {}
@@ -191,6 +213,15 @@ private
191
213
  )
192
214
  end
193
215
 
216
+ def format_exceptions exceptions
217
+ if exceptions.empty?
218
+ []
219
+ else
220
+ now = Time.now.strftime('%Y/%m/%d %H:%M:%S')
221
+ exceptions.map { |h, x| "[#{now}@#{h}] #{x}" }
222
+ end
223
+ end
224
+
194
225
  def output_file info_output, file
195
226
  file.puts CSV.generate_line(info_output.map { |pair|
196
227
  LABELS[pair.first] || pair.first
@@ -202,7 +233,26 @@ private
202
233
  file.flush
203
234
  end
204
235
 
205
- def output_term info_output
236
+ def output_term_errors error_messages
237
+ @_term_error_reported ||= false
238
+ if error_messages.empty?
239
+ @_term_error_reported = false
240
+ else
241
+ unless @_term_error_reported
242
+ @os.puts
243
+ end
244
+ output_term_errors! error_messages
245
+ @_term_error_reported = true
246
+ end
247
+ end
248
+
249
+ def output_term_errors! error_messages
250
+ @os.puts error_messages.join($/).red.bold
251
+ end
252
+
253
+ def output_term info_output, error_messages
254
+ return if output_term_errors error_messages
255
+
206
256
  @table ||= init_table info_output
207
257
 
208
258
  movement = nil
@@ -265,11 +315,6 @@ private
265
315
  @os.puts tab
266
316
  end
267
317
 
268
- def output info_output, file
269
- output_term info_output unless @daemonized
270
- output_file info_output, file if file
271
- end
272
-
273
318
  def output_es info
274
319
  @elasticsearch.output info
275
320
  rescue Exception
@@ -38,14 +38,15 @@ class ElasticsearchSink
38
38
  end
39
39
 
40
40
  def output info
41
- convert_to_i(info).map do |host, entries|
42
- time = entries[:at]
41
+ convert_to_i(info).each do |host, entries|
42
+ time = info[:at].to_i
43
43
  entry = {
44
44
  :index => index,
45
45
  :type => "redis",
46
46
  :body => entries.merge({
47
47
  :@timestamp => format_time(time),
48
- :host => host
48
+ :host => host,
49
+ :at => time
49
50
  }),
50
51
  }
51
52
 
@@ -68,15 +69,14 @@ private
68
69
  def convert_to_i info
69
70
  Hash[info[:instances].map { |host, entries|
70
71
  output = {}
71
- output[:at] = info[:at].to_i
72
72
  entries.each do |name, value|
73
73
  convert = RedisStat::LABELS[name] || TO_I[name]
74
74
  if convert
75
75
  output[name] = value.to_i
76
76
  end
77
77
  end
78
- [host, output]
79
- }]
78
+ output.empty? ? nil : [host, output]
79
+ }.compact]
80
80
  end
81
81
  end
82
82
  end
@@ -83,11 +83,14 @@ class Server < Sinatra::Base
83
83
  end
84
84
  end
85
85
 
86
- def push hosts, info, data
86
+ def push hosts, info, data, error
87
87
  static = Hash[settings.redis_stat.tab_measures.map { |stat|
88
88
  [stat, hosts.map { |h| info[:instances][h][stat] }]
89
89
  }]
90
- data = {:at => (Time.now.to_f * 1000).to_i, :static => static, :dynamic => data}
90
+ data = {:at => (Time.now.to_f * 1000).to_i,
91
+ :static => static,
92
+ :dynamic => data,
93
+ :error => error}
91
94
 
92
95
  settings.mutex.synchronize do
93
96
  settings.last_error = nil
@@ -152,7 +152,7 @@ var updateTable = function() {
152
152
  for (var stat in js) {
153
153
  $("#" + stat).replaceWith(
154
154
  "<tr id='" + stat + "'>" +
155
- js[stat].map(function(e) { return "<td>" + (e == null ? "" : e) + "</td>" }).join() +
155
+ js[stat].map(function(e) { return "<td>" + (e == null ? "<span class='label label-warning'>N/A</span>" : e) + "</td>" }).join() +
156
156
  "</tr>"
157
157
  )
158
158
  }
@@ -27,7 +27,6 @@
27
27
  <div class="span12">
28
28
  <h3>Dashboard</h3>
29
29
  <div class="alert alert-error hide">
30
- <h4></h4>
31
30
  </div>
32
31
  </div>
33
32
  </div>
@@ -142,20 +141,27 @@
142
141
 
143
142
  var source = new EventSource("/pull")
144
143
  source.onmessage = function(e) {
144
+ var alert = $(".alert");
145
145
  var json = JSON.parse(e.data);
146
- if (json.error) {
147
- $(".alert h4").text(json.error);
148
- $(".alert").fadeIn();
149
- } else if (appendToHistory(json)) {
150
- $(".alert").fadeOut()
146
+ if (json.error && json.error.length > 0) {
147
+ alert.html(
148
+ $.map(json.error, function(e, _) {
149
+ return "<h4>" + e + "</h4>";
150
+ }).join(''));
151
+ alert.fadeIn();
152
+ } else {
153
+ alert.fadeOut();
154
+ }
155
+ if (appendToHistory(json)) {
151
156
  updateTable()
152
157
  updatePlot()
153
158
  }
154
159
  }
155
160
  <% unless RUBY_PLATFORM == 'java' %>
156
161
  source.onerror = function(e) {
157
- $(".alert h4").text("Lost connection to redis-stat");
158
- $(".alert").fadeIn();
162
+ var alert = $(".alert");
163
+ alert.html("<h4>Lost connection to redis-stat</h4>");
164
+ alert.fadeIn();
159
165
  // source.close()
160
166
  }
161
167
  <% end %>
@@ -1,3 +1,3 @@
1
1
  class RedisStat
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-stat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: java
6
6
  authors:
7
7
  - Junegunn Choi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-13 00:00:00.000000000 Z
11
+ date: 2014-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ansi256
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  version: '0'
225
225
  requirements: []
226
226
  rubyforge_project:
227
- rubygems_version: 2.1.9
227
+ rubygems_version: 2.2.2
228
228
  signing_key:
229
229
  specification_version: 4
230
230
  summary: A real-time Redis monitoring tool written in Ruby