fluent-plugin-dstat 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,16 +1,40 @@
1
- = fluent-plugin-dstat
1
+ = Dstat plugin for Fluent
2
2
 
3
3
  Description goes here.
4
4
 
5
- == Contributing to fluent-plugin-dstat
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
- * Fork the project
10
- * Start a feature/bugfix branch
11
- * Commit and push until you are happy with your contribution
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
5
+ == What's Dstat?
6
+
7
+ Dstat is a versatile replacement for vmstat, iostat, netstat and ifstat.
8
+ If you need more detail, see here[http://dag.wieers.com/home-made/dstat]
9
+ This plugin use Dstat, so you need to install Dstat before using this plugin.
10
+
11
+ == Configuration
12
+
13
+ <source>
14
+ type dstat
15
+ tag dstat
16
+ option -c 3
17
+ </source>
18
+
19
+ * option:option for dstat command(default: -fcdnm 1)
20
+
21
+ == Output Format
22
+
23
+ When you use option -c, you get structured output data like below.
24
+
25
+ {
26
+ "hostname":"tsukuba000",
27
+ "dstat":{"total-cpu-usage":{"usr":"0",
28
+ "sys":"0",
29
+ "idl":"100",
30
+ "wai":"0",
31
+ "hiq":"0",
32
+ "siq":"0"}}
33
+ }
34
+
35
+ == Supported options
36
+
37
+ aio, cpu, cpu24, disk, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold, sys, tcp, udp, unix, vm, disk-tps, disk-util, dstat-cpu, dstat-ctxt, dstat-mem, freespace, top-bio, top-childwait, top-cpu,top-io, top-mem, top-oom, utmp, top-io -fc
14
38
 
15
39
  == Copyright
16
40
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.1.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "fluent-plugin-dstat"
8
- s.version = "0.0.3"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Shunsuke Mikami"]
12
- s.date = "2011-12-01"
12
+ s.date = "2012-01-12"
13
13
  s.email = "shun0102@gmail.com"
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE.txt",
@@ -1,7 +1,23 @@
1
1
  module Fluent
2
2
 
3
-
4
3
  class DstatInput < Input
4
+
5
+ def split_second_key(str)
6
+ result = []
7
+ while (str)
8
+ index = /[^ ] / =~ str
9
+ if index
10
+ result << str[0..index]
11
+ else
12
+ result << str unless str == " "
13
+ return result
14
+ end
15
+ str = str[(index + 1)..-1]
16
+ end
17
+
18
+ return result
19
+ end
20
+
5
21
  Plugin.register_input('dstat', self)
6
22
 
7
23
  def initialize
@@ -9,14 +25,16 @@ class DstatInput < Input
9
25
  @hostname = `hostname -s`.chomp!
10
26
  @line_number = 0
11
27
  @first_keys = []
28
+ @second_keys = []
12
29
  end
13
30
 
14
31
  config_param :tag, :string
15
- config_param :option, :string, :default => "-fcdnm 1"
32
+ config_param :option, :string, :default => "-fcdnm"
33
+ config_param :delay, :integer, :default => 1
16
34
 
17
35
  def configure(conf)
18
36
  super
19
- @command = "dstat #{@option}"
37
+ @command = "dstat #{@option} #{@delay}"
20
38
  end
21
39
 
22
40
  def start
@@ -46,23 +64,50 @@ class DstatInput < Input
46
64
 
47
65
  case @line_number
48
66
  when 0
49
- @first_keys = line.split(" ").map {|i| i.gsub(/^-+|-+$/, "") }
67
+ @first_keys = line.split(" ")
50
68
  when 1
51
- @second_keys = Array.new( @first_keys.length, nil)
52
- line.split(/[:\|]/).each_with_index do |i, index|
53
- keys = i.split(" ")
54
- @second_keys[index] = keys
69
+ index = 0
70
+ @first_keys.each do |i|
71
+ @second_keys << line[index..(index + i.length - 1)]
72
+ index += i.length + 1
55
73
  end
56
74
  else
57
75
  hash = Hash.new()
58
- line.split(/[:\|]/).each_with_index do |i, index|
59
- keys = i.split(" ")
76
+ values = []
77
+ index = 0
78
+ @first_keys.each do |i|
79
+ values << line[index..(index + i.length - 1)]
80
+ index += i.length + 1
81
+ end
82
+
83
+ @first_keys.each_with_index do |i, index|
60
84
  value_hash = Hash.new()
61
- @second_keys[index].each_with_index do |j, second_index|
62
- value_hash[j] = keys[second_index]
85
+ first = i.gsub(/^-+|-+$/, "")
86
+ length = i.length
87
+
88
+ if first == "most-expensive"
89
+ s_key = @second_keys[index].gsub(/^\s+|\s+$/, "")
90
+ value_hash[s_key] = values[index]
91
+ else
92
+ keys = split_second_key(@second_keys[index])
93
+ second_index = 0
94
+
95
+ keys.each do |i|
96
+ next_index = second_index + i.length - 1
97
+ value = values[index][second_index..next_index]
98
+ second_index += i.length + 1
99
+ value = value.gsub(/^\s+|\s+$/, "") if value
100
+ value_hash[i.gsub(/^\s+|\s+$/, "")] = value
101
+ end
102
+ end
103
+
104
+ if hash[first].nil?
105
+ hash[first] = value_hash
106
+ else
107
+ hash[first] = hash[first].merge(value_hash)
63
108
  end
64
- hash[@first_keys[index]] = value_hash
65
109
  end
110
+
66
111
  record = {
67
112
  'hostname' => @hostname,
68
113
  'dstat' => hash
@@ -5,9 +5,18 @@ class DstatInputTest < Test::Unit::TestCase
5
5
  Fluent::Test.setup
6
6
  end
7
7
 
8
+ OPTIONS = ["aio", "cpu", "cpu24", "disk",
9
+ "epoch", "fs", "int", "int24", "io", "ipc", "load", "lock",
10
+ "mem", "net", "page", "page24", "proc", "raw", "socket",
11
+ "swap", "swapold", "sys", "tcp", "udp", "unix", "vm",
12
+ "disk-tps", "disk-util", "dstat-cpu", "dstat-ctxt", "dstat-mem", "freespace",
13
+ "top-bio", "top-childwait", "top-cpu","top-io",
14
+ "top-mem", "top-oom", "utmp", "top-io -fc"]
15
+
8
16
  CONFIG = %[
9
17
  tag dstat
10
- option -fcdnm 1
18
+ option --aio -cpu
19
+ delay 1
11
20
  ]
12
21
 
13
22
  def create_driver(conf=CONFIG)
@@ -16,17 +25,35 @@ class DstatInputTest < Test::Unit::TestCase
16
25
 
17
26
  def test_configure
18
27
  d = create_driver
19
- assert_equal "-fcdnm 1", d.instance.option
28
+ assert_equal 1, d.instance.delay
20
29
  end
21
30
 
22
31
  def test_emit
23
- d = create_driver
32
+
33
+ OPTIONS.each do |op|
34
+ #emit_with_conf(CONFIG)
35
+ conf = "tag dstat\n option --#{op}\n delay 1"
36
+ emit_with_conf(conf)
37
+ end
38
+
39
+ end
40
+
41
+ def emit_with_conf(conf)
42
+ d = create_driver(conf)
24
43
 
25
44
  d.run do
26
45
  sleep 2
27
46
  end
28
47
 
48
+ length = `dstat #{d.instance.option} #{d.instance.delay} 1`.split("\n")[0].split("\s").length
49
+
29
50
  emits = d.emits
30
51
  assert_equal true, emits.length > 0
52
+ assert_equal length, emits[0][2]['dstat'].length
53
+
54
+ puts "--- #{d.instance.option} ---"
55
+ puts emits[0][2]
56
+ puts "--- end ---"
31
57
  end
58
+
32
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-dstat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-01 00:00:00.000000000Z
12
+ date: 2012-01-12 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
16
- requirement: &15374440 !ruby/object:Gem::Requirement
16
+ requirement: &22315940 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.10.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *15374440
24
+ version_requirements: *22315940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rdoc
27
- requirement: &15373460 !ruby/object:Gem::Requirement
27
+ requirement: &22315460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *15373460
35
+ version_requirements: *22315460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &15342660 !ruby/object:Gem::Requirement
38
+ requirement: &22314980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *15342660
46
+ version_requirements: *22314980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &15341480 !ruby/object:Gem::Requirement
49
+ requirement: &22314500 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *15341480
57
+ version_requirements: *22314500
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &15340500 !ruby/object:Gem::Requirement
60
+ requirement: &22314020 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *15340500
68
+ version_requirements: *22314020
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &15339620 !ruby/object:Gem::Requirement
71
+ requirement: &22313540 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *15339620
79
+ version_requirements: *22313540
80
80
  description:
81
81
  email: shun0102@gmail.com
82
82
  executables: []
@@ -110,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
110
  version: '0'
111
111
  segments:
112
112
  - 0
113
- hash: -2536050256067886842
113
+ hash: 3115706696286106192
114
114
  required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  none: false
116
116
  requirements: