gri 10.0.2 → 10.0.3

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: 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