fluent-plugin-mongostat 0.0.2
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +39 -0
- data/Rakefile +10 -0
- data/fluent-plugin-mongostat.gemspec +25 -0
- data/lib/fluent/plugin/in_mongostat.rb +156 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 60548e2a5d64ae18b3822d376864e956bb50e2a3
|
4
|
+
data.tar.gz: 228b60a334d5585892dcbbf95b9b17a2bbb81ad5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b54e0ee15829cf5967f207a2131fe513a86b0aabdfb3be8bc856537b34b854a87b7fca3f0b22a7e7903e261f968d5153dff71e1fbcfe0836bdd2cb2809cc4563
|
7
|
+
data.tar.gz: 7ccd03eb9fe4f1b7dea2f95acbe601bf4e28e68987cc4fc010253992c7ec856cd287a657087be8873d5920de13f44da4d5bfacd0684c2aba0c36d35e160b1c57
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Fluent::Plugin::Mongostat, a plugin for Fluentd
|
2
|
+
|
3
|
+
[](https://circleci.com/gh/alice02/fluent-plugin-mongostat)
|
4
|
+
|
5
|
+
## Overview
|
6
|
+
- mongostat log input plugin for fluentd
|
7
|
+
|
8
|
+
|
9
|
+
## Dependencies
|
10
|
+
- mongostat >= 3.0.0
|
11
|
+
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
```
|
15
|
+
$ fluent-gem install fluent-plugin-mongostat
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
In your Fluentd configuration, use `@type mongostat`.
|
20
|
+
```
|
21
|
+
<source>
|
22
|
+
@type mongostat
|
23
|
+
tag mongostat.log
|
24
|
+
refresh_interval 10
|
25
|
+
</source>
|
26
|
+
```
|
27
|
+
|
28
|
+
## Configuration
|
29
|
+
### tag
|
30
|
+
the tag of event.
|
31
|
+
- default: mongostat
|
32
|
+
|
33
|
+
### option
|
34
|
+
Option for mongostat command.
|
35
|
+
- default: None
|
36
|
+
|
37
|
+
### refresh_interval
|
38
|
+
Interval of get mongostat metrics.
|
39
|
+
- default: 30
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "fluent-plugin-mongostat"
|
7
|
+
spec.version = "0.0.2"
|
8
|
+
spec.authors = ["Kouta Asai"]
|
9
|
+
|
10
|
+
spec.summary = %q{fluentd input plugin for mongostat.}
|
11
|
+
spec.description = %q{fluentd input plugin for mongostat.}
|
12
|
+
|
13
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
14
|
+
f.match(%r{^(test|spec|features)/})
|
15
|
+
end
|
16
|
+
spec.bindir = "exe"
|
17
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.13"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "minitest"
|
23
|
+
spec.add_development_dependency "test-unit"
|
24
|
+
spec.add_runtime_dependency "fluentd"
|
25
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'fluent/input'
|
2
|
+
require 'open3'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Fluent
|
6
|
+
class MongostatInput < Input
|
7
|
+
|
8
|
+
Fluent::Plugin.register_input('mongostat', self)
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
unless method_defined?(:router)
|
15
|
+
define_method('router') { Fluent::Engine }
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'The command line options of mongostat'
|
19
|
+
config_param :option, :string, default: nil
|
20
|
+
desc 'The interval of refreshing'
|
21
|
+
config_param :refresh_interval, :integer, default: 30
|
22
|
+
desc 'The tag of the event'
|
23
|
+
config_param :tag, :string, default: 'mongostat'
|
24
|
+
|
25
|
+
def configure(conf)
|
26
|
+
super
|
27
|
+
|
28
|
+
if !mongostat_exists?
|
29
|
+
raise ConfigError, '"mongostat" command not found.'
|
30
|
+
end
|
31
|
+
|
32
|
+
@command = %(mongostat #{@option} --json #{@refresh_interval})
|
33
|
+
@hostname = get_hostname
|
34
|
+
end
|
35
|
+
|
36
|
+
def start
|
37
|
+
super
|
38
|
+
@thread = Thread.new(&method(:run))
|
39
|
+
end
|
40
|
+
|
41
|
+
def shutdown
|
42
|
+
super
|
43
|
+
Thread.kill(@thread)
|
44
|
+
end
|
45
|
+
|
46
|
+
def run
|
47
|
+
Open3.popen3(@command) do |i, o, e, w|
|
48
|
+
o.each do |line|
|
49
|
+
status = parse_line(line)
|
50
|
+
router.emit(@tag, Fluent::Engine.now, status)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def parse_line(line)
|
56
|
+
begin
|
57
|
+
json_hash = JSON.parse(line.delete('*'))
|
58
|
+
rescue JSON::ParserError
|
59
|
+
raise ParserError, 'response json parse error'
|
60
|
+
end
|
61
|
+
|
62
|
+
status = json_hash.values[0]
|
63
|
+
|
64
|
+
if status.has_key?('error')
|
65
|
+
return status
|
66
|
+
end
|
67
|
+
|
68
|
+
if status.has_key?('command')
|
69
|
+
status['command'] = status['command'].split('|')[0].to_i
|
70
|
+
end
|
71
|
+
|
72
|
+
if !status.has_key?('host')
|
73
|
+
status['hostname'] = @hostname
|
74
|
+
else
|
75
|
+
status['hostname'] = status.delete('host')
|
76
|
+
end
|
77
|
+
|
78
|
+
if status.has_key?('arw')
|
79
|
+
arw = status['arw'].split('|')
|
80
|
+
status['arw'] = {'ar' => arw[0].to_i, 'aw' => arw[1].to_i}
|
81
|
+
elsif status.has_key?('ar|aw')
|
82
|
+
arw = status['ar|aw'].split('|')
|
83
|
+
status.delete('ar|aw')
|
84
|
+
status['arw'] = {'ar' => arw[0].to_i, 'aw' => arw[1].to_i}
|
85
|
+
end
|
86
|
+
|
87
|
+
if status.has_key?('qrw')
|
88
|
+
qrw = status['qrw'].split('|')
|
89
|
+
status['qrw'] = {'qr' => qrw[0].to_i, 'qw' => qrw[1].to_i}
|
90
|
+
elsif status.has_key?('qr|qw')
|
91
|
+
qrw = status['qr|qw'].split('|')
|
92
|
+
status.delete('qr|qw')
|
93
|
+
status['qrw'] = {'qr' => qrw[0].to_i, 'qw' => qrw[1].to_i}
|
94
|
+
end
|
95
|
+
|
96
|
+
if status.has_key?('netIn')
|
97
|
+
status['net_in'] = status.delete('netIn')
|
98
|
+
end
|
99
|
+
|
100
|
+
if status.has_key?('netOut')
|
101
|
+
status['net_out'] = status.delete('netOut')
|
102
|
+
end
|
103
|
+
|
104
|
+
status['conn'] = status['conn'].to_i if status.has_key?('conn')
|
105
|
+
status['delete'] = status['delete'].to_i if status.has_key?('delete')
|
106
|
+
status['flushes'] = status['flushes'].to_i if status.has_key?('flushes')
|
107
|
+
status['getmore'] = status['getmore'].to_i if status.has_key?('getmore')
|
108
|
+
status['insert'] = status['insert'].to_i if status.has_key?('insert')
|
109
|
+
status['query'] = status['query'].to_i if status.has_key?('query')
|
110
|
+
status['update'] = status['update'].to_i if status.has_key?('update')
|
111
|
+
status['dirty'] = status['dirty'].to_f if status.has_key?('dirty')
|
112
|
+
status['used'] = status['used'].to_f if status.has_key?('used')
|
113
|
+
|
114
|
+
status['net_in'] = parse_unit(status['net_in']) if status.has_key?('net_in')
|
115
|
+
status['net_out'] = parse_unit(status['net_out']) if status.has_key?('net_out')
|
116
|
+
status['res'] = parse_unit(status['res']) if status.has_key?('res')
|
117
|
+
status['vsize'] = parse_unit(status['vsize']) if status.has_key?('vsize')
|
118
|
+
|
119
|
+
return status
|
120
|
+
end
|
121
|
+
|
122
|
+
def parse_unit(str)
|
123
|
+
si_prefix = {
|
124
|
+
'T' => 1e12,
|
125
|
+
't' => 1e12,
|
126
|
+
'G' => 1e9,
|
127
|
+
'g' => 1e9,
|
128
|
+
'M' => 1e6,
|
129
|
+
'm' => 1e6,
|
130
|
+
'K' => 1e3,
|
131
|
+
'k' => 1e3
|
132
|
+
}
|
133
|
+
value = str.to_f
|
134
|
+
unit = str[/[a-zA-Z]+/]
|
135
|
+
if si_prefix.has_key?(unit)
|
136
|
+
return (value * si_prefix[unit]).to_i
|
137
|
+
else
|
138
|
+
return value.to_i
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def mongostat_exists?
|
143
|
+
begin
|
144
|
+
`mongostat --version`
|
145
|
+
rescue Errno::ENOENT
|
146
|
+
return false
|
147
|
+
end
|
148
|
+
return true
|
149
|
+
end
|
150
|
+
|
151
|
+
def get_hostname
|
152
|
+
return `hostname`.chomp!
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-mongostat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kouta Asai
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: fluentd
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: fluentd input plugin for mongostat.
|
84
|
+
email:
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- ".gitignore"
|
90
|
+
- ".travis.yml"
|
91
|
+
- Gemfile
|
92
|
+
- README.md
|
93
|
+
- Rakefile
|
94
|
+
- fluent-plugin-mongostat.gemspec
|
95
|
+
- lib/fluent/plugin/in_mongostat.rb
|
96
|
+
homepage:
|
97
|
+
licenses: []
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.5.2
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: fluentd input plugin for mongostat.
|
119
|
+
test_files: []
|