gri 10.0.1 → 10.0.2

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: 4eb6644b6a0c8a97bfc6bb59bdbcb67dfc3db587
4
- data.tar.gz: 5a686fa5f77d255b4a9d4632639445ce95b08d55
3
+ metadata.gz: d6ecf4515540adbc206c6edd80231b70ae252abf
4
+ data.tar.gz: e7137b4e6f903dc85815c59fe8af4cca4f23bdd8
5
5
  SHA512:
6
- metadata.gz: 1510485c0bd6cedfc980ea7d1b13752a20135127c2a771593f5f61009caed1452ce4f291ca2e6ca66b0b629e26b3ff91f5e7f3235073bb2b318f4b2a9f85d178
7
- data.tar.gz: a647d54ebf6b8084c0b6018da050f646826336d43b6c0c58d2b3ff4fd86faeffdfd92797a7a9ea68aa5a09bec2ae7ff6d5ef66b0a59c40a0cc9f5370398459b4
6
+ metadata.gz: 94603ec74475e84a731143d4331db05cfebbbcdad39c845ef24f0ffc0449645f5ab0a70eec151d529918815d11c12d6d199908b2040d56f9bc0efccd1a6998cd
7
+ data.tar.gz: c1458666f2d7d3735048471232f26649287cf62dd3c538328e89b78ca0c02cd611503e5bc3c5e984261589391567d8e9350add60818a8d0e488b36f32588cb72
data/.drone.yml ADDED
@@ -0,0 +1,7 @@
1
+ image: bradrydzewski/ruby:2.0.0
2
+ env:
3
+ - TZ=Asia/Tokyo
4
+ script:
5
+ - sudo apt-get install rrdtool
6
+ - bundle install
7
+ - bundle exec rake test
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/gri.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  $:.push File.expand_path("../lib", __FILE__)
3
2
  require "gri/version"
4
3
 
@@ -15,7 +14,6 @@ Gem::Specification.new do |s|
15
14
  ) }
16
15
  s.require_paths = ["lib"]
17
16
 
18
- # specify any dependencies here; for example:
19
-
17
+ s.add_development_dependency "msgpack"
20
18
  s.add_runtime_dependency "rack"
21
19
  end
@@ -24,6 +24,8 @@ module GRI
24
24
  'ifInUcastPkts', 'ifOutUcastPkts',
25
25
  'ifInNUcastPkts', 'ifOutNUcastPkts',],
26
26
  :index_key => 'ifDescr',
27
+ :ignore? => proc {|record|
28
+ /(^(Loopback|Null|Async)\d+)|cef layer|atm subif/ === record['ifDescr']},
27
29
  :exclude? => proc {|record|
28
30
  record['ifOperStatus'].to_i != 1 or
29
31
  record['ifSpeed'].to_i == 0 or
@@ -154,6 +156,8 @@ module GRI
154
156
 
155
157
  'hrStorage'=>{
156
158
  :oid=>['hrStorageEntry'],
159
+ :exclude? => proc {|record| record['hrStorageDescr'] =~ /devicemapper/},
160
+ :hidden? => proc {|record| record['hrStorageDescr'] =~ /devicemapper/},
157
161
  :tdb=>['hrStorage', 'hrStorageDescr', 'hrStorageSize', 'hrStorageUsed'],
158
162
  :fix_workhash=>lambda {|wh|
159
163
  if (h = wh[:hrStorage])
@@ -175,6 +179,22 @@ module GRI
175
179
  :composite=>['s', 'v', 't'],
176
180
  },
177
181
 
182
+ 'hrSWRunPerf'=>{
183
+ :puclass=>'HRSWRunPerf',
184
+ :oid=>['hrSWRunPath', 'hrSWRunParameters',
185
+ 'hrSWRunPerfCPU', 'hrSWRunPerfMem'],
186
+ :tdb=>['hrSWRunPerf', 'name', 'hrSWRunPerfCPU', 'hrSWRunPerfMem'],
187
+ :ds=>['hrSWRunPerfMem,mem,GAUGE,MAX,AREA,#40ff40',
188
+ 'hrSWRunPerfCPU,cputime,DERIVE,MAX,LINE1,#4444ff,,300',],
189
+ :prop=>{:name=>'hrSWRunPerfMatched',
190
+ :lastvalue=>'hrSWRunPerfMem', :cputime=>'hrSWRunPerfCPU'},
191
+ :list=>['RunPerf', '%N,%1024L\r'],
192
+ :composite=>['s', 'v', 't'],
193
+ :graph=>[['mem', 1024, nil, /mem/],
194
+ ['centisecond', 0, [0, nil], /cputime/]
195
+ ],
196
+ },
197
+
178
198
  :term => {
179
199
  :default=>[['Daily', 30*3600], ['Weekly', 8*24*3600],
180
200
  ['Monthly', 31*24*3600], ['Yearly', 365*24*3600]],
@@ -194,12 +214,17 @@ module GRI
194
214
  @specs = {}
195
215
  for k, dhash in self
196
216
  next unless String === k
197
- data_name = dhash[:data_name] || dhash[:cat] ||
217
+ data_name = dhash[:data_name] || dhash[:cat] || dhash[:pucat] ||
198
218
  (dhash[:tdb] and dhash[:tdb].first) ||
199
219
  k.gsub(/-/, '')
200
220
  spec = (@specs[data_name.to_s] ||= {})
221
+ if dhash[:tdb]
222
+ dhash[:tdb] = dhash[:tdb].map {|item|
223
+ (item =~ /\s+\*\s+/) ? Regexp.last_match.pre_match : item
224
+ }
225
+ end
201
226
  [:list, :index_key, :named_index, :tdb, :ds, :rra, :prop,
202
- :graph, :composite, :exclude?, :hidden?].each {|symkey|
227
+ :graph, :composite, :ignore?, :exclude?, :hidden?].each {|symkey|
203
228
  spec[symkey] = dhash[symkey] if dhash[symkey]
204
229
  }
205
230
  spec[:list] ||= dhash[:list_text] #XXX
data/lib/gri/collector.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  #require 'gri/utils'
2
2
  require 'gri/msnmp'
3
+ require 'gri/builtindefs'
3
4
  require 'gri/vendor'
4
5
  require 'gri/polling_unit'
5
6
 
@@ -77,8 +78,13 @@ module GRI
77
78
  @tout = 5
78
79
  @preq = nil
79
80
  @snmp = SNMP.new(@cname || @host, options['port'])
80
- @snmp.version = options['ver'] if options['ver']
81
- @snmp.community = options['community'] if options['community']
81
+ if options['fake-snmp']
82
+ require 'gri/fake_snmp'
83
+ @snmp = FakeSNMP.new options['fake-snmp']
84
+ else
85
+ @snmp.version = options['ver'] if options['ver']
86
+ @snmp.community = options['community'] if options['community']
87
+ end
82
88
 
83
89
  varbind = SYSOIDS
84
90
  get(varbind) {|results|
@@ -90,7 +96,11 @@ module GRI
90
96
  sysinfo['sysDescr'] and sysinfo['sysDescr'].gsub!("\n", ' ')
91
97
 
92
98
  vendor = Vendor.check sysinfo, options
93
- puts "snmp: #{host} (#{vendor.name}): #{vendor.options.inspect}" if $debug
99
+ if $debug
100
+ puts "snmp: #{host} (#{vendor.name}): #{sysinfo['sysDescr']}"
101
+ puts vendor.options.inspect
102
+ end
103
+
94
104
  @snmp.version = vendor.options['ver'] if vendor.options['ver']
95
105
  punits = vendor.get_punits
96
106
  punits_d = punits.dup
@@ -105,7 +115,12 @@ module GRI
105
115
  hfdh = @fake_descr_hash[host]
106
116
 
107
117
  @workhash[:interfaces] = @workhash[''] #
118
+ if $debug and ($debug['workhash'] or $debug['workhash0'])
119
+ puts " workhash0"
120
+ show_workhash @workhash
121
+ end
108
122
  for pu in punits_d
123
+ pu.options = vendor.options
109
124
  join_cat, join_key = pu.defs[:join]
110
125
  if join_cat
111
126
  for cat, wh in @workhash[pu.cat]
@@ -115,13 +130,22 @@ module GRI
115
130
  end
116
131
  end
117
132
  end
133
+ puts " fix_workhash #{pu.class} #{pu.name}" if $debug
118
134
  pu.fix_workhash @workhash
119
135
  end
120
136
  @workhash.delete :interfaces #
137
+ if $debug and ($debug['workhash'] or $debug['workhash1'])
138
+ puts " workhash1"
139
+ show_workhash @workhash
140
+ end
121
141
 
122
142
  for cat, wh in @workhash
123
- (specs = DEFS.get_specs cat) and
143
+ if (specs = DEFS.get_specs cat)
124
144
  (index_key = specs[:index_key] || specs[:named_index])
145
+ else
146
+ specs = {}
147
+ end
148
+ ign_proc = specs[:ignore?]
125
149
  for ind, h in wh
126
150
  h['_host'] = @hostname || host
127
151
  h['_key'] = if index_key
@@ -140,7 +164,7 @@ module GRI
140
164
  (prop = specs[:prop]) and (descr_k = prop[:description])
141
165
  h[descr_k] = f_descr
142
166
  end
143
- puts " record #{h.inspect}" if h['_d']
167
+ next if ign_proc and ign_proc.call(h)
144
168
  records.push h
145
169
  end
146
170
  end
@@ -164,9 +188,9 @@ module GRI
164
188
  cb.call
165
189
  else
166
190
  pu = punits.shift
167
- puts " poll #{host} #{pu.name}" if $debug
168
191
  @get_oid_buf = []
169
192
  oids = pu.oids.dup
193
+ puts " poll #{host} #{pu.name}" if $debug
170
194
  walk1(pu, oids) {poll1 punits, &cb}
171
195
  end
172
196
  end
@@ -189,6 +213,7 @@ module GRI
189
213
  walk1 pu, oids, &cb
190
214
  else
191
215
  walk(req_enoid) {|results|
216
+ show_results req_enoid, results if $debug and $debug['walk']
192
217
  results.each {|enoid, tag, val| pu.feed wh, enoid, tag, val}
193
218
  walk1 pu, oids, &cb
194
219
  }
@@ -196,6 +221,28 @@ module GRI
196
221
  end
197
222
  end
198
223
 
224
+ def show_workhash workhash
225
+ for cat, wh in workhash
226
+ puts " cat: #{cat.inspect}"
227
+ for ind, h in wh
228
+ puts " index: #{ind}"
229
+ for k, v in h
230
+ puts " #{k}: #{v.inspect}"
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ def show_results req_enoid, results
237
+ puts " req #{SNMP.enoid2name req_enoid}"
238
+ for enoid, tag, val in results
239
+ a = BER.dec_oid enoid
240
+ s = a[0..-2].join('.')
241
+ oid_ind = BER.enc_v_oid s
242
+ puts " res #{SNMP.enoid2name(enoid)} #{tag} #{val.inspect}"
243
+ end
244
+ end
245
+
199
246
  def walk enoid, &cb
200
247
  @results.clear
201
248
  @retry_count = 0
@@ -224,12 +271,15 @@ module GRI
224
271
 
225
272
  def send_req arg
226
273
  @preq = [@snmp.state, arg]
227
- s = @snmp.make_req @snmp.state, arg
228
- if @retry_count > 0
229
- Log.debug "retry send_req, #{@buffers.size}"
274
+ if (s = @snmp.make_req(@snmp.state, arg))
275
+ if @retry_count > 0
276
+ Log.debug "retry send_req, #{@buffers.size}"
277
+ end
278
+ @buffers.push s
279
+ loop.watch @snmp.sock, :w, @tout, self
280
+ else
281
+ on_readable
230
282
  end
231
- @buffers.push s
232
- loop.watch @snmp.sock, :w, @tout, self
233
283
  end
234
284
 
235
285
  def retry
@@ -0,0 +1,96 @@
1
+ module GRI
2
+ class FakeSock
3
+ def recv *arg; end
4
+ end
5
+
6
+ class FakeSNMP
7
+ attr_reader :state
8
+ attr_accessor :version
9
+
10
+ def initialize path
11
+ lines = File.readlines path
12
+ @lines = []
13
+ lines.each {|line|
14
+ oid, value = line.split ' = '
15
+ value = vconv value
16
+ enoid = BER.enc_v_oid oid[1..-1]
17
+ @lines.push [enoid, value] if value
18
+ }
19
+
20
+ @sock = FakeSock.new
21
+
22
+ @roids = SNMP::ROIDS
23
+ @state = :IDLE
24
+ end
25
+
26
+ def get_value enoid
27
+ (res = @lines.assoc enoid) ? res[1] : nil
28
+ end
29
+
30
+ def sock; @sock; end
31
+
32
+ def recv_msg msg
33
+ for arg in @get_buf
34
+ @cb.call *arg
35
+ end
36
+ @get_buf.clear
37
+ @state = :SUCCESS
38
+ nil
39
+ end
40
+
41
+ def get_start msg, &cb
42
+ @cb = cb
43
+ @state = :GET_REQ
44
+ @get_buf = []
45
+ tag, msg, = BER.tlv msg
46
+ while msg.size > 0
47
+ tag, val, msg = BER.tlv msg
48
+ if val.getbyte(0) == 6
49
+ len = val.getbyte(1)
50
+ enoid = val[2, len]
51
+ if (value = get_value(enoid))
52
+ @get_buf.push [enoid, value[0], value[1]]
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ def walk_start enoid, &cb
59
+ @cb = cb
60
+ @state = :GETBULK_REQ
61
+
62
+ @get_buf = []
63
+ for k, v in @lines
64
+ if k.index(enoid) == 0
65
+ @get_buf.push [k, v[0], v[1]]
66
+ end
67
+ end
68
+ end
69
+
70
+ def make_req state, arg
71
+ nil
72
+ end
73
+
74
+ def vconv str
75
+ case str
76
+ when /^INTEGER: (?:\w+\()?([-\d]+)/
77
+ [0x02, $1.to_i]
78
+ when /^STRING: "(.*)/
79
+ [0x04, $1[0..-2]]
80
+ when /^STRING: ([^"].*)/
81
+ [0x04, $1]
82
+ when /^OID: \.(1.*)/
83
+ enoid = BER.enc_v_oid $1
84
+ [0x06, enoid]
85
+ when /^Counter(?:32)?: (\d+)/
86
+ [0x41, $1.to_i]
87
+ when /^Gauge(?:\d+): ([-\d]+)/
88
+ [0x42, $1.to_i]
89
+ when /^Counter64: (\d+)/
90
+ [0x46, $1.to_i]
91
+ else
92
+ nil
93
+ end
94
+ end
95
+ end
96
+ end
data/lib/gri/graph.rb CHANGED
@@ -213,7 +213,7 @@ module GRI
213
213
  rrdpaths, total_ub = get_rrdpaths_and_ub rnames
214
214
 
215
215
  args = []
216
- if total_ub > 0
216
+ if total_ub > 0 and (params['p'] != 'v')
217
217
  args.push "-u #{total_ub} --alt-autoscale-max" if params['y'] == 'u'
218
218
  args.push "HRULE:#{total_ub}#ff0000"
219
219
  end
data/lib/gri/grapher.rb CHANGED
@@ -14,9 +14,9 @@ module GRI
14
14
  def initialize
15
15
  root_dir = Config['root-dir'] ||= Config::ROOT_PATH
16
16
  log_dir = Config['log-dir'] || Config['root-dir'] + '/log'
17
- Log.init "#{log_dir}/#{File.basename $0}.log"
17
+ Log.init "#{log_dir}/#{File.basename $0}.log", :no_dash=>true
18
18
  rescue SystemCallError
19
- Log.init '/tmp/grapher.log'
19
+ Log.init '/tmp/grapher.log', :no_dash=>true
20
20
  end
21
21
 
22
22
  def call env
data/lib/gri/ldb.rb CHANGED
@@ -32,6 +32,7 @@ module GRI
32
32
  if vymd >= ymd
33
33
  rtime = Time.local(vymd[0, 4], vymd[4, 2], vymd[6, 2])
34
34
  open(ymd_file, 'rb') {|f|
35
+ pos = 0 if f.stat.size < pos
35
36
  f.pos = pos
36
37
  while line = f.gets
37
38
  pos += line.size
data/lib/gri/list.rb CHANGED
@@ -74,7 +74,7 @@ module GRI
74
74
  sysdb = {}
75
75
  for dir in dirs
76
76
  values = LTSV.load_from_file(dir + '/.sysdb/sysdb.txt')
77
- values.inject(sysdb) {|h, v| h[v['_host']] = v; h}
77
+ values.inject(sysdb) {|h, v| v['_host'] and (h[v['_host']] = v); h}
78
78
  end
79
79
  sysdb
80
80
  end
data/lib/gri/log.rb CHANGED
@@ -36,7 +36,7 @@ module Log
36
36
  shift_size = options[:log_shift_size] || 100_000_000
37
37
  logger = Logger.new logdev, shift_age, shift_size
38
38
  logger.formatter = Log::Formatter.new
39
- logger.add Logger::INFO, '-'
39
+ logger.add Logger::INFO, '-' unless options[:no_dash]
40
40
  logger = Logger.new logdev
41
41
  logger.formatter = Log::Formatter.new
42
42
  logger.level = {'fatal'=>Logger::FATAL, 'error'=>Logger::ERROR,
data/lib/gri/main.rb CHANGED
@@ -30,9 +30,12 @@ module GRI
30
30
  GRI::Plugin.load_plugins plugin_dirs, @config
31
31
 
32
32
  log_dir = @config['log-dir'] || root_dir + '/log'
33
- Dir.mkdir log_dir unless File.exist? log_dir
34
- Log.init "#{log_dir}/#{optparser.program_name}.log",
35
- :log_level=>@config['log-level']
33
+ begin
34
+ Dir.mkdir log_dir unless File.exist? log_dir
35
+ Log.init "#{log_dir}/#{optparser.program_name}.log",
36
+ :log_level=>@config['log-level']
37
+ rescue SystemCallError
38
+ end
36
39
 
37
40
  @config['tra-dir'] ||= root_dir + '/tra'
38
41
  @config['gra-dir'] ||= root_dir + '/gra'
@@ -78,15 +81,17 @@ module GRI
78
81
 
79
82
  def optparse opts
80
83
  op = OptionParser.new
81
- op.on('--debug') {$debug = true; STDOUT.sync = true;
84
+ op.on('--debug [FLAGS]', String) {|arg| STDOUT.sync = true
85
+ a = (arg || '').split(/,/)
86
+ $debug = Hash[*(a.zip([true]*a.size).flatten)]
82
87
  opts['log-level'] = 'debug'}
83
- op.on('--Doption=STR') {|arg| (opts['Doption'] ||= []).push arg}
84
88
 
85
89
  op.on('--add-writer=WRITER') {|arg| (opts['writers'] ||= []).push arg}
86
90
  op.on('-O OPT_STR') {|arg| (opts['O'] ||= []).push arg}
87
91
  op.on('--collector') {opts['collector'] = true}
88
92
  op.on('--config-path=PATH') {|arg| opts[:config_path] = arg}
89
93
  op.on('--duration=SEC', Integer) {|arg| opts['duration'] = arg}
94
+ op.on('--fake-snmp=FILE') {|arg| opts['fake_snmp'] = arg}
90
95
  op.on('--gritab-path=PATH') {|arg| opts['gritab-path'] = arg}
91
96
  op.on('--host-pat=PAT', '-h') {|arg| (opts['host-pat'] ||= []).push arg}
92
97
  op.on('--interval=SEC', Integer) {|arg| opts['interval'] = arg}
data/lib/gri/msnmp.rb CHANGED
@@ -471,6 +471,9 @@ class SNMP
471
471
  end
472
472
 
473
473
  def enoid2name enoid
474
+ SNMP.enoid2name enoid
475
+ end
476
+ def self.enoid2name enoid
474
477
  a = BER.dec_oid enoid
475
478
  n = a.size
476
479
  n0 = n
data/lib/gri/plugin.rb CHANGED
@@ -4,8 +4,7 @@ module GRI
4
4
 
5
5
  def load_plugins dirs=[], config=nil
6
6
  @loaded = {}
7
- dirs += get_gem_dirs
8
- dirs.push File.join(File.dirname(__FILE__), 'plugin')
7
+ dirs = [File.join(File.dirname(__FILE__), 'plugin')] + get_gem_dirs + dirs
9
8
  dirs.each {|dir| load_plugin_dir dir, config}
10
9
  end
11
10
 
@@ -49,13 +48,14 @@ module GRI
49
48
  if defined?(::Gem::Specification) and
50
49
  Gem::Specification.respond_to?(:find_all)
51
50
  specs = Gem::Specification.find_all {|spec|
52
- spec.full_require_paths.map {|path|
53
- File.directory?(path + '/gri/plugin')}.any?
51
+ spec.require_paths.map {|path|
52
+ File.directory?("#{spec.gem_dir}/#{path}/gri/plugin")}.any?
54
53
  }.sort_by {|spec| spec.version}.reverse
55
54
  names = {}
56
55
  specs.each {|spec| names[spec.name] ||= spec}
57
56
  names.values.each {|spec|
58
- dirs += spec.full_require_paths.map {|path| path + '/gri/plugin'}
57
+ dirs += spec.require_paths.map {|path|
58
+ "#{spec.gem_dir}/#{path}/gri/plugin"}
59
59
  }
60
60
  elsif Gem.respond_to?(:searcher)
61
61
  specs = Gem.searcher.find_all 'gri/plugin/*.rb'
@@ -16,8 +16,8 @@ background:linear-gradient(to bottom, #ffd8d8 0%,#ffcccc 45%,#ffc0c0 100%);
16
16
  text-align:left;}
17
17
  hr {border:none;border-top:1px #cccccc solid;}
18
18
  </style>
19
- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
20
- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css">
19
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css">
20
+ <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap-theme.min.css">
21
21
  </head>
22
22
 
23
23
  <body>
@@ -34,9 +34,9 @@ hr {border:none;border-top:1px #cccccc solid;}
34
34
  <%= yield %>
35
35
  </div>
36
36
 
37
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">
37
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
38
38
  </script>
39
- <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
39
+ <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
40
40
  </body>
41
41
  </html>
42
42
  EOS
@@ -86,6 +86,8 @@ GRI::DEFS.update 'ucd-la'=>{:cat=>:l,
86
86
  },
87
87
  'ucd-dsk'=>{:cat=>:disk,
88
88
  :oid=>['dskEntry'],
89
+ :exclude? => proc {|record| record['dskPath'] =~ /devicemapper/},
90
+ :hidden? => proc {|record| record['dskPath'] =~ /devicemapper/},
89
91
  :tdb=>['d', 'dskPath', 'dskTotal', 'dskUsed', 'dskDevice'],
90
92
  :fix_workhash=>proc {|wh|
91
93
  for k, r in wh[:disk]
@@ -126,6 +128,12 @@ GRI::DEFS.update 'ucd-la'=>{:cat=>:l,
126
128
  'ucd-diskio'=>{:cat=>:diskio, :puclass=>'UCDDiskIO',
127
129
  :oid=>['diskIODevice', 'diskIOReads', 'diskIOWrites',
128
130
  'diskIONReadX', 'diskIONWrittenX'],
131
+ :ignore? => proc {|record|
132
+ record['diskIODevice'] =~ /^(diskIODevice|loop|ram|dm-)/ or
133
+ !(record['diskIODevice'])},
134
+ #:exclude? => proc {|record| record['diskIODevice'] =~ /^(loop|ram|dm-)/},
135
+ :hidden? => proc {|record|
136
+ record['diskIODevice'] =~ /^(diskIODevice|loop|ram|dm-)/},
129
137
  :tdb=>['diskIO', 'diskIODevice', 'diskIOReads', 'diskIOWrites',
130
138
  'diskIONReadX', 'diskIONWrittenX'],
131
139
  :ds=>['diskIOReads,reads,DERIVE,MAX,AREA,#90f090',
@@ -3,7 +3,7 @@ module GRI
3
3
  UNITS = {}
4
4
 
5
5
  attr_reader :name, :cat, :oids
6
- attr_accessor :dhash
6
+ attr_accessor :dhash, :ophash, :options
7
7
  alias :defs :dhash
8
8
 
9
9
  def self.all_units
@@ -12,15 +12,25 @@ module GRI
12
12
  next unless String === name
13
13
  pucat = dhash[:cat] || dhash[:pucat] ||
14
14
  (dhash[:tdb] and dhash[:tdb].first.intern) || name.intern
15
- puclass = dhash[:puclass]
16
- if puclass and Object.const_defined?(puclass + 'PollingUnit')
17
- klass = eval(puclass + 'PollingUnit')
18
- else
19
- klass = self
15
+ klass = self
16
+ if (puclass = dhash[:puclass])
17
+ if GRI.const_defined?("#{puclass}PollingUnit") or
18
+ Object.const_defined?("#{puclass}PollingUnit")
19
+ klass = eval("#{puclass}PollingUnit")
20
+ end
20
21
  end
21
22
  pu = klass.new name, pucat
22
23
  pu.dhash = dhash
23
24
  pu.set_oids dhash[:oid]
25
+ if dhash[:tdb]
26
+ dhash[:tdb].each {|item|
27
+ if item =~ /\s+\*\s+/
28
+ pre = Regexp.last_match.pre_match
29
+ post = Regexp.last_match.post_match
30
+ (pu.ophash ||= {})[pre] = proc {|val| val * post.to_f}
31
+ end
32
+ }
33
+ end
24
34
 
25
35
  self::UNITS[name] = pu
26
36
  end
@@ -31,6 +41,8 @@ module GRI
31
41
  def initialize name, cat
32
42
  @name = name
33
43
  @cat = cat
44
+ @options = {}
45
+ @ophash = nil
34
46
  @d_p = false
35
47
  end
36
48
 
@@ -43,7 +55,6 @@ module GRI
43
55
 
44
56
  def feed wh, enoid, tag, val
45
57
  if (feed_proc = dhash[:feed])
46
- puts " feed_proc #{[enid, tag, val].inspect}" if @d_p
47
58
  feed_proc.call wh, enoid, tag, val
48
59
  else
49
60
  if enoid.getbyte(-2) < 128
@@ -66,11 +77,10 @@ module GRI
66
77
  if (sym_oid = SNMP::ROIDS[oid_ind])
67
78
  (conv_val_proc = dhash[:conv_val]) and
68
79
  (val = conv_val_proc.call(sym_oid, val))
69
- (wh[ind] ||= {})[sym_oid] = val
70
- if @d_p
71
- wh[ind]['_d'] = true
72
- puts " feed #{[sym_oid, ind, tag, val].inspect}"
80
+ if ophash and (pr = ophash[sym_oid])
81
+ val = pr.call(val)
73
82
  end
83
+ (wh[ind] ||= {})[sym_oid] = val
74
84
  end
75
85
  end
76
86
  end
@@ -85,4 +95,29 @@ module GRI
85
95
  "#<PU:#{@name}>"
86
96
  end
87
97
  end
98
+
99
+ class HRSWRunPerfPollingUnit < PollingUnit
100
+ def fix_workhash workhash
101
+ re = (pat = options['hrSWRunPerf']) ? Regexp.new(pat) : nil
102
+ wh2 = {}
103
+ if (wh = workhash[:hrSWRunPerf])
104
+ del_keys = []
105
+ for k, v in wh
106
+ sw = "#{v['hrSWRunPath']} #{v['hrSWRunParameters']}"
107
+ if re =~ sw
108
+ matched = $&
109
+ idx = matched.gsub(/[\s\/]/, '_').gsub(/[^\w]/, '') #/
110
+ h = (wh2[idx] ||= {})
111
+ h['hrSWRunPerfMatched'] = matched
112
+ h['hrSWRunPerfMem'] ||= 0
113
+ h['hrSWRunPerfMem'] += v['hrSWRunPerfMem'].to_i * 1024
114
+ h['hrSWRunPerfCPU'] ||= 0
115
+ h['hrSWRunPerfCPU'] += v['hrSWRunPerfCPU'].to_i
116
+ end
117
+ end
118
+ workhash[:hrSWRunPerf] = wh2
119
+ end
120
+ super
121
+ end
122
+ end
88
123
  end
data/lib/gri/scheduler.rb CHANGED
@@ -24,6 +24,7 @@ module GRI
24
24
  end
25
25
 
26
26
  def process1 col_type, host, options
27
+ return if Config['nop']
27
28
  collector = Collector.create(col_type, host, options,
28
29
  @fake_descr_hash) {|records|
29
30
  for writer in @writers
data/lib/gri/spark.rb CHANGED
@@ -80,7 +80,6 @@ module GRI
80
80
  op = OptionParser.new
81
81
  op.on('--debug') {$debug = true; STDOUT.sync = true;
82
82
  opts['log-level'] = 'debug'}
83
- op.on('--Doption=STR') {|arg| (opts['Doption'] ||= []).push arg}
84
83
  op.on('-O OPT_STR') {|arg| (opts['O'] ||= []).push arg}
85
84
  op.on('-c', '--config-path=PATH') {|arg| opts[:config_path] = arg}
86
85
  op.on('--log-level=LEVEL') {|arg| opts['log-level'] = arg}
data/lib/gri/updater.rb CHANGED
@@ -147,7 +147,6 @@ module GRI
147
147
  end
148
148
  data = @record_keys.map {|key| record[key]}
149
149
  s = "#{time.to_i}:#{mk_update_str data}"
150
- puts " update #{@key} #{s}" if record['_d']
151
150
  @rrd.buffered_update s
152
151
 
153
152
  if (prop = @specs[:prop]) and (descr_k = prop[:description]) and
data/lib/gri/vendor.rb CHANGED
@@ -25,7 +25,7 @@ module GRI
25
25
  }
26
26
  end
27
27
  vdefs ||= {:name=>'unknown'}
28
- Vendor.new vdefs, sysinfo, options
28
+ self.new vdefs, sysinfo, options
29
29
  end
30
30
 
31
31
  def initialize vdefs, sysinfo, options
data/lib/gri/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GRI
2
- VERSION = "10.0.1"
2
+ VERSION = "10.0.2"
3
3
  end
@@ -0,0 +1,52 @@
1
+ .1.3.6.1.2.1.1.1.0 = STRING: Linux HOSTNAME.example.com 2.6.18
2
+ .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10
3
+ .1.3.6.1.2.1.1.5.0 = STRING: HOSTNAME.example.com
4
+ .1.3.6.1.2.1.2.1.0 = INTEGER: 3
5
+ .1.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1
6
+ .1.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2
7
+ .1.3.6.1.2.1.2.2.1.1.3 = INTEGER: 3
8
+ .1.3.6.1.2.1.2.2.1.2.1 = STRING: lo
9
+ .1.3.6.1.2.1.2.2.1.2.2 = STRING: eth0
10
+ .1.3.6.1.2.1.2.2.1.2.3 = STRING: eth1
11
+ .1.3.6.1.2.1.2.2.1.4.1 = INTEGER: 16436
12
+ .1.3.6.1.2.1.2.2.1.4.2 = INTEGER: 1500
13
+ .1.3.6.1.2.1.2.2.1.4.3 = INTEGER: 1500
14
+ .1.3.6.1.2.1.2.2.1.5.1 = Gauge32: 10000000
15
+ .1.3.6.1.2.1.2.2.1.5.2 = Gauge32: 1000000000
16
+ .1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 10000000
17
+ .1.3.6.1.2.1.2.2.1.7.1 = INTEGER: up(1)
18
+ .1.3.6.1.2.1.2.2.1.7.2 = INTEGER: up(1)
19
+ .1.3.6.1.2.1.2.2.1.7.3 = INTEGER: down(2)
20
+ .1.3.6.1.2.1.2.2.1.8.1 = INTEGER: up(1)
21
+ .1.3.6.1.2.1.2.2.1.8.2 = INTEGER: up(1)
22
+ .1.3.6.1.2.1.2.2.1.8.3 = INTEGER: down(2)
23
+ .1.3.6.1.2.1.2.2.1.10.1 = Counter32: 415914156
24
+ .1.3.6.1.2.1.2.2.1.10.2 = Counter32: 493985280
25
+ .1.3.6.1.2.1.2.2.1.10.3 = Counter32: 0
26
+ .1.3.6.1.2.1.2.2.1.11.1 = Counter32: 6057806
27
+ .1.3.6.1.2.1.2.2.1.11.2 = Counter32: 39093162
28
+ .1.3.6.1.2.1.2.2.1.11.3 = Counter32: 0
29
+ .1.3.6.1.2.1.2.2.1.12.1 = Counter32: 0
30
+ .1.3.6.1.2.1.2.2.1.12.2 = Counter32: 97254
31
+ .1.3.6.1.2.1.2.2.1.12.3 = Counter32: 0
32
+ .1.3.6.1.2.1.2.2.1.13.1 = Counter32: 0
33
+ .1.3.6.1.2.1.2.2.1.13.2 = Counter32: 0
34
+ .1.3.6.1.2.1.2.2.1.13.3 = Counter32: 0
35
+ .1.3.6.1.2.1.2.2.1.14.1 = Counter32: 0
36
+ .1.3.6.1.2.1.2.2.1.14.2 = Counter32: 0
37
+ .1.3.6.1.2.1.2.2.1.14.3 = Counter32: 0
38
+ .1.3.6.1.2.1.2.2.1.16.1 = Counter32: 315914156
39
+ .1.3.6.1.2.1.2.2.1.16.2 = Counter32: 2789307653
40
+ .1.3.6.1.2.1.2.2.1.16.3 = Counter32: 0
41
+ .1.3.6.1.2.1.2.2.1.17.1 = Counter32: 6057806
42
+ .1.3.6.1.2.1.2.2.1.17.2 = Counter32: 22196084
43
+ .1.3.6.1.2.1.2.2.1.17.3 = Counter32: 0
44
+ .1.3.6.1.2.1.2.2.1.18.1 = Counter32: 0
45
+ .1.3.6.1.2.1.2.2.1.18.2 = Counter32: 0
46
+ .1.3.6.1.2.1.2.2.1.18.3 = Counter32: 0
47
+ .1.3.6.1.2.1.2.2.1.19.1 = Counter32: 0
48
+ .1.3.6.1.2.1.2.2.1.19.2 = Counter32: 0
49
+ .1.3.6.1.2.1.2.2.1.19.3 = Counter32: 0
50
+ .1.3.6.1.2.1.2.2.1.20.1 = Counter32: 0
51
+ .1.3.6.1.2.1.2.2.1.20.2 = Counter32: 0
52
+ .1.3.6.1.2.1.2.2.1.20.3 = Counter32: 0
@@ -11,7 +11,7 @@ class TestBuiltinDEFS < Test::Unit::TestCase
11
11
  def setup
12
12
  end
13
13
 
14
- def test_get_spec
14
+ def test_get_specs
15
15
  specs = DEFS.get_specs 'num'
16
16
  ae '_index', specs[:prop][:name]
17
17
  ae 4, specs[:rra].size
@@ -19,6 +19,15 @@ class TestBuiltinDEFS < Test::Unit::TestCase
19
19
  ae 'ifInOctets,inoctet,DERIVE,MAX,AREA,#90f090,in,8', specs[:ds].first
20
20
  specs = DEFS.get_specs :l
21
21
  end
22
+
23
+ def test_get_specs_foo
24
+ specs = DEFS.get_specs :foo
25
+ assert_nil specs
26
+ DEFS.instance_eval {@specs = nil}
27
+ DEFS['foo'] = {:tdb=>['foo', 'xx * 10', 'yy', 'zz']}
28
+ specs = DEFS.get_specs :foo
29
+ ae ['foo', 'xx', 'yy', 'zz'], specs[:tdb]
30
+ end
22
31
  end
23
32
 
24
33
  end
@@ -27,7 +27,7 @@ class TestCollector < Test::Unit::TestCase
27
27
  "\x7F\xC9i\xA10\"\x06\b+\x06\x01\x02\x01\x01\x06\x00" +
28
28
  "\x04\x16xxxxx xxxx, xxxxx xxx."
29
29
 
30
- def test_snmp_collecotr
30
+ def test_snmp_collector
31
31
  c = Collector.create('snmp', 'testhost', {}) {|records|}
32
32
  snmp = MockSNMP.new 'testhost'
33
33
  c.instance_eval {
@@ -53,6 +53,20 @@ class TestCollector < Test::Unit::TestCase
53
53
  c.walk(enoid) {|enoid, tag, val|}
54
54
  ae :GETNEXT_REQ, snmp.state
55
55
  end
56
+
57
+ def test_snmp_collector_fake_snmp
58
+ opts = {'fake-snmp'=>File.join($test_dir, 'fake_snmp.txt')}
59
+ records = nil
60
+ c = Collector.create('snmp', 'testhost', opts) {|rs| records = rs}
61
+ c.attach MockLoop.new
62
+
63
+ sys = records.detect {|r| r['_key'] == 'SYS'}
64
+ ae 'HOSTNAME.example.com', sys['sysName']
65
+
66
+ eth0 = records.detect {|r| r['ifDescr'] == 'eth0'}
67
+ ae '_eth0', eth0['_key']
68
+ ae 1000000000, eth0['ifSpeed']
69
+ end
56
70
  end
57
71
 
58
72
  end
@@ -54,5 +54,24 @@ module GRI
54
54
  pu.fix_workhash workhash
55
55
  ae '192.168.0.1/255.255.255.0', wh[2]['ipaddr']
56
56
  end
57
+
58
+ def test_polling_unit_ophash
59
+ DEFS['foo'] = {:tdb=>['foo', 'fooX * 10', 'fooY', 'fooZ']}
60
+ PollingUnit::UNITS.clear
61
+ units = PollingUnit.all_units
62
+ pu = units['foo']
63
+ ae 50, pu.ophash['fooX'].call(5).to_i
64
+ assert_nil pu.ophash['fooY']
65
+
66
+ wh = {}
67
+ SNMP.update 'fooEntry'=>'1.3.6.1.4.1.99999.1',
68
+ 'fooX'=>'1.3.6.1.4.1.99999.1.1'
69
+ SNMP::ROIDS.clear
70
+ SNMP.new 'host'
71
+ enoid = BER.enc_v_oid(SNMP::OIDS['fooX'] + '.1')
72
+ pu.feed wh, enoid, 2, 3
73
+ r = wh[1]
74
+ ae 30, r['fooX'].to_i
75
+ end
57
76
  end
58
77
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gri
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.1
4
+ version: 10.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - maebashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-07 00:00:00.000000000 Z
11
+ date: 2014-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: msgpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rack
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -37,7 +51,9 @@ executables:
37
51
  extensions: []
38
52
  extra_rdoc_files: []
39
53
  files:
54
+ - ".drone.yml"
40
55
  - ".gitignore"
56
+ - Gemfile
41
57
  - MIT-LICENSE.txt
42
58
  - README.md
43
59
  - Rakefile
@@ -61,6 +77,7 @@ files:
61
77
  - lib/gri/collector.rb
62
78
  - lib/gri/config.rb
63
79
  - lib/gri/ds_list.rb
80
+ - lib/gri/fake_snmp.rb
64
81
  - lib/gri/format_helper.rb
65
82
  - lib/gri/gparams.rb
66
83
  - lib/gri/graph.rb
@@ -103,6 +120,7 @@ files:
103
120
  - lib/gri/writer.rb
104
121
  - mcollector
105
122
  - misc/Dockerfile
123
+ - test/fake_snmp.txt
106
124
  - test/mock.rb
107
125
  - test/root/gra/.sysdb/sysdb.txt
108
126
  - test/root/gra/testhost/.records.txt
@@ -162,11 +180,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
180
  version: '0'
163
181
  requirements: []
164
182
  rubyforge_project:
165
- rubygems_version: 2.2.0
183
+ rubygems_version: 2.2.2
166
184
  signing_key:
167
185
  specification_version: 4
168
186
  summary: GRI
169
187
  test_files:
188
+ - test/fake_snmp.txt
170
189
  - test/mock.rb
171
190
  - test/root/gra/.sysdb/sysdb.txt
172
191
  - test/root/gra/testhost/.records.txt