gri 10.0.0

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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/MIT-LICENSE.txt +20 -0
  4. data/README.md +132 -0
  5. data/Rakefile +5 -0
  6. data/bin/grapher +17 -0
  7. data/bin/gri +5 -0
  8. data/bin/gricast +17 -0
  9. data/bin/grispark +5 -0
  10. data/bin/griwalk +9 -0
  11. data/bin/trad +19 -0
  12. data/bin/trad-http +17 -0
  13. data/gri.gemspec +21 -0
  14. data/lib/fluent/plugin/out_gri.rb +56 -0
  15. data/lib/gri/api.rb +28 -0
  16. data/lib/gri/app_collector.rb +154 -0
  17. data/lib/gri/app_walker.rb +23 -0
  18. data/lib/gri/blank.rb +49 -0
  19. data/lib/gri/builtindefs.rb +211 -0
  20. data/lib/gri/cast.rb +84 -0
  21. data/lib/gri/cgraph.rb +37 -0
  22. data/lib/gri/clist.rb +163 -0
  23. data/lib/gri/collector.rb +284 -0
  24. data/lib/gri/config.rb +134 -0
  25. data/lib/gri/ds_list.rb +166 -0
  26. data/lib/gri/format_helper.rb +112 -0
  27. data/lib/gri/gparams.rb +43 -0
  28. data/lib/gri/graph.rb +239 -0
  29. data/lib/gri/grapher.rb +70 -0
  30. data/lib/gri/ldb.rb +160 -0
  31. data/lib/gri/list.rb +242 -0
  32. data/lib/gri/log.rb +140 -0
  33. data/lib/gri/loop.rb +109 -0
  34. data/lib/gri/ltsv.rb +58 -0
  35. data/lib/gri/main.rb +107 -0
  36. data/lib/gri/mlog.rb +22 -0
  37. data/lib/gri/mmsgpack.rb +57 -0
  38. data/lib/gri/msnmp.rb +601 -0
  39. data/lib/gri/page.rb +235 -0
  40. data/lib/gri/pcollector.rb +209 -0
  41. data/lib/gri/plugin.rb +75 -0
  42. data/lib/gri/plugin/bootstrap.rb +65 -0
  43. data/lib/gri/plugin/cisco.rb +98 -0
  44. data/lib/gri/plugin/exec_collector.rb +89 -0
  45. data/lib/gri/plugin/juniper.rb +5 -0
  46. data/lib/gri/plugin/netsnmp.rb +8 -0
  47. data/lib/gri/plugin/ucdavis.rb +176 -0
  48. data/lib/gri/plugin/writer_fluentd.rb +26 -0
  49. data/lib/gri/polling_unit.rb +88 -0
  50. data/lib/gri/q.rb +5 -0
  51. data/lib/gri/request.rb +29 -0
  52. data/lib/gri/rrd.rb +438 -0
  53. data/lib/gri/scheduler.rb +68 -0
  54. data/lib/gri/sgraph.rb +147 -0
  55. data/lib/gri/spark.rb +94 -0
  56. data/lib/gri/tra_collector.rb +80 -0
  57. data/lib/gri/trad.rb +170 -0
  58. data/lib/gri/updater.rb +201 -0
  59. data/lib/gri/util_daemon.rb +19 -0
  60. data/lib/gri/util_marshal.rb +13 -0
  61. data/lib/gri/utils.rb +63 -0
  62. data/lib/gri/vendor.rb +76 -0
  63. data/lib/gri/version.rb +3 -0
  64. data/lib/gri/wmain.rb +67 -0
  65. data/lib/gri/writer.rb +184 -0
  66. data/mcollector +47 -0
  67. data/test/mock.rb +60 -0
  68. data/test/root/gra/.sysdb/sysdb.txt +3 -0
  69. data/test/root/gra/testhost/.records.txt +2 -0
  70. data/test/root/if.def +2 -0
  71. data/test/root/test.conf +4 -0
  72. data/test/root/testtab +9 -0
  73. data/test/root/testtab2 +2 -0
  74. data/test/root/tra/testhost/_/20130614 +20 -0
  75. data/test/test_app.rb +58 -0
  76. data/test/test_builtindefs.rb +24 -0
  77. data/test/test_collector.rb +58 -0
  78. data/test/test_config.rb +62 -0
  79. data/test/test_ds_list.rb +48 -0
  80. data/test/test_exec_collector.rb +33 -0
  81. data/test/test_format_helper.rb +68 -0
  82. data/test/test_graph.rb +69 -0
  83. data/test/test_ldb.rb +29 -0
  84. data/test/test_list.rb +65 -0
  85. data/test/test_log.rb +16 -0
  86. data/test/test_loop.rb +35 -0
  87. data/test/test_ltsv.rb +38 -0
  88. data/test/test_main.rb +19 -0
  89. data/test/test_mmsgpack.rb +27 -0
  90. data/test/test_msnmp.rb +147 -0
  91. data/test/test_page.rb +51 -0
  92. data/test/test_pcollector.rb +71 -0
  93. data/test/test_plugin.rb +62 -0
  94. data/test/test_plugin_cisco.rb +23 -0
  95. data/test/test_polling_unit.rb +58 -0
  96. data/test/test_request.rb +26 -0
  97. data/test/test_rrd.rb +53 -0
  98. data/test/test_rrd_updater.rb +139 -0
  99. data/test/test_scheduler.rb +31 -0
  100. data/test/test_tra_collector.rb +40 -0
  101. data/test/test_trad.rb +33 -0
  102. data/test/test_util_marshal.rb +17 -0
  103. data/test/test_utils.rb +15 -0
  104. data/test/test_vendor.rb +40 -0
  105. data/test/test_writer.rb +33 -0
  106. data/test/unittest_helper.rb +27 -0
  107. metadata +208 -0
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'rack'
4
+ require 'gri/request'
5
+
6
+ module GRI
7
+
8
+ class TestRequest < Test::Unit::TestCase
9
+ def test_request
10
+ env = Rack::MockRequest.env_for '/?r=1&r=2'
11
+ req = GRI::Request.new env
12
+ ae({'r'=>'2'}, req.params)
13
+ ae ['1', '2'], req.gparams.getvar('r')
14
+ end
15
+
16
+ def test_request_parse_query
17
+ s = 'r=192.168.0.1__GigabitEthernet1-2&stime=-108000&z=&tz=&y=&g=0'
18
+ res = Rack::Utils.parse_query s
19
+ ae '192.168.0.1__GigabitEthernet1-2', res['r']
20
+ ae '-108000', res['stime']
21
+ ae '', res['z']
22
+ ae '0', res['g']
23
+ end
24
+ end
25
+
26
+ end
data/test/test_rrd.rb ADDED
@@ -0,0 +1,53 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'gri/rrd'
4
+
5
+ class TestRRD < Test::Unit::TestCase
6
+ def setup
7
+ @test_dir = File.expand_path(File.dirname(__FILE__))
8
+ end
9
+
10
+ def create_test_rrd path
11
+
12
+ end
13
+
14
+ def test_rrd_version
15
+ rrd = RRD.new
16
+ assert_match /\A1\.\d\z/, rrd.version
17
+ end
18
+
19
+ def test_remove_base_dir
20
+ args = 'foo', 'bar', '/usr/local/gri/gra/host/host.rrd'
21
+ rrd = RRD.new nil, nil
22
+ res = rrd.remove_base_dir *args
23
+ ae args, res
24
+ base_dir = '/usr/local/gri/gra'
25
+ rrd = RRD.new nil, base_dir
26
+ res = rrd.remove_base_dir *args
27
+ ae 'host/host.rrd', res[2]
28
+ base_dir = '/usr/local/gri/gra'
29
+ rrd = RRD.new nil, base_dir
30
+ res = rrd.remove_base_dir *args
31
+ ae 'host/host.rrd', res[2]
32
+ end
33
+
34
+ def test_rrd_create_and_graph
35
+ s = Time.local(2012,12,19,9)
36
+ rrd_path = '/var/tmp/test.rrd'
37
+ File.unlink rrd_path rescue nil
38
+ rrd = RRD.new
39
+ rrd.set_create_args rrd_path, s - 300, 300,
40
+ 'DS:number:GAUGE:600:U:U RRA:MAX:0.5:1:1000'
41
+ s.to_i.step((s+24*3600).to_i, 300) {|i|
42
+ rrd.buffered_update "#{i}:#{i%3600/300}"
43
+ }
44
+ rrd.flush_buffer
45
+
46
+ stime = Time.local(2012,12,19,9,0)
47
+ etime = Time.local(2012,12,20,9,0)
48
+ img = rrd.graphgen stime, etime,
49
+ ["DEF:number=#{rrd_path}:number:MAX", "LINE1:number#ff0000:id"]
50
+ open('/var/tmp/test.png', 'w') {|f| f.write img}
51
+ assert(img.size > 0)
52
+ end
53
+ end
@@ -0,0 +1,139 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'fileutils'
4
+ require 'gri/updater'
5
+ require 'gri/utils'
6
+
7
+ module GRI
8
+
9
+ class TestRRDUpdater < Test::Unit::TestCase
10
+ class MockRRD
11
+ attr_accessor :daemon
12
+ attr_reader :init_args, :updates
13
+
14
+ def initialize *args
15
+ @init_args = args
16
+ @updates = []
17
+ end
18
+
19
+ def set_create_args *args
20
+ @rrdname = args.shift
21
+ @args = args
22
+ end
23
+
24
+ def buffered_update s
25
+ @updates.push s
26
+ end
27
+ end
28
+
29
+ def setup
30
+ Config.init
31
+ @tmp_dir = File.expand_path(File.dirname(__FILE__) + '/.t')
32
+ Dir.mkdir @tmp_dir unless File.directory? @tmp_dir
33
+ end
34
+
35
+ def test_updater_get_tag_ary
36
+ Config['tag-rule'] = '/^((AA\d+)\s+\S+)/ aa $2.downcase $2'
37
+ Config['tag-rule'] = '/^((BB\d+)\s+\S+)/ bb $2.downcase $2'
38
+ res = Updater.get_tag_ary 'BB01 aaa'
39
+ ae 'bb01', res[0][1]
40
+ end
41
+
42
+ def test_updater_mk_rra_args
43
+ updater = GRI::RRDUpdater.new :data_name=>''
44
+ res = updater.mk_rra_args
45
+ ae ["RRA:AVERAGE:0.5:12:9000", "RRA:MAX:0.5:1:20000",
46
+ "RRA:MAX:0.5:12:9000", "RRA:MAX:0.5:144:2000"], res
47
+ Config['rra-max'] = '300 9999'
48
+ res = updater.mk_rra_args
49
+ ae ["RRA:MAX:0.5:300:9999"], res
50
+ end
51
+
52
+ def test_update_sysdb
53
+ path = "/tmp/.sysdb/sysdb.txt"
54
+ FileUtils.rm_r File.dirname(path), :force=>true
55
+ FileUtils.mkdir_p File.dirname(path)
56
+
57
+ sysdb = {}
58
+ Utils.update_ltsv_file path, '_host', sysdb
59
+ ae 0, File.size(path)
60
+ sysdb = {'host1'=>{'sysDescr'=>'Linux', '_host'=>'host1'}}
61
+ Utils.update_ltsv_file path, '_host', sysdb
62
+ sysdb = {'host2'=>{'sysDescr'=>'FreeBSD', '_host'=>'host2'}}
63
+ Utils.update_ltsv_file path, '_host', sysdb
64
+ FileUtils.rm_r File.dirname(path), :force=>true
65
+ end
66
+
67
+ def test_updater_create
68
+ data_name = 'num'
69
+ updater = GRI::RRDUpdater.new :data_name=>data_name
70
+ ds_specs = GRI::DEFS.get_specs(data_name)[:ds]
71
+ now_i = Time.now.to_i
72
+ time = now_i - now_i % 300
73
+ rrd = updater.create_rrd '/tmp/foo.rrd', time, 300, ds_specs, nil
74
+ assert_kind_of RRD, rrd
75
+ end
76
+
77
+ def test_updater_mk_ds_args
78
+ data_name = ''
79
+ updater = RRDUpdater.new :data_name=>data_name
80
+ specs = DEFS.get_specs data_name
81
+ ds_specs = specs[:ds]
82
+ ae 'ifInOctets,inoctet,DERIVE,MAX,AREA,#90f090,in,8', ds_specs.first
83
+ ds_args, record_keys = updater.mk_ds_args ds_specs, 300
84
+ ae 'DS:inoctet:DERIVE:750:U:U', ds_args.first
85
+ ae 'ifInOctets', record_keys.first
86
+ end
87
+
88
+ def test_updater_update1
89
+ dir = @tmp_dir
90
+ basename = 'foo_num_test'
91
+ rrd_path = "#{dir}/#{basename}.rrd"
92
+ File.unlink rrd_path rescue nil
93
+ data_name = 'num'
94
+ updater = GRI::RRDUpdater.new :data_name=>data_name,
95
+ :dir=>@tmp_dir, :host=>'foo', :index=>'test'
96
+
97
+ # mk_update_str
98
+ s = updater.mk_update_str [1, 2, 3, 4]
99
+ ae '1:2:3:4', s
100
+ s = updater.mk_update_str [1, 2, nil, 4]
101
+ ae '1:2:U:4', s
102
+ s = updater.mk_update_str [1, 'notnum', nil, 4]
103
+ ae '1:U:U:4', s
104
+
105
+ # update
106
+ time = Time.now.to_i
107
+ updater.update time, :number=>10
108
+ updater.close
109
+ assert File.exist?(rrd_path)
110
+ end
111
+
112
+ def test_updater_update2
113
+ updater = RRDUpdater.new :data_name=>'', :dir=>'/var/tmp',
114
+ :host=>'testhost', :index=>'eth0'
115
+ updater.rrd_class = MockRRD
116
+ time = Time.local(2013,4,1).to_i
117
+ record = {'ifDescr'=>'eth0', 'ifInOctets'=>10, 'ifOutOctets'=>20,
118
+ 'ifInErrors'=>1, 'ifOutErrors'=>0, 'ifOperStatus'=>1, 'ifSpeed'=>1}
119
+ updater.update time, record
120
+ ae '1364742000:10:20:U:U:1:0:U:U:U:U', updater.rrd.updates.first
121
+ end
122
+
123
+ def test_update_records_file
124
+ test_dir = File.expand_path(File.dirname(__FILE__))
125
+ org_path = test_dir + '/root/gra/testhost/.records.txt'
126
+ path = '/var/tmp/.records.txt'
127
+ FileUtils.cp org_path, path
128
+
129
+ h = {'new'=>{'_key'=>'new', 'a'=>1}}
130
+ Utils.update_ltsv_file path, '_key', h
131
+
132
+ rs = GRI::Utils.load_records File.dirname(path)
133
+ ae '1', rs['new']['a']
134
+
135
+ File.unlink path
136
+ end
137
+ end
138
+
139
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'socket'
4
+ require 'mock'
5
+ require 'gri/log'
6
+ require 'gri/scheduler'
7
+ require 'gri/collector'
8
+
9
+ module GRI
10
+
11
+ class MockCollector < Collector
12
+ TYPES['mock'] = self
13
+ end
14
+
15
+ class TestScheduler < Test::Unit::TestCase
16
+ def setup
17
+ loop = MockLoop.new
18
+ metrics = Hash.new 0
19
+ @scheduler = Scheduler.new loop, metrics
20
+ end
21
+
22
+ def test_scheduler_process1
23
+ options = {}
24
+ metrics = @scheduler.instance_eval {@metrics}
25
+ ae 0, metrics[:run_count]
26
+ @scheduler.process1 'mock', 'testhost', options
27
+ ae 1, metrics[:run_count]
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'mock'
4
+ require 'gri/tra_collector'
5
+
6
+ module GRI
7
+
8
+ class MockWriter
9
+ attr_reader :record_count
10
+ def initialize
11
+ @record_count = 0
12
+ end
13
+
14
+ def write records
15
+ @record_count += records.size
16
+ end
17
+ end
18
+
19
+ class TestTraCollector < Test::Unit::TestCase
20
+ def setup
21
+ @root_dir = File.dirname(__FILE__) + '/root'
22
+ end
23
+
24
+ def test_tra_collector
25
+ config = {}
26
+ writer = MockWriter.new
27
+ collector = Collector.create('tra', 'testhost', {}) {|records|
28
+ writer.write records
29
+ }
30
+ dir = @root_dir + '/gra/testhost'
31
+ Dir.glob(dir + '/.lu_*') {|path| File.unlink path}
32
+ db = LocalLDB.new "#{@root_dir}/tra/testhost"
33
+ options = {}
34
+ ae 0, writer.record_count
35
+ collector.update_rrd_dir dir, db, options
36
+ ae 20, writer.record_count
37
+ end
38
+ end
39
+
40
+ end
data/test/test_trad.rb ADDED
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'rack'
4
+ require 'gri/trad'
5
+
6
+ module GRI
7
+
8
+ class TestTrad < Test::Unit::TestCase
9
+ def setup
10
+ Config.init
11
+ test_root = File.expand_path(File.dirname(__FILE__) + '/root')
12
+ Config['tra-dir'] = test_root + '/tra'
13
+ Config['gritab-path'] = test_root + '/testtab'
14
+ @trad = Trad.new
15
+ Rack::MockRequest::DEFAULT_ENV['REMOTE_ADDR'] = '127.0.0.1'
16
+ @app = Rack::MockRequest.new @trad
17
+ end
18
+
19
+ def test_trad_get
20
+ res = @app.get '/get?h=testhost&s=&t=1371178800'
21
+ ae 200, res.status
22
+ a = res.body.scan(/ifInOctets:(\d+)/)
23
+ ae a.first.first, '27497623151'
24
+ ae a.last.first, '27498895868'
25
+ end
26
+
27
+ def test_trad_gritab
28
+ res = @app.get '/gritab'
29
+ assert_match /\Alocalhost\s/, res.body.split(/\n/).first
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'gri/util_marshal'
4
+
5
+ module GRI
6
+
7
+ class TestUtilMarshal < Test::Unit::TestCase
8
+ def test_util_marshal
9
+ obj = {'a'=>10, :a=>[nil, 1, 2]}
10
+ path = '/tmp/test.dump'
11
+ Marshal.dump_to_file obj, path
12
+ newobj = Marshal.load_from_file path
13
+ ae obj, newobj
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'gri/utils'
4
+
5
+ module GRI
6
+
7
+ class TestUtils < Test::Unit::TestCase
8
+ def test_key_encode
9
+ s = '1/1'
10
+ r = GRI::Utils.key_encode s
11
+ ae '1-1', r
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'gri/builtindefs'
4
+ require 'gri/msnmp'
5
+ require 'gri/vendor'
6
+ require 'gri/plugin/ucdavis'
7
+ require 'gri/plugin/netsnmp'
8
+
9
+ module GRI
10
+
11
+ class TestVendor < Test::Unit::TestCase
12
+ def test_vendor
13
+ sysinfo = {}
14
+ vendor = Vendor.check sysinfo
15
+ ae 'unknown', vendor.name
16
+ sysinfo = {'sysObjectID'=>''}
17
+ vendor = Vendor.check sysinfo
18
+ ae 'unknown', vendor.name
19
+
20
+ sysinfo = {"sysName"=>"testhost.example.com",
21
+ "sysObjectID"=>"+\006\001\004\001\277\b\003\002\n",
22
+ "sysLocation"=>"Right here, right now.",
23
+ "sysDescr"=>"Linux testhost.example.com 2.6.18-274.12.1.el5PAE #1 SMP Tue Nov 29 14:16:58 EST 2011 i686",
24
+ "sysUpTime"=>1000000000}
25
+
26
+ vendor = Vendor.check sysinfo
27
+ assert vendor.options['interfaces']
28
+ assert vendor.options['ifMIB']
29
+ assert vendor.options['ucd-la']
30
+ assert vendor.options['ucd-memory']
31
+ assert_nil vendor.options['notexist']
32
+ ae '2c', vendor.options['ver']
33
+ ae 'Linux', sysinfo['_firm']
34
+
35
+ vendor = Vendor.check sysinfo, 'interfaces'=>false
36
+ assert !vendor.options['interfaces']
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'fileutils'
4
+
5
+ require 'gri/writer'
6
+
7
+ module GRI
8
+
9
+ class Writer
10
+ attr_reader :options
11
+ end
12
+
13
+ class TestWriter < Test::Unit::TestCase
14
+ def test_writer
15
+ tra_dir = '/tmp'
16
+ writer = Writer.create 'ldb', :tra_dir=>tra_dir, :tra_expire_day=>1
17
+ assert_kind_of TextWriter, writer
18
+
19
+ hdir = tra_dir + '/testhost'
20
+ FileUtils.rm_r hdir, :force=>true
21
+ records = [{'_host'=>'testhost', '_key'=>'SYS', '_sysdescr'=>'TEST'}]
22
+ writer.write records
23
+ writer.finalize
24
+ sysdir = hdir + '/SYS_'
25
+ fname = Dir.glob(sysdir + '/*').first
26
+ str = File.read fname
27
+ assert_match /_sysdescr:TEST/, str
28
+ writer.purge_logs
29
+ FileUtils.rm_r hdir, :force=>true
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ begin
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ rescue LoadError
6
+ end
7
+ require 'test/unit'
8
+ require 'pp'
9
+
10
+ $test_dir = File.expand_path File.dirname(__FILE__)
11
+ $:.unshift $test_dir
12
+ $:.unshift($test_dir + '/../lib')
13
+ require 'gri/q'
14
+ $test = true
15
+ #$debug = true
16
+
17
+ module Test
18
+ module Unit
19
+ module Assertions
20
+ alias ae assert_equal
21
+ end
22
+ end
23
+ end
24
+
25
+ unless ARGV.grep(/--show-log/).empty?
26
+ $show_log = true
27
+ end