gri 10.0.8 → 10.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19492a2ad3e4e1ec3c1e2f2f42de8cb962a3e591
4
- data.tar.gz: 2c8951bbe68e3a24e8c1a3dbe5b024806f850a6d
3
+ metadata.gz: d0085633d9b1b963f804f959a9c2a17cc2b7d76f
4
+ data.tar.gz: cee9da876f1ab710bc5554230fa0c58e742d0979
5
5
  SHA512:
6
- metadata.gz: 3f7b436519f3f84d94227d01a7ba9be89e9f1436614d191e9d2fe1360629b824a69fe5d6c0293314df1ffcf891c5411c4bc477ee5ced3506e2e3c23c279cbf6b
7
- data.tar.gz: 01218f858aeefd19b5b83433072ee66cafdd7d19ed91b27716df8323d6319043df7f66c5d3bf879545d6847ad6cfcfe7980fec4455ef951bf619ede6c1a2901e
6
+ metadata.gz: 7b16f01fbde9f66c4f144b7dd1e0ad4437393d3db9657c882166b83ed3de47549a62094b34b1dbd5ae0307571c614b354441aeea072c21d40028935ddcf4be0c
7
+ data.tar.gz: d0134819ae4af120a405b8e6f2a930977fc13d3d77ed760c436c3a5800d415ed7e1a3fe1df819f3918527f15514275d5f7f25ff347407fbd40a27c007d03d92f
@@ -58,4 +58,40 @@ class GriOutput < BufferedOutput
58
58
  end
59
59
  end
60
60
 
61
+ class TraOutput < BufferedOutput
62
+ Plugin.register_output('tra', self)
63
+
64
+ config_param :config_path, :string, :default=>'/usr/local/gri/gri.conf'
65
+ config_param :tra_dir, :string, :default=>nil
66
+ config_param :log_level, :string, :default=>nil
67
+ config_param :interval, :integer, :default=>nil
68
+
69
+ def start
70
+ super
71
+ if @log_level
72
+ ::Log.init '/tmp/out_tra.log', :log_level=>@log_level
73
+ end
74
+ GRI::Config.init @config_path
75
+ root_dir = GRI::Config['root-dir'] ||= GRI::Config::ROOT_PATH
76
+ plugin_dirs = GRI::Config.getvar('plugin-dir') || [root_dir + '/plugin']
77
+ GRI::Plugin.load_plugins plugin_dirs
78
+ @tra_dir ||= GRI::Config['tra-dir'] || root_dir + '/tra'
79
+ @interval ||= (GRI::Config['interval'] || 300).to_i
80
+ end
81
+
82
+ def format tag, time, record
83
+ [tag, time, record].to_msgpack
84
+ end
85
+
86
+ def write chunk
87
+ records = []
88
+ chunk.msgpack_each {|tag, time, record|
89
+ records.push record
90
+ }
91
+ writer = GRI::Writer.create 'ldb', :tra_dir=>@tra_dir, :interval=>@interval
92
+ writer.write records
93
+ writer.finalize
94
+ end
95
+ end
96
+
61
97
  end
@@ -171,11 +171,16 @@ module GRI
171
171
  :tdb=>['hrStorage', 'hrStorageDescr', 'hrStorageSize', 'hrStorageUsed'],
172
172
  :fix_workhash=>lambda {|wh|
173
173
  if (th = wh[:hrStorageTotalHack])
174
- ph = Hash[*(th.map {|k, v|
174
+ ht = Hash[*(th.map {|k, v|
175
175
  [v['dskPath'],
176
176
  (v['dskTotalHigh'].to_i * 4294967296 +
177
177
  v['dskTotalLow'].to_i) * 1024]
178
178
  }).flatten]
179
+ hu = Hash[*(th.map {|k, v|
180
+ [v['dskPath'],
181
+ (v['dskUsedHigh'].to_i * 4294967296 +
182
+ v['dskUsedLow'].to_i) * 1024]
183
+ }).flatten]
179
184
  end
180
185
  if (h = wh[:hrStorage])
181
186
  h.reject! {|k, v|
@@ -183,12 +188,16 @@ module GRI
183
188
  h.each {|k, v|
184
189
  u = v['hrStorageAllocationUnits'].to_i
185
190
  v.delete 'hrStorageType'
186
- if ph and (t = ph[v['hrStorageDescr']])
191
+ if ht and (t = ht[v['hrStorageDescr']])
187
192
  v['hrStorageSize'] = t
188
193
  else
189
194
  v['hrStorageSize'] = v['hrStorageSize'].to_i * u
190
195
  end
191
- v['hrStorageUsed'] = v['hrStorageUsed'].to_i * u
196
+ if hu and (t = hu[v['hrStorageDescr']])
197
+ v['hrStorageUsed'] = t
198
+ else
199
+ v['hrStorageUsed'] = v['hrStorageUsed'].to_i * u
200
+ end
192
201
  }
193
202
  end
194
203
  },
@@ -201,7 +210,8 @@ module GRI
201
210
  },
202
211
 
203
212
  'hrStorageTotalHack'=>{
204
- :oid=>['dskPath', 'dskTotalLow', 'dskTotalHigh'],
213
+ :oid=>['dskPath', 'dskTotalLow', 'dskTotalHigh',
214
+ 'dskUsedLow', 'dskUsedHigh'],
205
215
  },
206
216
 
207
217
  'hrSWRunPerf'=>{
@@ -99,6 +99,7 @@ module GRI
99
99
  if $debug
100
100
  puts "snmp: #{host} (#{vendor.name}): #{sysinfo['sysDescr']}"
101
101
  puts vendor.options.inspect
102
+ printf " elapsed %f sec\n", Time.now - @attached_at
102
103
  end
103
104
 
104
105
  @snmp.version = vendor.options['ver'] if vendor.options['ver']
@@ -106,6 +107,7 @@ module GRI
106
107
  punits_d = punits.dup
107
108
  @workhash = punits.inject({}) {|h, pu| h[pu.cat] = {}; h}
108
109
  poll1(punits) {
110
+ printf " elapsed %f sec\n", Time.now - @attached_at if $debug
109
111
  if !options.has_key?('SYS') or options['SYS']
110
112
  sysinfo.delete 'sysObjectID'
111
113
  records = [sysinfo]
@@ -168,8 +170,10 @@ module GRI
168
170
  records.push h
169
171
  end
170
172
  end
173
+ printf " elapsed %f sec\n", Time.now - @attached_at if $debug
171
174
  @cb.call records
172
175
  @loop.detach self
176
+ printf " elapsed %f sec\n", Time.now - @attached_at if $debug
173
177
  }
174
178
  }
175
179
  end
@@ -190,8 +194,16 @@ module GRI
190
194
  pu = punits.shift
191
195
  @get_oid_buf = []
192
196
  oids = pu.oids.dup
193
- puts " poll #{host} #{pu.name}" if $debug
194
- walk1(pu, oids) {poll1 punits, &cb}
197
+ if $debug
198
+ t = Time.now
199
+ puts " poll #{host} #{pu.name}" if $debug['walk']
200
+ end
201
+ walk1(pu, oids) {
202
+ if $debug and !$debug['walk']
203
+ printf " poll #{host} #{pu.name} (%f sec)\n", Time.now - t
204
+ end
205
+ poll1 punits, &cb
206
+ }
195
207
  end
196
208
  end
197
209
 
@@ -250,10 +262,10 @@ module GRI
250
262
  @snmp.connect unless @snmp.sock
251
263
  @snmp.walk_start(enoid) {|*res| @results.push res}
252
264
  send_req enoid
253
- rescue SocketError
265
+ rescue SocketError => e
254
266
  @loop.detach self
255
267
  @on_error.call if @on_error
256
- Log.error "#{host}: error"
268
+ Log.error "#{host}: error: #{e.to_s}"
257
269
  end
258
270
 
259
271
  def get varbind, &cb
@@ -263,10 +275,10 @@ module GRI
263
275
  @snmp.connect unless @snmp.sock
264
276
  @snmp.get_start(varbind) {|*res| @results.push res}
265
277
  send_req varbind
266
- rescue SocketError
278
+ rescue SocketError => e
267
279
  @loop.detach self
268
280
  @on_error.call if @on_error
269
- Log.error "#{host}: error"
281
+ Log.error "#{host}: error: #{e.to_s}"
270
282
  end
271
283
 
272
284
  def send_req arg
@@ -290,8 +302,14 @@ module GRI
290
302
  elsif @preq
291
303
  Log.warn "#{host}: retry #{@retry_count}"
292
304
  @on_retry.call if @on_retry
293
- @buffers.push @preq.last
294
- loop.watch @snmp.sock, :w, @tout, self
305
+ if (s = @snmp.make_req(@snmp.state, @preq.last))
306
+ @buffers.push s
307
+ loop.watch @snmp.sock, :w, @tout, self
308
+ else
309
+ @loop.detach self
310
+ @on_error.call if @on_error
311
+ Log.error "#{host}: cannot retry: #{@retry_count}"
312
+ end
295
313
  else
296
314
  @loop.detach self
297
315
  @on_error.call if @on_error
@@ -314,8 +332,8 @@ module GRI
314
332
  @snmp.state = :SUCCESS if @snmp.state == :GET_REQ
315
333
  end
316
334
  if @snmp.state == :SUCCESS
317
- @poll_cb.call @results
318
335
  @preq = nil
336
+ @poll_cb.call @results
319
337
  elsif @snmp.state != :IDLE
320
338
  send_req arg if arg
321
339
  end
@@ -59,6 +59,7 @@ module GRI
59
59
  writer = Writer.create 'rrd', wopts
60
60
  app.writers.push writer
61
61
  end
62
+ app.writers.clear if @options['reset-writers']
62
63
  if @options['writers']
63
64
  for w in @options['writers']
64
65
  writer = Writer.create w, @config.to_h
@@ -103,6 +104,7 @@ module GRI
103
104
  op.on('--rrdupdater', '--updater') {opts['updater'] = true}
104
105
  op.on('--single') {opts['para'] = false}
105
106
  op.on('--tra=URL') {|arg| opts['tra'] = arg}
107
+ op.on('--reset-writers') {opts['reset-writers'] = true}
106
108
 
107
109
  op.on('-c COMMUNITY') {|arg| opts['community'] = arg}
108
110
  op.on('-v VER') {|arg| opts['version'] = arg}
@@ -3,6 +3,7 @@ require 'gri/builtindefs'
3
3
  require 'gri/utils'
4
4
  require 'gri/request'
5
5
  require 'gri/format_helper'
6
+ require 'gri/blank'
6
7
 
7
8
  module GRI
8
9
  class Page
@@ -15,10 +16,15 @@ module GRI
15
16
 
16
17
  def mk_page_title dirs, rs, params
17
18
  jstr = (params['p'] == 't' or params['p'] == 'v') ? ', ' : ' + '
18
- hosthash = {}
19
19
  descrs = []
20
20
  headlegend = nil
21
21
 
22
+ if (tags = params.getvar('tag'))
23
+ title = tags.compact.join jstr
24
+ return title, title, headlegend
25
+ end
26
+
27
+ hosthash = {}
22
28
  for rname in rs
23
29
  host, key = rname.split('_', 2)
24
30
  hosthash[host] = true
@@ -52,7 +58,7 @@ module GRI
52
58
  descr
53
59
  end
54
60
  }.join(jstr)
55
- body_title = descrs.collect {|url, xhost, descr|
61
+ body_title = descrs.map {|url, xhost, descr|
56
62
  if xhost and hosthash.size > 1
57
63
  "<a href=\"#{h url}\">#{h xhost}:#{h descr}</a>"
58
64
  else
@@ -66,6 +72,7 @@ module GRI
66
72
  def mk_param_str stime, etime, rs, ds, params
67
73
  res = rs.map {|r| "r=#{u r}"}
68
74
  res << "grp=#{u params['grp']}" if params['grp']
75
+ (tags = params.getvar('tag')) && tags.each {|tag| res << "tag=#{u tag}"}
69
76
  res << "stime=#{stime.to_i}"
70
77
  res << "etime=#{etime.to_i}" if etime.to_i.nonzero?
71
78
  res << "z=#{u params['z']}"
@@ -78,9 +85,15 @@ module GRI
78
85
 
79
86
  def mk_graph_tag stime, etime, rs, params
80
87
  if params['p'] == 't'
81
- rs.map {|rname|
82
- mk_graph_tag_r stime, etime, [rname], params
83
- }.join("\n")
88
+ if (tags = params.getvar 'tag')
89
+ tags.map {|tag|
90
+ mk_graph_tag_r stime, etime, [], params
91
+ }.join("\n")
92
+ else
93
+ rs.map {|rname|
94
+ mk_graph_tag_r stime, etime, [rname], params
95
+ }.join("\n")
96
+ end
84
97
  else
85
98
  mk_graph_tag_r stime, etime, rs, params
86
99
  end
@@ -160,10 +173,18 @@ module GRI
160
173
  cs = stime.strftime '%Y-%m-%d %H:%M:%S'
161
174
  ce = etime.strftime '%Y-%m-%d %H:%M:%S'
162
175
 
163
- r = params['r'] || ''
164
- host, @data_name, index = parse_host_key r
165
- rs = params.getvar 'r'
176
+ if (tags = params.getvar('tag')) and (grp = params['grp'])
177
+ gra_dir, = @options[:dirs]
178
+ rrdpaths = tags.inject([]) {|a, tag|
179
+ a += Dir.glob("#{gra_dir}/#{grp}/#{tag}/*.rrd")
180
+ }
181
+ r = File.basename rrdpaths.first
182
+ else
183
+ r = params['r'] || ''
184
+ end
185
+ host, @data_name, = parse_host_key r
166
186
 
187
+ rs = params.getvar('r') || []
167
188
  @title, body_title, headlegend =
168
189
  mk_page_title @options[:dirs], rs, params
169
190
 
@@ -190,6 +211,7 @@ module GRI
190
211
  <form enctype="application/x-www-form-urlencoded" method="get"
191
212
  action="<%= url_to '?' %>">
192
213
  <% rs.each {|r| -%><%= hidden 'r', r %><% } -%>
214
+ <% tags and tags.each {|tag| -%><%= hidden 'tag', tag %><% } -%>
193
215
  <% if params['grp'] then %><%= hidden 'grp', params['grp'] %><% end %>
194
216
  <% tzs = TZS -%>
195
217
  <% (tzs.assoc(params['tz']) || tzs[0])[2] = true -%>
@@ -210,7 +232,7 @@ Graph size: <%= popup_menu('z', nil, *zs) %>
210
232
  <% (tms.assoc(params['tm']) || tms[1])[2] = true -%>
211
233
  term: <%= popup_menu('tm', nil, *tms) %>
212
234
  <br/>
213
- <% if rs.size > 1 -%>
235
+ <% if rs.size > 1 or grp -%>
214
236
  <% c_ary = [['', 'sum'], ['s', 'stack'], ['v', 'overlay'], ['t', 'tile']] -%>
215
237
  <% (c_ary.assoc(params['p']) || c_ary[0])[2] = true -%>
216
238
  Composite type: <%= popup_menu('p', nil, *c_ary) %><br/>
@@ -66,7 +66,7 @@ module GRI
66
66
  pkeys.shift
67
67
  pts += ptargets[t]
68
68
  while (n = pts.shift)
69
- timeout(waittime) {sock = server_sock.accept}
69
+ Timeout.timeout(waittime) {sock = server_sock.accept}
70
70
  if (res = IO.select(nil, [sock], nil, 20))
71
71
  thost = targets[n].first
72
72
  sock.puts "#{n} #{thost}"
@@ -25,9 +25,11 @@ module GRI
25
25
 
26
26
  def process1 col_type, host, options
27
27
  return if Config['nop']
28
+ return if col_type == 'fluentd'
28
29
  collector = Collector.create(col_type, host, options,
29
30
  @fake_descr_hash) {|records|
30
31
  for writer in @writers
32
+ puts " writer #{writer.class}" if $debug
31
33
  writer.write records
32
34
  end
33
35
  @metrics[:record_count] += records.size
@@ -1,3 +1,3 @@
1
1
  module GRI
2
- VERSION = "10.0.8"
2
+ VERSION = "10.0.9"
3
3
  end
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  class TestCollector < Test::Unit::TestCase
20
20
  TEST_SYS = "0\x81\xF2\x02\x01\x01\x04\bpublic00\xA2\x81\xE2\x02" +
21
- "\x02\x03\xE9\x02\x01\x00\x02\x01\x000\x81\xD50d\x06\b+\x06\x01" +
21
+ "\x02\x03\xEA\x02\x01\x00\x02\x01\x000\x81\xD50d\x06\b+\x06\x01" +
22
22
  "\x02\x01\x01\x01\x00\x04XLinux xxxxx.yyyyy.zzz.com " +
23
23
  "X.X.XX-XXX.XX.X.XXX #1 SMP Thu Oct 31 12:00:00 EDT 2013 x86_64" +
24
24
  "0\x1F\x06\b+\x06\x01\x02\x01\x01\x05\x00\x04\x13xxxxx.yyyyy.zzz.com" +
@@ -22,7 +22,8 @@ class TestDockerCollector < Test::Unit::TestCase
22
22
 
23
23
  s = '{"GitCommit":"28ff62e/0.7.9","GoVersion":"go1.2","KernelVersion":"2.6.32-999.9.abc.x86_64","Version":"0.7.9"}'
24
24
  collector.on_read s + "\n"
25
-
25
+ end
26
+ def test_dummy
26
27
  end
27
28
  end
28
29
 
@@ -30,7 +30,8 @@ class TestFormatHelper < Test::Unit::TestCase
30
30
  def test_format_helper_mk_query
31
31
  ae '?a=1', mk_query(:a=>1)
32
32
  assert_match /\bb=a\+%26\b/, mk_query(:a=>1, :b=>'a &')
33
- assert_not_match /\bc=/, mk_query(:c=>nil)
33
+ #assert_not_match /\bc=/, mk_query(:c=>nil)
34
+ assert(/\bc=/ !~ mk_query(:c=>nil))
34
35
  end
35
36
 
36
37
  def test_format_helper_td
@@ -44,8 +45,10 @@ class TestFormatHelper < Test::Unit::TestCase
44
45
  end
45
46
 
46
47
  def test_format_helper_text_field
47
- ae '<input type="text" name="text" value="aaa" size="40"/>',
48
- text_field('text', 'aaa', 40, nil, nil)
48
+ t = text_field('text', 'aaa', 40, nil, nil)
49
+ s = t.scan(/\b(\w+="[^\"]+")/).flatten.sort
50
+ assert_equal ['name="text"', 'size="40"', 'type="text"', 'value="aaa"'], s
51
+ assert_match /<input\s+.*\/>/, t #/
49
52
  end
50
53
 
51
54
  def test_format_helper_popup_menu
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gri
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.8
4
+ version: 10.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - maebashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-04 00:00:00.000000000 Z
11
+ date: 2017-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  version: '0'
185
185
  requirements: []
186
186
  rubyforge_project:
187
- rubygems_version: 2.4.5
187
+ rubygems_version: 2.5.1
188
188
  signing_key:
189
189
  specification_version: 4
190
190
  summary: GRI