logstash-input-remote_proc 0.0.22 → 0.0.23
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/lib/logstash/inputs/remote_proc.rb +233 -308
- data/logstash-input-remote_proc.gemspec +3 -3
- data/spec/inputs/remote_proc_spec.rb +4 -4
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18036cd47bafcebcaa5a6039407d6c8abf3d019a
|
4
|
+
data.tar.gz: 4a00dd8d6dec59b760010130ef65b785b3cf8fef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c02c6b84a1cd161125e1f66798abc9dc0a84ab3a30ee6f405d39659f0b9d2041d71ee22867bb64dac2fcdcca0134e071ca1d4cba5175a8e82ac91b6ac693c870
|
7
|
+
data.tar.gz: b4a7d058b4c53aae5582b48521425c0dd254950e4a53e813780eb34278da78d0847ea22c38988e08ab85c4a4b0349818908cd3abd0823acedb8c21a4337944a9
|
@@ -86,8 +86,9 @@ module LogStash
|
|
86
86
|
def register
|
87
87
|
@host = Socket.gethostname
|
88
88
|
|
89
|
-
require 'net/ssh
|
90
|
-
|
89
|
+
require 'net/ssh'
|
90
|
+
require 'net/ssh/gateway'
|
91
|
+
@ssh_sessions = []
|
91
92
|
|
92
93
|
# Don't forget to close all gateways manually in `stop` method.
|
93
94
|
@ssh_gateways = []
|
@@ -99,18 +100,47 @@ module LogStash
|
|
99
100
|
def run(queue)
|
100
101
|
# we can abort the loop if stop? becomes true
|
101
102
|
until stop?
|
102
|
-
|
103
|
-
|
104
|
-
|
103
|
+
@ssh_sessions.each do |ssh|
|
104
|
+
COMMANDS.each do |method, command|
|
105
|
+
result_data = String.new('')
|
106
|
+
channel = ssh.open_channel do |chan|
|
107
|
+
chan.exec(command) do |ch, success|
|
108
|
+
next unless success
|
109
|
+
|
110
|
+
# "on_data" called when the process writes to stdout
|
111
|
+
ch.on_data { |_c, data| result_data << data }
|
105
112
|
|
106
|
-
|
113
|
+
# "on_extended_data", called when the process writes to stderr
|
114
|
+
ch.on_extended_data {} # |_c, _type, _data|
|
107
115
|
|
116
|
+
ch.on_close(&:close)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
channel.wait
|
120
|
+
next if result_data.empty?
|
121
|
+
result = send("proc_#{method}", result_data)
|
122
|
+
next if result.empty?
|
123
|
+
event = LogStash::Event.new(
|
124
|
+
method => result,
|
125
|
+
host: @host,
|
126
|
+
type: @type || "system-#{method}",
|
127
|
+
metric_name: "system-#{method}",
|
128
|
+
remote_host: channel.connection.transport.host,
|
129
|
+
remote_port: channel.connection.transport.port,
|
130
|
+
command: command,
|
131
|
+
message: result_data
|
132
|
+
)
|
133
|
+
decorate(event)
|
134
|
+
queue << event
|
135
|
+
end
|
136
|
+
ssh.loop
|
137
|
+
end # @ssh_sessions block
|
108
138
|
Stud.stoppable_sleep(@interval) { stop? }
|
109
|
-
end # loop
|
139
|
+
end # until loop
|
110
140
|
end # def run
|
111
141
|
|
112
142
|
def stop
|
113
|
-
@
|
143
|
+
@ssh_sessions.map(&:close)
|
114
144
|
@ssh_gateways.map(&:shutdown!) unless @ssh_gateways.empty?
|
115
145
|
end
|
116
146
|
|
@@ -128,6 +158,7 @@ module LogStash
|
|
128
158
|
prepare_servers!(s)
|
129
159
|
|
130
160
|
session_options = {}
|
161
|
+
session_options[:port] = s['port'] if s['port']
|
131
162
|
session_options[:password] = s['password'] if s['password']
|
132
163
|
if s['ssh_private_key']
|
133
164
|
session_options[:auth_methods] = ['publickey']
|
@@ -144,352 +175,246 @@ module LogStash
|
|
144
175
|
s['gateway_username'],
|
145
176
|
gw_opts)
|
146
177
|
@ssh_gateways << gw
|
147
|
-
|
178
|
+
@ssh_sessions << gw.ssh(s['host'],
|
179
|
+
s['username'],
|
180
|
+
session_options)
|
181
|
+
else
|
182
|
+
@ssh_sessions << Net::SSH.start(s['host'],
|
183
|
+
s['username'],
|
184
|
+
session_options)
|
148
185
|
end
|
149
|
-
|
150
|
-
@ssh_session.use("#{s['username']}@#{s['host']}:#{s['port']}",
|
151
|
-
session_options)
|
152
186
|
end
|
153
187
|
end
|
154
188
|
|
155
189
|
# Process SYSVIPCSHM data
|
156
|
-
def proc_sysvipcshm(
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
sysvipcshm[t[1]]['swap'] = t[15]
|
181
|
-
end
|
182
|
-
next if sysvipcshm.empty?
|
183
|
-
event = LogStash::Event.new(sysvipcshm: sysvipcshm,
|
184
|
-
host: @host,
|
185
|
-
type: @type || 'system-sysvipcshm',
|
186
|
-
metric_name: 'system-sysvipcshm',
|
187
|
-
remote_host: ch[:host],
|
188
|
-
command: COMMANDS[:sysvipcshm],
|
189
|
-
message: data)
|
190
|
-
decorate(event)
|
191
|
-
queue << event
|
190
|
+
def proc_sysvipcshm(data)
|
191
|
+
return {} unless data
|
192
|
+
lines = data.split(/$/)
|
193
|
+
_ = lines.shift # Remove column name line
|
194
|
+
sysvipcshm = {}
|
195
|
+
lines.each do |l|
|
196
|
+
t = l.strip.split(/\s+/)
|
197
|
+
next if t.empty? || t.length < 16
|
198
|
+
sysvipcshm[t[1]] = {} # shmid
|
199
|
+
sysvipcshm[t[1]]['key'] = t[0]
|
200
|
+
sysvipcshm[t[1]]['perms'] = t[2]
|
201
|
+
sysvipcshm[t[1]]['size'] = t[3]
|
202
|
+
sysvipcshm[t[1]]['cpid'] = t[4]
|
203
|
+
sysvipcshm[t[1]]['lpid'] = t[5]
|
204
|
+
sysvipcshm[t[1]]['nattch'] = t[6]
|
205
|
+
sysvipcshm[t[1]]['uid'] = t[7]
|
206
|
+
sysvipcshm[t[1]]['gid'] = t[8]
|
207
|
+
sysvipcshm[t[1]]['cuid'] = t[9]
|
208
|
+
sysvipcshm[t[1]]['cgid'] = t[10]
|
209
|
+
sysvipcshm[t[1]]['atime'] = t[11]
|
210
|
+
sysvipcshm[t[1]]['dtime'] = t[12]
|
211
|
+
sysvipcshm[t[1]]['ctime'] = t[13]
|
212
|
+
sysvipcshm[t[1]]['rss'] = t[14]
|
213
|
+
sysvipcshm[t[1]]['swap'] = t[15]
|
192
214
|
end
|
215
|
+
sysvipcshm
|
193
216
|
end
|
194
217
|
|
195
218
|
# Process CRYPTO data
|
196
|
-
def proc_crypto(
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
next
|
210
|
-
end
|
211
|
-
crypto[current_crypto][t[0]] = t[1] unless current_crypto.empty?
|
219
|
+
def proc_crypto(data)
|
220
|
+
return {} unless data
|
221
|
+
crypto = {}
|
222
|
+
current_crypto = ''
|
223
|
+
data.split(/$/).each do |line|
|
224
|
+
l = line.strip
|
225
|
+
next if l.empty?
|
226
|
+
t = l.split(/\s+:\s+/)
|
227
|
+
next if t.empty? || t.length != 2
|
228
|
+
if 'name'.eql?(t[0])
|
229
|
+
current_crypto = t[1]
|
230
|
+
crypto[current_crypto] = {}
|
231
|
+
next
|
212
232
|
end
|
213
|
-
|
214
|
-
event = LogStash::Event.new(crypto: crypto,
|
215
|
-
host: @host,
|
216
|
-
type: @type || 'system-crypto',
|
217
|
-
metric_name: 'system-crypto',
|
218
|
-
remote_host: ch[:host],
|
219
|
-
command: COMMANDS[:crypto],
|
220
|
-
message: data)
|
221
|
-
decorate(event)
|
222
|
-
queue << event
|
233
|
+
crypto[current_crypto][t[0]] = t[1] unless current_crypto.empty?
|
223
234
|
end
|
235
|
+
crypto
|
224
236
|
end
|
225
237
|
|
226
238
|
# Process MOUNTS data
|
227
|
-
def proc_mounts(
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
mounts[t[0]] << device
|
243
|
-
end
|
244
|
-
next if mounts.empty?
|
245
|
-
event = LogStash::Event.new(mounts: mounts,
|
246
|
-
host: @host,
|
247
|
-
type: @type || 'system-mounts',
|
248
|
-
metric_name: 'system-mounts',
|
249
|
-
remote_host: ch[:host],
|
250
|
-
command: COMMANDS[:mounts],
|
251
|
-
message: data)
|
252
|
-
decorate(event)
|
253
|
-
queue << event
|
239
|
+
def proc_mounts(data)
|
240
|
+
return {} unless data
|
241
|
+
mounts = {}
|
242
|
+
data.split(/$/).each do |line|
|
243
|
+
t = line.strip.split(/\s+/)
|
244
|
+
next if t.empty? || t.length < 6
|
245
|
+
# mounted device name
|
246
|
+
device = {}
|
247
|
+
device['mountPoint'] = t[1]
|
248
|
+
device['fsType'] = t[2]
|
249
|
+
device['fsOptions'] = t[3].split(/,/)
|
250
|
+
device['dump'] = t[4]
|
251
|
+
device['pass'] = t[5]
|
252
|
+
mounts[t[0]] = [] unless mounts.include?(t[0])
|
253
|
+
mounts[t[0]] << device
|
254
254
|
end
|
255
|
+
mounts
|
255
256
|
end
|
256
257
|
|
257
258
|
# Process NETWIRELESS data.
|
258
|
-
def proc_netwireless(
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
netwireless[t[0]]['we22'] = t[11].to_i
|
280
|
-
end
|
281
|
-
next if netwireless.empty?
|
282
|
-
event = LogStash::Event.new(netwireless: netwireless,
|
283
|
-
host: @host,
|
284
|
-
type: @type || 'system-netwireless',
|
285
|
-
metric_name: 'system-netwireless',
|
286
|
-
remote_host: ch[:host],
|
287
|
-
command: COMMANDS[:netwireless],
|
288
|
-
message: data)
|
289
|
-
decorate(event)
|
290
|
-
queue << event
|
259
|
+
def proc_netwireless(data)
|
260
|
+
return {} unless data
|
261
|
+
lines = data.split(/$/)
|
262
|
+
_ = lines.shift # Remove first line
|
263
|
+
_ = lines.shift # Remove second line
|
264
|
+
netwireless = {}
|
265
|
+
lines.each do |l|
|
266
|
+
t = l.strip.split(/[:\s]+/)
|
267
|
+
next if t.empty? || t.length < 11 # Last column WE22 is often empty
|
268
|
+
netwireless[t[0]] = {}
|
269
|
+
netwireless[t[0]]['status'] = t[1].to_i
|
270
|
+
netwireless[t[0]]['linkQuality'] = t[2].to_i
|
271
|
+
netwireless[t[0]]['levelQuality'] = t[3].to_i
|
272
|
+
netwireless[t[0]]['noiseQuality'] = t[4].to_i
|
273
|
+
netwireless[t[0]]['nwidDiscarded'] = t[5].to_i
|
274
|
+
netwireless[t[0]]['cryptDiscarded'] = t[6].to_i
|
275
|
+
netwireless[t[0]]['fragDiscarded'] = t[7].to_i
|
276
|
+
netwireless[t[0]]['retryDiscarded'] = t[8].to_i
|
277
|
+
netwireless[t[0]]['miscDiscarded'] = t[9].to_i
|
278
|
+
netwireless[t[0]]['beaconMissed'] = t[10].to_i
|
279
|
+
netwireless[t[0]]['we22'] = t[11].to_i
|
291
280
|
end
|
281
|
+
netwireless
|
292
282
|
end
|
293
283
|
|
294
284
|
# Process NETDEV data.
|
295
|
-
def proc_netdev(
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
netdev[t[0]]['txcompressed'] = t[16].to_i
|
322
|
-
end
|
323
|
-
next if netdev.empty?
|
324
|
-
event = LogStash::Event.new(netdev: netdev,
|
325
|
-
host: @host,
|
326
|
-
type: @type || 'system-netdev',
|
327
|
-
metric_name: 'system-netdev',
|
328
|
-
remote_host: ch[:host],
|
329
|
-
command: COMMANDS[:netdev],
|
330
|
-
message: data)
|
331
|
-
decorate(event)
|
332
|
-
queue << event
|
285
|
+
def proc_netdev(data)
|
286
|
+
return {} unless data
|
287
|
+
lines = data.split(/$/)
|
288
|
+
_ = lines.shift # Remove first line
|
289
|
+
_ = lines.shift # Remove second line
|
290
|
+
netdev = {}
|
291
|
+
lines.each do |l|
|
292
|
+
t = l.strip.split(/[:\s]+/)
|
293
|
+
next if t.empty? || t.length < 17
|
294
|
+
netdev[t[0]] = {}
|
295
|
+
netdev[t[0]]['rxbytes'] = t[1].to_i
|
296
|
+
netdev[t[0]]['rxpackets'] = t[2].to_i
|
297
|
+
netdev[t[0]]['rxerrs'] = t[3].to_i
|
298
|
+
netdev[t[0]]['rxdrop'] = t[4].to_i
|
299
|
+
netdev[t[0]]['rxfifo'] = t[5].to_i
|
300
|
+
netdev[t[0]]['rxframe'] = t[6].to_i
|
301
|
+
netdev[t[0]]['rxcompressed'] = t[7].to_i
|
302
|
+
netdev[t[0]]['rxmulticast'] = t[8].to_i
|
303
|
+
netdev[t[0]]['txbytes'] = t[9].to_i
|
304
|
+
netdev[t[0]]['txpackets'] = t[10].to_i
|
305
|
+
netdev[t[0]]['txerrs'] = t[11].to_i
|
306
|
+
netdev[t[0]]['txdrop'] = t[12].to_i
|
307
|
+
netdev[t[0]]['txfifo'] = t[13].to_i
|
308
|
+
netdev[t[0]]['txcolls'] = t[14].to_i
|
309
|
+
netdev[t[0]]['txcarrier'] = t[15].to_i
|
310
|
+
netdev[t[0]]['txcompressed'] = t[16].to_i
|
333
311
|
end
|
312
|
+
netdev
|
334
313
|
end
|
335
314
|
|
336
315
|
# Process DISKSTATS data.
|
337
316
|
# https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats
|
338
317
|
# https://www.kernel.org/doc/Documentation/iostats.txt
|
339
|
-
def proc_diskstats(
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
diskstats[t[2]]['io weighted time spent ms'] = t[13].to_i
|
360
|
-
end
|
361
|
-
next if diskstats.empty?
|
362
|
-
event = LogStash::Event.new(diskstats: diskstats,
|
363
|
-
host: @host,
|
364
|
-
type: @type || 'system-diskstats',
|
365
|
-
metric_name: 'system-diskstats',
|
366
|
-
remote_host: ch[:host],
|
367
|
-
command: COMMANDS[:diskstats],
|
368
|
-
message: data)
|
369
|
-
decorate(event)
|
370
|
-
queue << event
|
318
|
+
def proc_diskstats(data)
|
319
|
+
return {} unless data
|
320
|
+
diskstats = {}
|
321
|
+
data.split(/$/).each do |line|
|
322
|
+
t = line.strip.split(/\s+/)
|
323
|
+
next if t.empty? || t.length < 14
|
324
|
+
diskstats[t[2]] = {} # device name
|
325
|
+
diskstats[t[2]]['major number'] = t[0].to_i
|
326
|
+
diskstats[t[2]]['minor number'] = t[1].to_i
|
327
|
+
diskstats[t[2]]['reads completed'] = t[3].to_i
|
328
|
+
diskstats[t[2]]['reads merged'] = t[4].to_i
|
329
|
+
diskstats[t[2]]['sectors read'] = t[5].to_i
|
330
|
+
diskstats[t[2]]['time spent reading ms'] = t[6].to_i
|
331
|
+
diskstats[t[2]]['writes completed'] = t[7].to_i
|
332
|
+
diskstats[t[2]]['writes merged'] = t[8].to_i
|
333
|
+
diskstats[t[2]]['sectors written'] = t[9].to_i
|
334
|
+
diskstats[t[2]]['time spent writing ms'] = t[10].to_i
|
335
|
+
diskstats[t[2]]['io in progress'] = t[11].to_i
|
336
|
+
diskstats[t[2]]['io time spent ms'] = t[12].to_i
|
337
|
+
diskstats[t[2]]['io weighted time spent ms'] = t[13].to_i
|
371
338
|
end
|
339
|
+
diskstats
|
372
340
|
end
|
373
341
|
|
374
342
|
# Process VMSTAT data.
|
375
|
-
def proc_vmstat(
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
vmstat[m[1]] = m[2].to_i if m && m.length >= 3
|
382
|
-
end
|
383
|
-
next if vmstat.empty?
|
384
|
-
event = LogStash::Event.new(vmstat: vmstat,
|
385
|
-
host: @host,
|
386
|
-
type: @type || 'system-vmstat',
|
387
|
-
metric_name: 'system-vmstat',
|
388
|
-
remote_host: ch[:host],
|
389
|
-
command: COMMANDS[:vmstat],
|
390
|
-
message: data)
|
391
|
-
decorate(event)
|
392
|
-
queue << event
|
343
|
+
def proc_vmstat(data)
|
344
|
+
return {} unless data
|
345
|
+
vmstat = {}
|
346
|
+
data.split(/$/).each do |line|
|
347
|
+
m = /([^\s]+)\s+(\d+)/.match(line)
|
348
|
+
vmstat[m[1]] = m[2].to_i if m && m.length >= 3
|
393
349
|
end
|
350
|
+
vmstat
|
394
351
|
end
|
395
352
|
|
396
353
|
# Process LOADAVG data.
|
397
|
-
def proc_loadavg(
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
event = LogStash::Event.new(loadavg: loadavg,
|
410
|
-
host: @host,
|
411
|
-
type: @type || 'system-loadavg',
|
412
|
-
metric_name: 'system-loadavg',
|
413
|
-
remote_host: ch[:host],
|
414
|
-
command: COMMANDS[:loadavg],
|
415
|
-
message: data)
|
416
|
-
decorate(event)
|
417
|
-
queue << event
|
418
|
-
end
|
354
|
+
def proc_loadavg(data)
|
355
|
+
return {} unless data
|
356
|
+
m = %r{([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\/([^\s]+)\s+([^\s$]+)}.match(data)
|
357
|
+
next unless m
|
358
|
+
loadavg = {}
|
359
|
+
if m && m.length >= 6
|
360
|
+
loadavg.merge!('1minute' => m[1].to_f,
|
361
|
+
'5minutes' => m[2].to_f,
|
362
|
+
'15minutes' => m[3].to_f,
|
363
|
+
'running_processes' => m[4].to_i,
|
364
|
+
'total_processes' => m[5].to_i,
|
365
|
+
'last_running_pid' => m[6].to_i)
|
419
366
|
end
|
367
|
+
loadavg
|
420
368
|
end
|
421
369
|
|
422
370
|
# Process MEMINFO data.
|
423
|
-
def proc_meminfo(
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
next if meminfo.empty?
|
371
|
+
def proc_meminfo(data)
|
372
|
+
return {} unless data
|
373
|
+
meminfo = {}
|
374
|
+
data.split(/$/).each do |line|
|
375
|
+
m = /([^\n\t:]+)\s*:\s+(\d+)(\skb)?$/i.match(line)
|
376
|
+
next unless m
|
377
|
+
meminfo[m[1]] = m[2].to_i
|
378
|
+
meminfo[m[1]] *= 1000 if m[3] # m[3] is not nil if `/KB/i` is found
|
379
|
+
end
|
380
|
+
unless meminfo.empty?
|
434
381
|
meminfo['CalcMemUsed'] = meminfo['MemTotal'] - meminfo['MemFree']
|
435
|
-
event = LogStash::Event.new(meminfo: meminfo,
|
436
|
-
host: @host,
|
437
|
-
type: @type || 'system-meminfo',
|
438
|
-
metric_name: 'system-meminfo',
|
439
|
-
remote_host: ch[:host],
|
440
|
-
command: COMMANDS[:meminfo],
|
441
|
-
message: data)
|
442
|
-
decorate(event)
|
443
|
-
queue << event
|
444
382
|
end
|
383
|
+
meminfo
|
445
384
|
end
|
446
385
|
|
447
386
|
# Process CPUINFO data.
|
448
|
-
def proc_cpuinfo(
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
cpuinfo[index][m[1]] = value
|
478
|
-
end
|
479
|
-
next if cpuinfo.empty?
|
480
|
-
# Other computed fields
|
481
|
-
cpuinfo[0]['cpu cores'] = 1 unless cpuinfo[0].include?('cpu cores')
|
482
|
-
cpuinfo['threads per core'] = num_cpu / cpuinfo[0]['cpu cores']
|
483
|
-
event = LogStash::Event.new(cpuinfo: cpuinfo,
|
484
|
-
host: @host,
|
485
|
-
type: @type || 'system-cpuinfo',
|
486
|
-
metric_name: 'system-cpuinfo',
|
487
|
-
remote_host: ch[:host],
|
488
|
-
command: COMMANDS[:cpuinfo],
|
489
|
-
message: data)
|
490
|
-
decorate(event)
|
491
|
-
queue << event
|
387
|
+
def proc_cpuinfo(data)
|
388
|
+
return {} unless data
|
389
|
+
cpuinfo = {} # TODO(fenicks): change to array
|
390
|
+
num_cpu = 0
|
391
|
+
data.split(/$/).each do |line|
|
392
|
+
next if line.strip.empty?
|
393
|
+
m = /([^\n\t:]+)\s*:\s+(.+)$/.match(line)
|
394
|
+
next unless m
|
395
|
+
# Apply filters
|
396
|
+
value = m[2] # needed to permit assignation and computation
|
397
|
+
num_cpu += 1 if m[1].eql?('processor')
|
398
|
+
value = m[2].split(/\s+/) if m[1] == 'flags'
|
399
|
+
value = m[2].to_i if ['processor',
|
400
|
+
'physical id',
|
401
|
+
'siblings',
|
402
|
+
'core id',
|
403
|
+
'cpu cores',
|
404
|
+
'apicid',
|
405
|
+
'initial apicid',
|
406
|
+
'cpuid level',
|
407
|
+
'clflush size',
|
408
|
+
'cache size',
|
409
|
+
'cache_alignment'].include?(m[1])
|
410
|
+
value = m[2].to_f if ['bogomips',
|
411
|
+
'cpu MHz'].include?(m[1])
|
412
|
+
value = m[2].to_i * 1000 if m[2] =~ /\skb$/i
|
413
|
+
index = num_cpu - 1
|
414
|
+
cpuinfo[index] = {} unless cpuinfo.include?(index)
|
415
|
+
cpuinfo[index][m[1]] = value
|
492
416
|
end
|
417
|
+
cpuinfo
|
493
418
|
end
|
494
419
|
end # class LogStash::Inputs::RemoteProc
|
495
420
|
end # module LogStash::Inputs
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-input-remote_proc'
|
3
|
-
s.version = '0.0.
|
4
|
-
s.licenses = ['Apache
|
3
|
+
s.version = '0.0.23'
|
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'
|
7
7
|
s.authors = ['Christian Kakesa']
|
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_runtime_dependency 'logstash-core', '>= 2.0.0'
|
30
30
|
s.add_runtime_dependency 'logstash-codec-plain', '>= 3.0.2'
|
31
31
|
s.add_runtime_dependency 'net-ssh', '~> 2.9', '>= 2.9.2'
|
32
|
-
s.add_runtime_dependency 'net-ssh-
|
32
|
+
s.add_runtime_dependency 'net-ssh-gateway', '~> 1.2', '>= 1.2.0'
|
33
33
|
s.add_runtime_dependency 'stud', '~> 0.0', '>= 0.0.22'
|
34
34
|
s.add_development_dependency 'logstash-devutils', '>= 1.1.0'
|
35
35
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'logstash/devutils/rspec/spec_helper'
|
3
3
|
require 'logstash/inputs/remote_proc'
|
4
|
-
require 'net/ssh
|
4
|
+
require 'net/ssh'
|
5
|
+
require 'net/ssh/gateway'
|
5
6
|
|
6
7
|
describe LogStash::Inputs::RemoteProc do
|
7
8
|
let(:config) do
|
@@ -14,9 +15,8 @@ describe LogStash::Inputs::RemoteProc do
|
|
14
15
|
let(:queue) { [] }
|
15
16
|
|
16
17
|
before do
|
17
|
-
ssh_session = spy('Net::SSH
|
18
|
-
|
19
|
-
.and_return(ssh_session)
|
18
|
+
ssh_session = spy('Net::SSH')
|
19
|
+
allow(Net::SSH).to receive(:start).with(any_args).and_return(ssh_session)
|
20
20
|
end
|
21
21
|
|
22
22
|
it_behaves_like 'an interruptible input plugin' do
|
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.0.
|
4
|
+
version: 0.0.23
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,8 +66,8 @@ dependencies:
|
|
66
66
|
version: '1.2'
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.2.
|
70
|
-
name: net-ssh-
|
69
|
+
version: 1.2.0
|
70
|
+
name: net-ssh-gateway
|
71
71
|
prerelease: false
|
72
72
|
type: :runtime
|
73
73
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '1.2'
|
78
78
|
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version: 1.2.
|
80
|
+
version: 1.2.0
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
@@ -490,7 +490,7 @@ files:
|
|
490
490
|
- vendor/bundle/jruby/1.9/specifications/rake-11.3.0.gemspec
|
491
491
|
homepage: https://github.com/fenicks/logstash-input-remote_proc
|
492
492
|
licenses:
|
493
|
-
- Apache
|
493
|
+
- Apache-2.0
|
494
494
|
metadata:
|
495
495
|
logstash_plugin: 'true'
|
496
496
|
logstash_group: input
|