logstash-input-remote_proc 0.1.7 → 0.1.8
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/USAGE.md +48 -46
- data/lib/logstash/inputs/remote_proc.rb +57 -49
- data/logstash-input-remote_proc.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c02140e9d9c51731875a6506a1bdd0186c50b5d
|
4
|
+
data.tar.gz: fcd1d2f715390bba9b4bb71fed8c065d968e5b94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f36c5471a1bf132ae0ef534c931c241e29e7ac1af2ead1f21a24d1233f8f12d14506cf686fa89349d47c111c86c0af03274e78fac23c75c6e88f913a0df81157
|
7
|
+
data.tar.gz: d27e517f6d4fbf25c20ece9eb6d8e42978c3c9c8305827593565b376c032013f2edba659b222bce91cd57fd810270a9deb82b173968c813ad4f6d6ca25b2ac92
|
data/CHANGELOG.md
CHANGED
data/USAGE.md
CHANGED
@@ -18,6 +18,8 @@ servers => [
|
|
18
18
|
gateway_username => ${USER} || ${USERNAME} || 'nobody' # :string (default to unix $USER)
|
19
19
|
gateway_password => ... # :string (needed if gateway_host is set and no 'ssh_private_key' is given), empty by default
|
20
20
|
gateway_ssh_private_key => ... # :path (needed if no 'gateway_password'), empty by default
|
21
|
+
system_reader => "cat" # :string
|
22
|
+
proc_prefix_path => "/proc" # :string
|
21
23
|
}
|
22
24
|
]
|
23
25
|
```
|
@@ -27,7 +29,7 @@ When no password is given, the private key path for both `host` and `gateway_hos
|
|
27
29
|
**Default values for `proc_list`**
|
28
30
|
|
29
31
|
```logstash
|
30
|
-
proc_list => ["cpuinfo", "meminfo", "loadavg", "vmstat", "diskstats", "netdev", "netwireless", "mounts", "crypto", "sysvipcshm"]
|
32
|
+
proc_list => ["cpuinfo", "stat", "meminfo", "loadavg", "vmstat", "diskstats", "netdev", "netwireless", "mounts", "crypto", "sysvipcshm"]
|
31
33
|
```
|
32
34
|
|
33
35
|
If `proc_list` is not declared all of them are processed. An equivalent declaration is `proc_file => ["_all"]`.
|
@@ -35,75 +37,75 @@ If `proc_list` is not declared all of them are processed. An equivalent declarat
|
|
35
37
|
### SSH server with default values and authenticate by private key
|
36
38
|
|
37
39
|
```javascript
|
38
|
-
|
40
|
+
input { remote_proc { servers => [{}] } }
|
39
41
|
```
|
40
42
|
|
41
43
|
### SSH server with default values and authenticate by private key for `cpuinfo` and `meminfo`
|
42
44
|
|
43
45
|
```javascript
|
44
|
-
|
46
|
+
input { remote_proc { servers => [{}] proc_list => ["cpuinfo", "meminfo"] } }
|
45
47
|
```
|
46
48
|
|
47
49
|
### With SSH server `host`, `port` and `username` and authenticate by private key
|
48
50
|
|
49
51
|
```javascript
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
}
|
52
|
+
input {
|
53
|
+
remote_proc {
|
54
|
+
servers => [
|
55
|
+
{ host => "domain.com" port => 22 username => "fenicks" }
|
56
|
+
]
|
56
57
|
}
|
58
|
+
}
|
57
59
|
```
|
58
60
|
|
59
61
|
### With SSH server `host`, `port` and `username` and authenticate by a specific private key file
|
60
62
|
|
61
63
|
```javascript
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
}
|
64
|
+
input {
|
65
|
+
remote_proc {
|
66
|
+
servers => [
|
67
|
+
{
|
68
|
+
host => "domain.com"
|
69
|
+
port => 22
|
70
|
+
username => "fenicks"
|
71
|
+
ssh_private_key => "${HOME}/.ssh/id_rsa_domain.com"
|
72
|
+
}
|
73
|
+
]
|
73
74
|
}
|
75
|
+
}
|
74
76
|
```
|
75
77
|
|
76
78
|
### With SSH server `host`, `port` and `username` and authenticate by password
|
77
79
|
```javascript
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
}
|
80
|
+
input {
|
81
|
+
remote_proc {
|
82
|
+
servers => [
|
83
|
+
{
|
84
|
+
host => "domain.com"
|
85
|
+
port => 22
|
86
|
+
username => "fenicks"
|
87
|
+
password => "my_password!"
|
88
|
+
}
|
89
|
+
]
|
89
90
|
}
|
91
|
+
}
|
90
92
|
```
|
91
93
|
### With SSH Gateway by with private key file and SSH `host` and `password`
|
92
94
|
```javascript
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
}
|
95
|
+
input {
|
96
|
+
remote_proc {
|
97
|
+
servers => [
|
98
|
+
{
|
99
|
+
host => "domain.com"
|
100
|
+
port => 22
|
101
|
+
username => "fenicks"
|
102
|
+
password => "my_password!"
|
103
|
+
gateway_host => "gateway.com"
|
104
|
+
gateway_username => "username_passemuraille"
|
105
|
+
gateway_port => 4242
|
106
|
+
gateway_ssh_private_key => "/path/to/private/key"
|
107
|
+
}
|
108
|
+
]
|
108
109
|
}
|
110
|
+
}
|
109
111
|
```
|
@@ -63,24 +63,29 @@ module LogStash
|
|
63
63
|
'gateway_port' => 22, # :number
|
64
64
|
'gateway_username' => ENV['USER'] || ENV['USERNAME'] || 'nobody', # :string (default to unix $USER)
|
65
65
|
'gateway_password' => nil, # :string
|
66
|
-
'gateway_ssh_private_key' => nil # :string
|
66
|
+
'gateway_ssh_private_key' => nil, # :string
|
67
|
+
'system_reader' => 'cat', # :string
|
68
|
+
'proc_prefix_path' => '/proc' # :string
|
67
69
|
}.freeze
|
68
70
|
|
69
71
|
# Liste of commands for each `/proc` endpoints.
|
70
72
|
COMMANDS = {
|
71
|
-
cpuinfo: '
|
72
|
-
stat: '
|
73
|
-
meminfo: '
|
74
|
-
loadavg: '
|
75
|
-
vmstat: '
|
76
|
-
diskstats: '
|
77
|
-
netdev: '
|
78
|
-
netwireless: '
|
79
|
-
mounts: '
|
80
|
-
crypto: '
|
81
|
-
sysvipcshm: '
|
73
|
+
cpuinfo: '%{system_reader} %{proc_prefix_path}/cpuinfo',
|
74
|
+
stat: '%{system_reader} %{proc_prefix_path}/stat',
|
75
|
+
meminfo: '%{system_reader} %{proc_prefix_path}/meminfo',
|
76
|
+
loadavg: '%{system_reader} %{proc_prefix_path}/loadavg',
|
77
|
+
vmstat: '%{system_reader} %{proc_prefix_path}/vmstat',
|
78
|
+
diskstats: '%{system_reader} %{proc_prefix_path}/diskstats',
|
79
|
+
netdev: '%{system_reader} %{proc_prefix_path}/net/dev',
|
80
|
+
netwireless: '%{system_reader} %{proc_prefix_path}/net/wireless',
|
81
|
+
mounts: '%{system_reader} %{proc_prefix_path}/mounts',
|
82
|
+
crypto: '%{system_reader} %{proc_prefix_path}/crypto',
|
83
|
+
sysvipcshm: '%{system_reader} %{proc_prefix_path}/sysvipc/shm'
|
82
84
|
}.freeze
|
83
85
|
|
86
|
+
# By default call all procfs method
|
87
|
+
DEFAULT_PROC_LIST = ['_all'].freeze
|
88
|
+
|
84
89
|
config_name 'remote_proc'
|
85
90
|
|
86
91
|
# If undefined, Logstash will complain, even if codec is unused.
|
@@ -121,7 +126,6 @@ module LogStash
|
|
121
126
|
|
122
127
|
@ssh_sessions = []
|
123
128
|
@ssh_gateways = []
|
124
|
-
@commands = ['_all']
|
125
129
|
|
126
130
|
configure!
|
127
131
|
end # def register
|
@@ -130,10 +134,10 @@ module LogStash
|
|
130
134
|
# we can abort the loop if stop? becomes true
|
131
135
|
until stop?
|
132
136
|
@ssh_sessions.each do |ssh|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
+
ssh.open_channel do |chan|
|
138
|
+
chan.connection.options[:properties]['_commands'].each do |method, command|
|
139
|
+
result_data = String.new('')
|
140
|
+
error_data = String.new('')
|
137
141
|
chan.exec(command) do |ch, success|
|
138
142
|
next unless success
|
139
143
|
# "on_data" called when the process writes to stdout
|
@@ -142,30 +146,30 @@ module LogStash
|
|
142
146
|
ch.on_extended_data { |_ch, _type, data| error_data << data }
|
143
147
|
ch.on_close(&:close)
|
144
148
|
end
|
149
|
+
chan.wait
|
150
|
+
unless error_data.empty?
|
151
|
+
error_data.chomp!
|
152
|
+
error_data = error_data.force_encoding('UTF-8')
|
153
|
+
@logger.warn(error_data)
|
154
|
+
next
|
155
|
+
end
|
156
|
+
next if result_data.empty?
|
157
|
+
result = send("proc_#{method}",
|
158
|
+
result_data.force_encoding('UTF-8'))
|
159
|
+
next if result.empty?
|
160
|
+
event = LogStash::Event.new(
|
161
|
+
method => result,
|
162
|
+
host: @host,
|
163
|
+
type: @type || "system-#{method}",
|
164
|
+
metric_name: "system-#{method}",
|
165
|
+
remote_host: chan.connection.options[:properties]['host'],
|
166
|
+
remote_port: chan.connection.options[:properties]['port'],
|
167
|
+
command: command,
|
168
|
+
message: result_data
|
169
|
+
)
|
170
|
+
decorate(event)
|
171
|
+
queue << event
|
145
172
|
end
|
146
|
-
channel.wait
|
147
|
-
unless error_data.empty?
|
148
|
-
error_data.chomp!
|
149
|
-
error_data = error_data.force_encoding('UTF-8')
|
150
|
-
@logger.warn(error_data)
|
151
|
-
next
|
152
|
-
end
|
153
|
-
next if result_data.empty?
|
154
|
-
result = send("proc_#{method}",
|
155
|
-
result_data.force_encoding('UTF-8'))
|
156
|
-
next if result.empty?
|
157
|
-
event = LogStash::Event.new(
|
158
|
-
method => result,
|
159
|
-
host: @host,
|
160
|
-
type: @type || "system-#{method}",
|
161
|
-
metric_name: "system-#{method}",
|
162
|
-
remote_host: channel.connection.options[:properties]['host'],
|
163
|
-
remote_port: channel.connection.options[:properties]['port'],
|
164
|
-
command: command,
|
165
|
-
message: result_data
|
166
|
-
)
|
167
|
-
decorate(event)
|
168
|
-
queue << event
|
169
173
|
end
|
170
174
|
ssh.loop
|
171
175
|
end # @ssh_sessions block
|
@@ -181,16 +185,25 @@ module LogStash
|
|
181
185
|
private
|
182
186
|
|
183
187
|
# Return only valide property keys.
|
184
|
-
def prepare_servers!(
|
185
|
-
|
186
|
-
|
188
|
+
def prepare_servers!(server)
|
189
|
+
server.select! { |k| SERVER_OPTIONS.include?(k) }
|
190
|
+
server.merge!(SERVER_OPTIONS) { |_key_, old, _new_| old }
|
191
|
+
cmds = if (@proc_list - ['_all']).empty?
|
192
|
+
COMMANDS.dup
|
193
|
+
else
|
194
|
+
COMMANDS.select { |k, _| @proc_list.include?(k.to_s) }
|
195
|
+
end
|
196
|
+
# Replace 'system_reader' and 'proc_prefix_path' in all commands
|
197
|
+
server['_commands'] = cmds.each do |k, v|
|
198
|
+
cmds[k] = v % { system_reader: server['system_reader'],
|
199
|
+
proc_prefix_path: server['proc_prefix_path'] }
|
200
|
+
end.freeze
|
187
201
|
end
|
188
202
|
|
189
203
|
# Prepare all server configuration
|
190
204
|
def configure!
|
191
205
|
@servers.each do |s|
|
192
206
|
prepare_servers!(s)
|
193
|
-
|
194
207
|
session_options = { properties: s }
|
195
208
|
session_options[:port] = s['port'] if s['port']
|
196
209
|
session_options[:password] = s['password'] if s['password']
|
@@ -218,11 +231,6 @@ module LogStash
|
|
218
231
|
session_options)
|
219
232
|
end
|
220
233
|
end
|
221
|
-
@commands = if (@proc_list - ['_all']).empty?
|
222
|
-
COMMANDS
|
223
|
-
else
|
224
|
-
COMMANDS.select { |k, _| @proc_list.include?(k.to_s) }
|
225
|
-
end
|
226
234
|
end
|
227
235
|
|
228
236
|
# Process SYSVIPCSHM data
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-input-remote_proc'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.8'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = 'This Logstash plugin collects PROCFS metrics through remote SSH servers.'
|
6
6
|
s.description = 'This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-remote_proc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Kakesa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|