fluent-plugin-watch-process 0.1.1 → 0.2.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.
- checksums.yaml +7 -0
- data/.travis.yml +0 -7
- data/README.md +58 -4
- data/fluent-plugin-watch-process.gemspec +3 -3
- data/lib/fluent/plugin/in_watch_process.rb +167 -46
- data/test/helper.rb +1 -9
- data/test/plugin/test_in_watch_process.rb +99 -1
- metadata +32 -41
- data/gemfiles/fluentd_v0.12.gemfile +0 -7
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2d114a31b165c3feca90dac92247785d9f757e8951ded1aac49bc30806e505a1
|
4
|
+
data.tar.gz: 9a2aab2afb95873873e3e3581b2f5f23b12bd0e7062d456b7eebe257c7f8473a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ad4b0bffb25faaed2082c8bab5904100750ee265113097a0f643d5c13305c53731a9afcb6bd0b661fba1d012b45e74294c57defd530a774fbaf052135bcb6f43
|
7
|
+
data.tar.gz: 8f4761bfec54a36ecb2f702d7749ce4fd21bb69f35834aaeef274167456de74e0e8c4d7d09bdaaa90dc9bc3647d66eafbeb16d81ca24aede35fb4d273edd7e43
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -25,10 +25,10 @@ install with gem or fluent-gem command as:
|
|
25
25
|
$ gem install fluent-plugin-watch-process
|
26
26
|
|
27
27
|
# for td-agent
|
28
|
-
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-watch-process -v 0.1.
|
28
|
+
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-watch-process -v 0.1.1
|
29
29
|
|
30
30
|
# for td-agent2 (recommend)
|
31
|
-
$ sudo td-agent-gem install fluent-plugin-watch-process -v 0.1.
|
31
|
+
$ sudo td-agent-gem install fluent-plugin-watch-process -v 0.1.1
|
32
32
|
```
|
33
33
|
|
34
34
|
## Configuration
|
@@ -68,14 +68,20 @@ $ tail -f /var/log/td-agent/td-agent.log
|
|
68
68
|
* execute ps command with some options
|
69
69
|
* [default] Linux: `LANG=en_US.UTF-8 && ps -ewwo lstart,user:20,pid,ppid,time,%cpu,%mem,rss,sz,s,comm,cmd`
|
70
70
|
* [default] MacOSX: `LANG=en_US.UTF-8 && ps -ewwo lstart,user,pid,ppid,time,%cpu,%mem,rss,vsz,state,comm,command`
|
71
|
+
* [default] Windows: described in the next section, `About Windows`.
|
71
72
|
|
72
73
|
* keys (Optional)
|
73
74
|
* output record keys of the ps command results
|
74
|
-
* [default] start_time
|
75
|
+
* [default] Linux, MacOSX: `start_time,user,pid,parent_pid,cpu_time,cpu_percent,memory_percent,mem_rss,mem_size,state,proc_name,command`
|
76
|
+
* need to modify `command` too if you modify this value.
|
77
|
+
* [default] Windows: `StartTime,UserName,SessionId,Id,CPU,WorkingSet,VirtualMemorySize,HandleCount,ProcessName`
|
78
|
+
* in Windows only, you can fix this without fixing `command`. These keys can be specified from the properties of `System.Diagnostics.Process` object of `.NET`.
|
79
|
+
* `UserName` key needs administrator privilege. You can exclude this to avoid needing administrator privilege.
|
75
80
|
|
76
81
|
* types (Optional)
|
77
82
|
* settings of converting types from string to integer/float.
|
78
|
-
* [default] pid:integer
|
83
|
+
* [default] Linux, MacOSX: `pid:integer,parent_pid:integer,cpu_percent:float,memory_percent:float,mem_rss:integer,mem_size:integer`
|
84
|
+
* [default] Windows: `SessionId:integer,Id:integer,CPU:float,WorkingSet:integer,VirtualMemorySize:integer,HandleCount:integer`
|
79
85
|
|
80
86
|
* interval (Optional)
|
81
87
|
* execute interval time
|
@@ -90,6 +96,54 @@ $ tail -f /var/log/td-agent/td-agent.log
|
|
90
96
|
* to use short hostname, set `hostname -s` for this option on linux/mac.
|
91
97
|
* [default] `hostname`
|
92
98
|
|
99
|
+
* powershell_command (Optional)
|
100
|
+
* settings for powershell command name. PowerShell Core had been renamed its command to `pwsh` and PowerShell 7 continues to use `pwsh` as its command name.
|
101
|
+
* [default] `powershell`
|
102
|
+
* [avaliables] `powershell`, `pwsh`
|
103
|
+
|
104
|
+
### About Windows
|
105
|
+
|
106
|
+
Default `command` preset for Windows provides many of keys as below. Generally, you can pick up the columns with `keys` option.
|
107
|
+
If you need additional keys, consider to update `command` option.
|
108
|
+
|
109
|
+
`````powershell
|
110
|
+
powershell -command "Get-Process -IncludeUserName
|
111
|
+
| ?{$_.StartTime -ne $NULL -and $_.CPU -ne $NULL}
|
112
|
+
| Select-Object -Property StartTime,UserName,SessionId,Id,CPU,WorkingSet,VirtualMemorySize,HandleCount,ProcessName
|
113
|
+
| %{$_.StartTime = $_.StartTime.ToString('o'); return $_;}
|
114
|
+
| ConvertTo-Csv -NoTypeInformation"
|
115
|
+
`````
|
116
|
+
|
117
|
+
Confirmed versions are:
|
118
|
+
|
119
|
+
| Windows version | PowerShell version information | Note |
|
120
|
+
| ------------------------------ | ------------------------------------------------------------------------- |-----------------------------------------------|
|
121
|
+
| Windows 10 10.0.19042 (20H2) | PSVersion: 5.1.19041.906 (default installed version), PSEdition: Desktop | `powershell_command` as `powershell` (default)|
|
122
|
+
| Windows 10 10.0.19042 (20H2) | PSVersion: 7.1.2, PSEdition: Core | `powershell_command` as `pwsh` |
|
123
|
+
|
124
|
+
|
125
|
+
Here are details of this default command.
|
126
|
+
|
127
|
+
* `Get-Process -IncludeUserName`
|
128
|
+
* `Get-Process` powershell command takes `System.Diagnostics.Process` objects.
|
129
|
+
* `IncludeUserName` option is needed to take `UserName`.
|
130
|
+
* this needs administrator privilege.
|
131
|
+
* this will be omitted if `keys` does not contain `UserName`.
|
132
|
+
* ` | ?{$_.StartTime -ne $NULL -and $_.CPU -ne $NULL}`
|
133
|
+
* this exlcludes some special processes that don't have some properties, such as the "Idle" process in Windows.
|
134
|
+
* ` | Select-Object -Property ...`
|
135
|
+
* this takes the necessary parameters from `System.Diagnostics.Process` objects.
|
136
|
+
* `...` part will be automatically fixed by `keys`.
|
137
|
+
* ` | %{$_.StartTime = $_.StartTime.ToString('o'); return $_;}`
|
138
|
+
* this fixes the format of `StartTime` value.
|
139
|
+
* note: in Windows, setting the "$env:Lang" environment variable is not effective in changing the format of the output.
|
140
|
+
* ` | ConvertTo-Csv -NoTypeInformation`
|
141
|
+
* this formats objects to csv strings.
|
142
|
+
* currently, it is needed that `command` outputs the results in csv format.
|
143
|
+
* this is because white space delimiter is not suitable for Windows, in which empty values are often mixed.
|
144
|
+
|
145
|
+
**Note:** When using with PowerShell 7 which is previously known as PowerShell Core, you must specify `powershell_command` parameter as `pwsh`. Otherwise, this plugin does not work correctly on PowerShell 7 (pwsh). This is because PowerShell Core and PowerShell 7 use different command name which is `pwsh` not `powershell`.
|
146
|
+
|
93
147
|
## FAQ
|
94
148
|
|
95
149
|
* I need hostname key in the record.
|
@@ -3,11 +3,11 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "fluent-plugin-watch-process"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.2.0"
|
7
7
|
s.authors = ["Kentaro Yoshida"]
|
8
8
|
s.email = ["y.ken.studio@gmail.com"]
|
9
9
|
s.homepage = "https://github.com/y-ken/fluent-plugin-watch-process"
|
10
|
-
s.summary = %q{Fluentd Input plugin to collect continual process information via ps command. It is useful for cron/barch process monitoring.}
|
10
|
+
s.summary = %q{Fluentd Input plugin to collect continual process information via ps command or PowerShell pwsh command for Linux/osx/Windows. It is useful for cron/barch process monitoring.}
|
11
11
|
|
12
12
|
s.files = `git ls-files`.split("\n")
|
13
13
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency "rake"
|
19
19
|
s.add_development_dependency "test-unit", ">= 3.1.0"
|
20
20
|
s.add_development_dependency "appraisal"
|
21
|
-
s.add_runtime_dependency "fluentd", ">= 0.
|
21
|
+
s.add_runtime_dependency "fluentd", [">= 0.14.0", "< 2"]
|
22
22
|
s.add_runtime_dependency "fluent-mixin-rewrite-tag-name"
|
23
23
|
s.add_runtime_dependency "fluent-mixin-type-converter", ">= 0.1.0"
|
24
24
|
end
|
@@ -1,99 +1,220 @@
|
|
1
|
-
require
|
1
|
+
require 'time'
|
2
|
+
require 'csv' if Fluent.windows?
|
3
|
+
require "fluent/plugin/input"
|
2
4
|
require 'fluent/mixin/rewrite_tag_name'
|
3
5
|
require 'fluent/mixin/type_converter'
|
4
6
|
|
5
|
-
module Fluent
|
6
|
-
class WatchProcessInput < Fluent::Input
|
7
|
-
Plugin.register_input('watch_process', self)
|
7
|
+
module Fluent::Plugin
|
8
|
+
class WatchProcessInput < Fluent::Plugin::Input
|
9
|
+
Fluent::Plugin.register_input('watch_process', self)
|
10
|
+
|
11
|
+
helpers :timer
|
12
|
+
|
13
|
+
DEFAULT_KEYS = %w(start_time user pid parent_pid cpu_time cpu_percent memory_percent mem_rss mem_size state proc_name command)
|
14
|
+
DEFAULT_TYPES = %w(
|
15
|
+
pid:integer
|
16
|
+
parent_pid:integer
|
17
|
+
cpu_percent:float
|
18
|
+
memory_percent:float
|
19
|
+
mem_rss:integer
|
20
|
+
mem_size:integer
|
21
|
+
).join(",")
|
8
22
|
|
9
23
|
config_param :tag, :string
|
10
24
|
config_param :command, :string, :default => nil
|
11
|
-
config_param :keys, :
|
12
|
-
config_param :interval, :
|
13
|
-
config_param :lookup_user, :
|
25
|
+
config_param :keys, :array, :default => nil
|
26
|
+
config_param :interval, :time, :default => '5s'
|
27
|
+
config_param :lookup_user, :array, :default => nil
|
14
28
|
config_param :hostname_command, :string, :default => 'hostname'
|
15
|
-
|
16
|
-
DEFAULT_KEYS = %w(start_time user pid parent_pid cpu_time cpu_percent memory_percent mem_rss mem_size state proc_name command)
|
17
|
-
DEFAULT_TYPES = "pid:integer,parent_pid:integer,cpu_percent:float,memory_percent:float,mem_rss:integer,mem_size:integer"
|
29
|
+
config_param :powershell_command, :enum, list: [:powershell, :pwsh], :default => :powershell
|
18
30
|
|
19
31
|
include Fluent::HandleTagNameMixin
|
20
32
|
include Fluent::Mixin::RewriteTagName
|
21
33
|
include Fluent::Mixin::TypeConverter
|
22
|
-
config_set_default :types, DEFAULT_TYPES
|
23
34
|
|
24
35
|
def initialize
|
25
36
|
super
|
26
|
-
require 'time'
|
27
37
|
end
|
28
38
|
|
29
39
|
def configure(conf)
|
30
40
|
super
|
31
41
|
|
32
|
-
@
|
33
|
-
@keys
|
34
|
-
@
|
35
|
-
|
42
|
+
@windows_watcher = WindowsWatcher.new(@keys, @command, @lookup_user, @powershell_command) if Fluent.windows?
|
43
|
+
@keys ||= Fluent.windows? ? @windows_watcher.keys : DEFAULT_KEYS
|
44
|
+
@command ||= get_ps_command
|
45
|
+
apply_default_types
|
36
46
|
log.info "watch_process: polling start. :tag=>#{@tag} :lookup_user=>#{@lookup_user} :interval=>#{@interval} :command=>#{@command}"
|
37
47
|
end
|
38
48
|
|
39
49
|
def start
|
40
|
-
|
50
|
+
super
|
51
|
+
timer_execute(:in_watch_process, @interval, &method(:on_timer))
|
41
52
|
end
|
42
53
|
|
43
54
|
def shutdown
|
44
|
-
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
def apply_default_types
|
59
|
+
return unless @types.nil?
|
60
|
+
@types = Fluent.windows? ? @windows_watcher.default_types : DEFAULT_TYPES
|
61
|
+
@type_converters = parse_types_parameter unless @types.nil?
|
45
62
|
end
|
46
63
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
64
|
+
def on_timer
|
65
|
+
io = IO.popen(@command, 'r')
|
66
|
+
begin
|
50
67
|
io.gets
|
51
68
|
while result = io.gets
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
69
|
+
if Fluent.windows?
|
70
|
+
data = @windows_watcher.parse_line(result)
|
71
|
+
next unless @windows_watcher.match_look_up_user?(data)
|
72
|
+
else
|
73
|
+
data = parse_line(result)
|
74
|
+
next unless match_look_up_user?(data)
|
57
75
|
end
|
58
|
-
values = [lstart.to_s, result.chomp.strip.split(/\s+/, keys_size)]
|
59
|
-
data = Hash[@keys.zip(values.reject(&:empty?).flatten)]
|
60
|
-
data['elapsed_time'] = (Time.now - Time.parse(data['start_time'])).to_i if data['start_time']
|
61
|
-
next unless @lookup_user.nil? || @lookup_user.include?(data['user'])
|
62
76
|
emit_tag = tag.dup
|
63
77
|
filter_record(emit_tag, Fluent::Engine.now, data)
|
64
78
|
router.emit(emit_tag, Fluent::Engine.now, data)
|
65
79
|
end
|
80
|
+
ensure
|
66
81
|
io.close
|
67
|
-
sleep @interval
|
68
82
|
end
|
69
|
-
|
70
|
-
|
83
|
+
rescue StandardError => e
|
84
|
+
log.error "watch_process: error has occured. #{e.message}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def parse_line(line)
|
88
|
+
keys_size = @keys.size
|
89
|
+
if line =~ /(?<lstart>(^\w+\s+\w+\s+\d+\s+\d\d:\d\d:\d\d \d+))/
|
90
|
+
lstart = Time.parse($~[:lstart])
|
91
|
+
line = line.sub($~[:lstart], '')
|
92
|
+
keys_size -= 1
|
93
|
+
end
|
94
|
+
values = [lstart.to_s, line.chomp.strip.split(/\s+/, keys_size)]
|
95
|
+
data = Hash[@keys.zip(values.reject(&:empty?).flatten)]
|
96
|
+
data['elapsed_time'] = (Time.now - Time.parse(data['start_time'])).to_i if data['start_time']
|
97
|
+
data
|
98
|
+
end
|
99
|
+
|
100
|
+
def match_look_up_user?(data)
|
101
|
+
return true if @lookup_user.nil?
|
102
|
+
|
103
|
+
@lookup_user.include?(data['user'])
|
71
104
|
end
|
72
105
|
|
73
106
|
def get_ps_command
|
74
|
-
if
|
75
|
-
"LANG=en_US.UTF-8 && ps -ewwo lstart,user:20,pid,ppid,time,%cpu,%mem,rss,sz,s,comm,cmd"
|
76
|
-
elsif OS.mac?
|
107
|
+
if mac?
|
77
108
|
"LANG=en_US.UTF-8 && ps -ewwo lstart,user,pid,ppid,time,%cpu,%mem,rss,vsz,state,comm,command"
|
109
|
+
elsif Fluent.windows?
|
110
|
+
@windows_watcher.command
|
111
|
+
else
|
112
|
+
"LANG=en_US.UTF-8 && ps -ewwo lstart,user:20,pid,ppid,time,%cpu,%mem,rss,sz,s,comm,cmd"
|
78
113
|
end
|
79
114
|
end
|
80
115
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
116
|
+
def mac?
|
117
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
118
|
+
end
|
119
|
+
|
120
|
+
class WindowsWatcher
|
121
|
+
# Keys are from the "System.Diagnostics.Process" object properties that can be taken by the "Get-Process" command.
|
122
|
+
# You can check the all properties by the "(Get-Process)[0] | Get-Member" command.
|
123
|
+
DEFAULT_KEYS = %w(StartTime UserName SessionId Id CPU WorkingSet VirtualMemorySize HandleCount ProcessName)
|
124
|
+
|
125
|
+
DEFAULT_TYPES = %w(
|
126
|
+
SessionId:integer
|
127
|
+
Id:integer
|
128
|
+
CPU:float
|
129
|
+
WorkingSet:integer
|
130
|
+
VirtualMemorySize:integer
|
131
|
+
HandleCount:integer
|
132
|
+
).join(",")
|
133
|
+
|
134
|
+
attr_reader :keys
|
135
|
+
attr_reader :command
|
136
|
+
|
137
|
+
def initialize(keys, command, lookup_user, powershell_command)
|
138
|
+
@keys = keys || DEFAULT_KEYS
|
139
|
+
@powershell_command = powershell_command
|
140
|
+
@command = command || default_command
|
141
|
+
@lookup_user = lookup_user
|
85
142
|
end
|
86
143
|
|
87
|
-
def
|
88
|
-
|
144
|
+
def default_types
|
145
|
+
DEFAULT_TYPES
|
89
146
|
end
|
90
147
|
|
91
|
-
def
|
92
|
-
|
148
|
+
def parse_line(line)
|
149
|
+
values = line.chomp.strip.parse_csv.map { |e| e ? e : "" }
|
150
|
+
data = Hash[@keys.zip(values)]
|
151
|
+
|
152
|
+
unless data["StartTime"].nil?
|
153
|
+
start_time = Time.parse(data['StartTime'])
|
154
|
+
data['ElapsedTime'] = (Time.now - start_time).to_i
|
155
|
+
data["StartTime"] = start_time.to_s
|
156
|
+
end
|
157
|
+
|
158
|
+
data
|
159
|
+
end
|
160
|
+
|
161
|
+
def match_look_up_user?(data)
|
162
|
+
return true if @lookup_user.nil?
|
163
|
+
|
164
|
+
@lookup_user.include?(data["UserName"])
|
165
|
+
end
|
166
|
+
|
167
|
+
def default_command
|
168
|
+
command = [
|
169
|
+
command_ps,
|
170
|
+
pipe_filtering_normal_ps,
|
171
|
+
pipe_select_columns,
|
172
|
+
pipe_fixing_locale,
|
173
|
+
pipe_formatting_output,
|
174
|
+
].join
|
175
|
+
"#{@powershell_command} -command \"#{command}\""
|
176
|
+
end
|
177
|
+
|
178
|
+
def command_ps
|
179
|
+
if @keys.include?("UserName")
|
180
|
+
# The "IncludeUserName" option is needed to get the username, but this option requires Administrator privilege.
|
181
|
+
"Get-Process -IncludeUserName"
|
182
|
+
else
|
183
|
+
"Get-Process"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
def pipe_filtering_normal_ps
|
190
|
+
# There are some special processes that don't have some properties, such as the "Idle" process.
|
191
|
+
# Normally, these are specific to the system and are not important, so exclude them.
|
192
|
+
# Note: The same situation can occur in some processes if there are no Administrator privilege.
|
193
|
+
" | ?{$_.StartTime -ne $NULL -and $_.CPU -ne $NULL}"
|
194
|
+
end
|
195
|
+
|
196
|
+
def pipe_select_columns
|
197
|
+
if @keys.nil? || @keys.empty?
|
198
|
+
raise "The 'keys' parameter is not specified correctly. [keys: #{@keys}]"
|
199
|
+
end
|
200
|
+
|
201
|
+
" | Select-Object -Property #{@keys.join(',')}"
|
202
|
+
end
|
203
|
+
|
204
|
+
def pipe_fixing_locale()
|
205
|
+
# In Windows, setting the "$env:Lang" environment variable is not effective in changing the format of the output.
|
206
|
+
# You can use "Datetime.ToString" method to change format of datetime values in for-each pipe.
|
207
|
+
# Note: About "DateTime.ToString" method: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tostring
|
208
|
+
return "" unless @keys.include?("StartTime")
|
209
|
+
|
210
|
+
" | %{$_.StartTime = $_.StartTime.ToString('o'); return $_;}"
|
93
211
|
end
|
94
212
|
|
95
|
-
def
|
96
|
-
|
213
|
+
def pipe_formatting_output
|
214
|
+
# In the "ConvertTo-Csv" command, there are 2 lines of type info and header info at the beginning in the outputs.
|
215
|
+
# By the "NoTypeInformation" option, the line of type info is excluded.
|
216
|
+
# This enables you to skip the just first line for parsing, like linux or mac.
|
217
|
+
" | ConvertTo-Csv -NoTypeInformation"
|
97
218
|
end
|
98
219
|
end
|
99
220
|
end
|
data/test/helper.rb
CHANGED
@@ -12,15 +12,7 @@ require 'test/unit'
|
|
12
12
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
13
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
14
|
require 'fluent/test'
|
15
|
-
|
16
|
-
nulllogger = Object.new
|
17
|
-
nulllogger.instance_eval {|obj|
|
18
|
-
def method_missing(method, *args)
|
19
|
-
# pass
|
20
|
-
end
|
21
|
-
}
|
22
|
-
$log = nulllogger
|
23
|
-
end
|
15
|
+
require 'fluent/test/driver/input'
|
24
16
|
|
25
17
|
require 'fluent/plugin/in_watch_process'
|
26
18
|
|
@@ -10,7 +10,7 @@ class WatchProcessInputTest < Test::Unit::TestCase
|
|
10
10
|
]
|
11
11
|
|
12
12
|
def create_driver(conf = CONFIG)
|
13
|
-
Fluent::Test::
|
13
|
+
Fluent::Test::Driver::Input.new(Fluent::Plugin::WatchProcessInput).configure(conf)
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_configure
|
@@ -23,5 +23,103 @@ class WatchProcessInputTest < Test::Unit::TestCase
|
|
23
23
|
]
|
24
24
|
assert_equal 'input.watch_process', d.instance.tag
|
25
25
|
assert_equal ['apache', 'mycron'], d.instance.lookup_user
|
26
|
+
assert_equal :powershell, d.instance.powershell_command
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_windows_configure
|
30
|
+
omit "Only for UNIX like." unless Fluent.windows?
|
31
|
+
d = create_driver %[
|
32
|
+
tag input.watch_process
|
33
|
+
lookup_user apache, mycron
|
34
|
+
powershell_command pwsh
|
35
|
+
]
|
36
|
+
assert_equal 'input.watch_process', d.instance.tag
|
37
|
+
assert_equal ['apache', 'mycron'], d.instance.lookup_user
|
38
|
+
assert_equal :pwsh, d.instance.powershell_command
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_unixlike
|
42
|
+
omit "Only for UNIX like." if Fluent.windows?
|
43
|
+
whoami = `whoami`
|
44
|
+
d = create_driver %[
|
45
|
+
tag input.watch_process
|
46
|
+
lookup_user #{whoami}
|
47
|
+
interval 1s
|
48
|
+
]
|
49
|
+
d.run(expect_emits: 1, timeout: 3)
|
50
|
+
assert(d.events.size > 1)
|
51
|
+
end
|
52
|
+
|
53
|
+
sub_test_case "Windows" do
|
54
|
+
def test_windows_default
|
55
|
+
omit "Only for Windows." unless Fluent.windows?
|
56
|
+
d = create_driver %[
|
57
|
+
tag input.watch_process
|
58
|
+
interval 1s
|
59
|
+
]
|
60
|
+
default_keys = Fluent::Plugin::WatchProcessInput::WindowsWatcher::DEFAULT_KEYS + ["ElapsedTime"]
|
61
|
+
|
62
|
+
d.run(expect_records: 1, timeout: 10);
|
63
|
+
|
64
|
+
assert d.events.size > 0
|
65
|
+
|
66
|
+
tag, time, record = d.events[0]
|
67
|
+
|
68
|
+
assert_equal "input.watch_process", tag
|
69
|
+
assert time.is_a?(Fluent::EventTime)
|
70
|
+
assert_equal default_keys, record.keys
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_windows_customized
|
74
|
+
omit "Only for Windows." unless Fluent.windows?
|
75
|
+
custom_keys = ["PM", "Id", "UserProcessorTime", "Path"]
|
76
|
+
d = create_driver %[
|
77
|
+
tag input.watch_process
|
78
|
+
interval 1s
|
79
|
+
keys #{custom_keys.join(",")}
|
80
|
+
types Id:integer
|
81
|
+
]
|
82
|
+
|
83
|
+
d.run(expect_records: 1, timeout: 10);
|
84
|
+
|
85
|
+
assert d.events.size > 0
|
86
|
+
|
87
|
+
tag, time, record = d.events[0]
|
88
|
+
|
89
|
+
assert_equal "input.watch_process", tag
|
90
|
+
assert time.is_a?(Fluent::EventTime)
|
91
|
+
assert_equal custom_keys, record.keys
|
92
|
+
assert record["PM"].is_a?(String)
|
93
|
+
assert record["Id"].is_a?(Integer)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_windows_lookup
|
97
|
+
omit "Only for Windows." unless Fluent.windows?
|
98
|
+
d = create_driver %[
|
99
|
+
tag input.watch_process
|
100
|
+
interval 1s
|
101
|
+
]
|
102
|
+
d.run(expect_records: 1, timeout: 10);
|
103
|
+
|
104
|
+
assert d.events.size > 0
|
105
|
+
|
106
|
+
tag, time, record = d.events[0]
|
107
|
+
lookup_user = record["UserName"]
|
108
|
+
|
109
|
+
d = create_driver %[
|
110
|
+
tag input.watch_process
|
111
|
+
interval 1s
|
112
|
+
lookup_user #{lookup_user}
|
113
|
+
]
|
114
|
+
d.run(expect_records: 1, timeout: 10);
|
115
|
+
|
116
|
+
assert d.events.size > 0
|
117
|
+
|
118
|
+
other_user_records = d.events.reject do |tag, time, record|
|
119
|
+
lookup_user.include?(record["UserName"])
|
120
|
+
end
|
121
|
+
|
122
|
+
assert other_user_records.size == 0
|
123
|
+
end
|
26
124
|
end
|
27
125
|
end
|
metadata
CHANGED
@@ -1,110 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-watch-process
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kentaro Yoshida
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2021-05-30 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: test-unit
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 3.1.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 3.1.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: appraisal
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: fluentd
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
61
|
+
version: 0.14.0
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '2'
|
70
65
|
type: :runtime
|
71
66
|
prerelease: false
|
72
67
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
68
|
requirements:
|
75
|
-
- -
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 0.14.0
|
72
|
+
- - "<"
|
76
73
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
74
|
+
version: '2'
|
78
75
|
- !ruby/object:Gem::Dependency
|
79
76
|
name: fluent-mixin-rewrite-tag-name
|
80
77
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
78
|
requirements:
|
83
|
-
- -
|
79
|
+
- - ">="
|
84
80
|
- !ruby/object:Gem::Version
|
85
81
|
version: '0'
|
86
82
|
type: :runtime
|
87
83
|
prerelease: false
|
88
84
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
85
|
requirements:
|
91
|
-
- -
|
86
|
+
- - ">="
|
92
87
|
- !ruby/object:Gem::Version
|
93
88
|
version: '0'
|
94
89
|
- !ruby/object:Gem::Dependency
|
95
90
|
name: fluent-mixin-type-converter
|
96
91
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
92
|
requirements:
|
99
|
-
- -
|
93
|
+
- - ">="
|
100
94
|
- !ruby/object:Gem::Version
|
101
95
|
version: 0.1.0
|
102
96
|
type: :runtime
|
103
97
|
prerelease: false
|
104
98
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
99
|
requirements:
|
107
|
-
- -
|
100
|
+
- - ">="
|
108
101
|
- !ruby/object:Gem::Version
|
109
102
|
version: 0.1.0
|
110
103
|
description:
|
@@ -114,8 +107,8 @@ executables: []
|
|
114
107
|
extensions: []
|
115
108
|
extra_rdoc_files: []
|
116
109
|
files:
|
117
|
-
- .gitignore
|
118
|
-
- .travis.yml
|
110
|
+
- ".gitignore"
|
111
|
+
- ".travis.yml"
|
119
112
|
- Appraisals
|
120
113
|
- Gemfile
|
121
114
|
- LICENSE.txt
|
@@ -124,36 +117,34 @@ files:
|
|
124
117
|
- example1.conf
|
125
118
|
- example2.conf
|
126
119
|
- fluent-plugin-watch-process.gemspec
|
127
|
-
- gemfiles/fluentd_v0.12.gemfile
|
128
120
|
- gemfiles/fluentd_v0.14.gemfile
|
129
121
|
- lib/fluent/plugin/in_watch_process.rb
|
130
122
|
- test/helper.rb
|
131
123
|
- test/plugin/test_in_watch_process.rb
|
132
124
|
homepage: https://github.com/y-ken/fluent-plugin-watch-process
|
133
125
|
licenses: []
|
126
|
+
metadata: {}
|
134
127
|
post_install_message:
|
135
128
|
rdoc_options: []
|
136
129
|
require_paths:
|
137
130
|
- lib
|
138
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
132
|
requirements:
|
141
|
-
- -
|
133
|
+
- - ">="
|
142
134
|
- !ruby/object:Gem::Version
|
143
135
|
version: '0'
|
144
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
137
|
requirements:
|
147
|
-
- -
|
138
|
+
- - ">="
|
148
139
|
- !ruby/object:Gem::Version
|
149
140
|
version: '0'
|
150
141
|
requirements: []
|
151
|
-
|
152
|
-
rubygems_version: 1.8.23
|
142
|
+
rubygems_version: 3.1.6
|
153
143
|
signing_key:
|
154
|
-
specification_version:
|
155
|
-
summary: Fluentd Input plugin to collect continual process information via ps command
|
156
|
-
It is useful for cron/barch process
|
144
|
+
specification_version: 4
|
145
|
+
summary: Fluentd Input plugin to collect continual process information via ps command
|
146
|
+
or PowerShell pwsh command for Linux/osx/Windows. It is useful for cron/barch process
|
147
|
+
monitoring.
|
157
148
|
test_files:
|
158
149
|
- test/helper.rb
|
159
150
|
- test/plugin/test_in_watch_process.rb
|