gri 10.0.2 → 10.0.3

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: d6ecf4515540adbc206c6edd80231b70ae252abf
4
- data.tar.gz: e7137b4e6f903dc85815c59fe8af4cca4f23bdd8
3
+ metadata.gz: abd70d1091e31de3ab3f392bc49cf25bd7359752
4
+ data.tar.gz: 4e2b0060b88f9ee99fe4735b707e950526f297ea
5
5
  SHA512:
6
- metadata.gz: 94603ec74475e84a731143d4331db05cfebbbcdad39c845ef24f0ffc0449645f5ab0a70eec151d529918815d11c12d6d199908b2040d56f9bc0efccd1a6998cd
7
- data.tar.gz: c1458666f2d7d3735048471232f26649287cf62dd3c538328e89b78ca0c02cd611503e5bc3c5e984261589391567d8e9350add60818a8d0e488b36f32588cb72
6
+ metadata.gz: 1464140edec6d228c6c64b2b8634c322dd6f1c9723b586550cfb70b3c1d778441628fb1b64aa629a4a67a8220585ef2e037e6940a3a6755237f511ed6be8eec4
7
+ data.tar.gz: d3a55bcf25504742047ca129a67f3cff38754c986c5942f881523425ea1a18af4457c2ef55950d231bd3c861a185edd270e7bd8b0d82f2c29a159cd4bed9b773
@@ -121,7 +121,7 @@ module GRI
121
121
  def get_targets_from_lines lines, config
122
122
  targets = Config.get_targets_from_lines lines
123
123
  goptions = Config.parse_options(*(config.getvar 'option'))
124
- goptions.merge!(Config.parse_options(*config['O']))
124
+ goptions.merge!(Config.parse_options(*config.getvar('O')))
125
125
  if config['host-pat']
126
126
  hosts_re = config.getvar('host-pat').map {|h| Regexp.new h}
127
127
  targets = targets.select {|host, | hosts_re.detect {|re| re === host}}
@@ -59,14 +59,17 @@ module GRI
59
59
  :composite=>['s', 'v', 't'],
60
60
  },
61
61
  'ifMIB'=>{:cat=>'',
62
- :oid=>['ifHCInOctets', 'ifHCOutOctets', 'ifHighSpeed', 'ifAlias'],
63
- :fix_workhash=>proc {|wh|
62
+ :oid=>['ifName', 'ifHCInOctets', 'ifHCOutOctets', 'ifHighSpeed', 'ifAlias'],
63
+ :fix_workhash=>proc {|wh, options|
64
64
  for k, r in wh['']
65
65
  r['ifInOctets'] = r['ifHCInOctets'] if r['ifHCInOctets']
66
66
  r['ifOutOctets'] = r['ifHCOutOctets'] if r['ifHCOutOctets']
67
67
  if r['ifHighSpeed'] and r['ifHighSpeed'].to_i > 4000
68
68
  r['ifSpeed'] = r['ifHighSpeed'].to_i * 1_000_000
69
69
  end
70
+ if options['ifname'] and r['ifName']
71
+ r['ifDescr'] = r['ifName']
72
+ end
70
73
  end
71
74
  },
72
75
  },
@@ -84,7 +87,7 @@ module GRI
84
87
  :fix_workhash => lambda {|wh|
85
88
  ifrecord = wh[''] || {}
86
89
  for k, record in wh[:ipaddr]
87
- a = k + '/' + record['mask']
90
+ a = k + '/' + (record['mask'] || '?')
88
91
  ind = record['ifIndex']
89
92
  if (r = ifrecord[ind])
90
93
  if r['ipaddr']
data/lib/gri/main.rb CHANGED
@@ -26,9 +26,6 @@ module GRI
26
26
  @options.each {|k, v| @config.setvar k.to_s, v}
27
27
  root_dir = @config['root-dir'] ||= Config::ROOT_PATH
28
28
 
29
- plugin_dirs = @config.getvar('plugin-dir') || [root_dir + '/plugin']
30
- GRI::Plugin.load_plugins plugin_dirs, @config
31
-
32
29
  log_dir = @config['log-dir'] || root_dir + '/log'
33
30
  begin
34
31
  Dir.mkdir log_dir unless File.exist? log_dir
@@ -37,6 +34,9 @@ module GRI
37
34
  rescue SystemCallError
38
35
  end
39
36
 
37
+ plugin_dirs = @config.getvar('plugin-dir') || [root_dir + '/plugin']
38
+ GRI::Plugin.load_plugins plugin_dirs, @config
39
+
40
40
  @config['tra-dir'] ||= root_dir + '/tra'
41
41
  @config['gra-dir'] ||= root_dir + '/gra'
42
42
  end
data/lib/gri/plugin.rb CHANGED
@@ -15,7 +15,12 @@ module GRI
15
15
  files.each {|fname|
16
16
  unless @loaded[fname]
17
17
  path = File.join dir, fname
18
- require path
18
+ begin
19
+ require path
20
+ rescue LoadError
21
+ Log.error "LoadError: #{$!}"
22
+ puts "LoadError: #{$!}" if $debug
23
+ end
19
24
  @loaded[fname] = path
20
25
  end
21
26
  }
@@ -0,0 +1,72 @@
1
+ if Object.const_defined? :RUBY_VERSION
2
+
3
+ begin
4
+
5
+ require 'net/http'
6
+ require 'json'
7
+ require 'gri/collector'
8
+
9
+ module GRI
10
+ class DockerCollector < Collector
11
+ TYPES['docker'] = self
12
+
13
+ def on_attach
14
+ now_i = Time.now.to_i
15
+
16
+ records = []
17
+ host = @hostname || @host
18
+ port = @options["docker-port"] || 2375
19
+ port = port.to_i
20
+ Net::HTTP.start(host, port) {|http|
21
+ res = http.get '/info'
22
+ if Net::HTTPSuccess === res
23
+ h = JSON.parse(res.body)
24
+ for k in ['Containers', 'Images',
25
+ 'NEventsListener', 'NFd', 'NGoroutines']
26
+ record = {'_host'=>host, '_time'=>now_i,
27
+ '_key'=>"num_docker_#{k}", 'num'=>h[k],
28
+ }
29
+ records.push record
30
+ end
31
+ end
32
+
33
+ res = http.get '/containers/json'
34
+ if Net::HTTPSuccess === res
35
+ a = JSON.parse(res.body)
36
+ for c in a
37
+ if (cinfo = get_container_info(http, c['Id']))
38
+ docker_hostname = cinfo['Config']['Hostname']
39
+ docker_image = cinfo['Config']['Image']
40
+ metrics = cinfo['Metrics']
41
+ record = {'_host'=>host, '_time'=>now_i, '_interval'=>@interval,
42
+ '_key'=>"docker_#{docker_hostname}"
43
+ }
44
+ for mkey, mvalues in metrics
45
+ for k, v in mvalues
46
+ record[k] = v
47
+ end
48
+ end
49
+ records.push record
50
+ end
51
+ end
52
+ end
53
+ }
54
+
55
+ @cb.call records
56
+ @loop.detach self
57
+ end
58
+
59
+ def get_container_info http, ctn_id
60
+ if Net::HTTPSuccess === (res = http.get "/containers/#{ctn_id}/json")
61
+ h = JSON.parse(res.body)
62
+ return h if h and h['Metrics']
63
+ end
64
+ nil
65
+ end
66
+ end
67
+ end
68
+
69
+ rescue LoadError
70
+ end
71
+
72
+ end
@@ -0,0 +1,15 @@
1
+ GRI::DEFS['interfaces'].update :ignore? => proc {|record|
2
+ /(^(|Loopback|Null|Async)\d+)|(^veth\w)|cef layer|atm subif/ ===
3
+ record['ifDescr']
4
+ },
5
+ :exclude? => proc {|record|
6
+ record['ifOperStatus'].to_i != 1 or
7
+ record['ifSpeed'].to_i == 0 or
8
+ (Integer(record['ifInOctets']) == 0 and
9
+ Integer(record['ifOutOctets']) == 0) or
10
+ /(^(|Loopback|Null|Async|lo)\d+)|(^veth\w)|cef layer|atm subif/ ===
11
+ record['ifDescr']
12
+ },
13
+ :hidden? => proc {|record|
14
+ /(^veth\w)|cef layer|atm subif|unrouted.VLAN/ === record['ifDescr']
15
+ }
@@ -0,0 +1,66 @@
1
+ require 'gri/writer'
2
+ require 'gri/utils'
3
+ require 'influxdb'
4
+
5
+ module GRI
6
+ class InfluxdbWriter < Writer
7
+ TYPES['influxdb'] = self
8
+
9
+ include Utils
10
+
11
+ def initialize options={}
12
+ @options = options
13
+ database = 'gri'
14
+ host = options[:influxdb_host] || 'localhost'
15
+ username = options[:influxdb_username] || 'root'
16
+ password = options[:influxdb_password] || 'root'
17
+
18
+ @db = InfluxDB::Client.new database, :host=>host,
19
+ :username=>username, :password=>password,
20
+ :time_precision=>'s'
21
+ dbs = @db.get_database_list
22
+ if (dbs.select {|h| h['name'] == 'gri'}).empty?
23
+ Log.info 'InfluxDB: create database'
24
+ @db.create_database 'gri'
25
+ end
26
+ @buf = {}
27
+ end
28
+
29
+ def write records
30
+ time = Time.now.to_i
31
+ for record in records
32
+ time = record.delete '_time'
33
+ #host = record.delete '_host'
34
+ key = record.delete '_key'
35
+ record.delete '_mtime'
36
+ record.delete '_interval'
37
+ data_name, index = parse_key key
38
+ next if data_name == 'SYS'
39
+ if data_name == ''
40
+ data_name = 'interfaces'
41
+ end
42
+ record.update :time=>time.to_i, :key=>index
43
+ buffered_write data_name, record
44
+ end
45
+ end
46
+
47
+ def buffered_write data_name, record
48
+ (ary = (@buf[data_name] ||= [])).push record
49
+ if ary.size > 1000
50
+ flush data_name, ary
51
+ end
52
+ end
53
+
54
+ def flush data_name, ary
55
+ while (sa = ary.take 10000; ary[0, 10000] = []; !sa.empty?)
56
+ @db.write_point data_name, sa
57
+ end
58
+ end
59
+
60
+ def finalize
61
+ for data_name, ary in @buf
62
+ flush data_name, ary
63
+ end
64
+ end
65
+ end
66
+ end
@@ -87,7 +87,11 @@ module GRI
87
87
 
88
88
  def fix_workhash workhash
89
89
  if (c = dhash[:fix_workhash])
90
- c.call workhash
90
+ if c.arity == 1
91
+ c.call workhash
92
+ elsif c.arity == 2
93
+ c.call workhash, @options
94
+ end
91
95
  end
92
96
  end
93
97
 
data/lib/gri/scheduler.rb CHANGED
@@ -45,6 +45,7 @@ module GRI
45
45
  @loop.attach collector
46
46
  rescue SystemCallError
47
47
  Log.error "#{host}: ERROR: #{$!}"
48
+ puts "#{host}: ERROR: #{$!}" if $debug
48
49
  @loop.detach collector
49
50
  end
50
51
  @metrics[:run_count] += 1
data/lib/gri/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GRI
2
- VERSION = "10.0.2"
2
+ VERSION = "10.0.3"
3
3
  end
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'mock'
4
+ require 'gri/plugin/docker_collector'
5
+
6
+ module GRI
7
+
8
+ class MockDockerCollector < DockerCollector
9
+ end
10
+
11
+ class TestDockerCollector < Test::Unit::TestCase
12
+ def _test_docker_collector
13
+ Collector::TYPES['docker'] = MockDockerCollector
14
+
15
+ host = 'dockerhost'
16
+ options = {'type'=>'docker'}
17
+ records = []
18
+ collector = Collector.create(options['type'], host, options) {|rs|
19
+ records += rs
20
+ }
21
+ assert_kind_of DockerCollector, collector
22
+
23
+ s = '{"GitCommit":"28ff62e/0.7.9","GoVersion":"go1.2","KernelVersion":"2.6.32-999.9.abc.x86_64","Version":"0.7.9"}'
24
+ collector.on_read s + "\n"
25
+
26
+ end
27
+ end
28
+
29
+ end
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.2
4
+ version: 10.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - maebashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-07 00:00:00.000000000 Z
11
+ date: 2014-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -96,11 +96,14 @@ files:
96
96
  - lib/gri/plugin.rb
97
97
  - lib/gri/plugin/bootstrap.rb
98
98
  - lib/gri/plugin/cisco.rb
99
+ - lib/gri/plugin/docker_collector.rb
99
100
  - lib/gri/plugin/exec_collector.rb
100
101
  - lib/gri/plugin/juniper.rb
101
102
  - lib/gri/plugin/netsnmp.rb
103
+ - lib/gri/plugin/suppress_veth.rb
102
104
  - lib/gri/plugin/ucdavis.rb
103
105
  - lib/gri/plugin/writer_fluentd.rb
106
+ - lib/gri/plugin/writer_influxdb.rb
104
107
  - lib/gri/polling_unit.rb
105
108
  - lib/gri/q.rb
106
109
  - lib/gri/request.rb
@@ -133,6 +136,7 @@ files:
133
136
  - test/test_builtindefs.rb
134
137
  - test/test_collector.rb
135
138
  - test/test_config.rb
139
+ - test/test_docker_collector.rb
136
140
  - test/test_ds_list.rb
137
141
  - test/test_exec_collector.rb
138
142
  - test/test_format_helper.rb
@@ -198,6 +202,7 @@ test_files:
198
202
  - test/test_builtindefs.rb
199
203
  - test/test_collector.rb
200
204
  - test/test_config.rb
205
+ - test/test_docker_collector.rb
201
206
  - test/test_ds_list.rb
202
207
  - test/test_exec_collector.rb
203
208
  - test/test_format_helper.rb