logstash-integration-jdbc 5.2.4 → 5.4.11
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 +50 -0
- data/docs/filter-jdbc_static.asciidoc +14 -2
- data/docs/filter-jdbc_streaming.asciidoc +1 -1
- data/docs/input-jdbc.asciidoc +41 -4
- data/lib/logstash/filters/jdbc/basic_database.rb +1 -1
- data/lib/logstash/filters/jdbc/read_only_database.rb +2 -2
- data/lib/logstash/filters/jdbc_static.rb +19 -10
- data/lib/logstash/inputs/jdbc.rb +69 -20
- data/lib/logstash/plugin_mixins/jdbc/common.rb +2 -1
- data/lib/logstash/plugin_mixins/jdbc/jdbc.rb +22 -17
- data/lib/logstash/plugin_mixins/jdbc/sequel_bootstrap.rb +21 -0
- data/lib/logstash/plugin_mixins/jdbc/statement_handler.rb +51 -45
- data/lib/logstash/plugin_mixins/jdbc/timezone_proxy.rb +61 -0
- data/lib/logstash/plugin_mixins/jdbc/value_tracking.rb +16 -3
- data/lib/logstash-integration-jdbc_jars.rb +4 -2
- data/logstash-integration-jdbc.gemspec +6 -6
- data/spec/filters/jdbc_static_spec.rb +10 -0
- data/spec/filters/jdbc_streaming_spec.rb +7 -10
- data/spec/inputs/integration/integ_spec.rb +28 -9
- data/spec/inputs/jdbc_spec.rb +202 -59
- data/spec/plugin_mixins/jdbc/timezone_proxy_spec.rb +68 -0
- data/spec/plugin_mixins/jdbc/value_tracking_spec.rb +113 -0
- data/vendor/jar-dependencies/org/apache/derby/derby/10.15.2.1/derby-10.15.2.1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/derby/derbyclient/10.15.2.1/derbyclient-10.15.2.1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/derby/derbyshared/10.15.2.1/derbyshared-10.15.2.1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/derby/derbytools/10.15.2.1/derbytools-10.15.2.1.jar +0 -0
- metadata +39 -49
- data/lib/logstash/plugin_mixins/jdbc/checked_count_logger.rb +0 -43
- data/lib/logstash/plugin_mixins/jdbc/scheduler.rb +0 -175
- data/spec/plugin_mixins/jdbc/scheduler_spec.rb +0 -78
- data/vendor/jar-dependencies/org/apache/derby/derby/10.14.1.0/derby-10.14.1.0.jar +0 -0
- data/vendor/jar-dependencies/org/apache/derby/derbyclient/10.14.1.0/derbyclient-10.14.1.0.jar +0 -0
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-integration-jdbc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -17,8 +17,8 @@ dependencies:
|
|
17
17
|
- !ruby/object:Gem::Version
|
18
18
|
version: '0.3'
|
19
19
|
name: jar-dependencies
|
20
|
-
prerelease: false
|
21
20
|
type: :development
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
@@ -34,8 +34,8 @@ dependencies:
|
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '2.99'
|
36
36
|
name: logstash-core-plugin-api
|
37
|
-
prerelease: false
|
38
37
|
type: :runtime
|
38
|
+
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
@@ -51,8 +51,8 @@ dependencies:
|
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 6.5.0
|
53
53
|
name: logstash-core
|
54
|
-
prerelease: false
|
55
54
|
type: :runtime
|
55
|
+
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - ">="
|
@@ -65,8 +65,8 @@ dependencies:
|
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: '0'
|
67
67
|
name: logstash-codec-plain
|
68
|
-
prerelease: false
|
69
68
|
type: :runtime
|
69
|
+
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - ">="
|
@@ -77,15 +77,15 @@ dependencies:
|
|
77
77
|
requirements:
|
78
78
|
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
80
|
+
version: 5.74.0
|
81
81
|
name: sequel
|
82
|
-
prerelease: false
|
83
82
|
type: :runtime
|
83
|
+
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
88
|
+
version: 5.74.0
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
requirement: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
@@ -93,8 +93,8 @@ dependencies:
|
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: '0'
|
95
95
|
name: lru_redux
|
96
|
-
prerelease: false
|
97
96
|
type: :runtime
|
97
|
+
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - ">="
|
@@ -107,8 +107,8 @@ dependencies:
|
|
107
107
|
- !ruby/object:Gem::Version
|
108
108
|
version: '0'
|
109
109
|
name: tzinfo
|
110
|
-
prerelease: false
|
111
110
|
type: :runtime
|
111
|
+
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - ">="
|
@@ -121,8 +121,8 @@ dependencies:
|
|
121
121
|
- !ruby/object:Gem::Version
|
122
122
|
version: '0'
|
123
123
|
name: tzinfo-data
|
124
|
-
prerelease: false
|
125
124
|
type: :runtime
|
125
|
+
prerelease: false
|
126
126
|
version_requirements: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
128
|
- - ">="
|
@@ -131,40 +131,40 @@ dependencies:
|
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
132
|
requirement: !ruby/object:Gem::Requirement
|
133
133
|
requirements:
|
134
|
-
- - "
|
134
|
+
- - "~>"
|
135
135
|
- !ruby/object:Gem::Version
|
136
|
-
version: '
|
137
|
-
name:
|
138
|
-
prerelease: false
|
136
|
+
version: '1.3'
|
137
|
+
name: logstash-mixin-ecs_compatibility_support
|
139
138
|
type: :runtime
|
139
|
+
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
|
-
- - "
|
142
|
+
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '
|
144
|
+
version: '1.3'
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
requirement: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
148
|
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version: '1.
|
151
|
-
name: logstash-mixin-
|
152
|
-
prerelease: false
|
150
|
+
version: '1.0'
|
151
|
+
name: logstash-mixin-validator_support
|
153
152
|
type: :runtime
|
153
|
+
prerelease: false
|
154
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: '1.
|
158
|
+
version: '1.0'
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
162
|
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
164
|
version: '1.0'
|
165
|
-
name: logstash-mixin-
|
166
|
-
prerelease: false
|
165
|
+
name: logstash-mixin-event_support
|
167
166
|
type: :runtime
|
167
|
+
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
170
|
- - "~>"
|
@@ -176,9 +176,9 @@ dependencies:
|
|
176
176
|
- - "~>"
|
177
177
|
- !ruby/object:Gem::Version
|
178
178
|
version: '1.0'
|
179
|
-
name: logstash-mixin-
|
180
|
-
prerelease: false
|
179
|
+
name: logstash-mixin-scheduler
|
181
180
|
type: :runtime
|
181
|
+
prerelease: false
|
182
182
|
version_requirements: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
184
|
- - "~>"
|
@@ -191,8 +191,8 @@ dependencies:
|
|
191
191
|
- !ruby/object:Gem::Version
|
192
192
|
version: '0'
|
193
193
|
name: childprocess
|
194
|
-
prerelease: false
|
195
194
|
type: :development
|
195
|
+
prerelease: false
|
196
196
|
version_requirements: !ruby/object:Gem::Requirement
|
197
197
|
requirements:
|
198
198
|
- - ">="
|
@@ -205,8 +205,8 @@ dependencies:
|
|
205
205
|
- !ruby/object:Gem::Version
|
206
206
|
version: '2.3'
|
207
207
|
name: logstash-devutils
|
208
|
-
prerelease: false
|
209
208
|
type: :development
|
209
|
+
prerelease: false
|
210
210
|
version_requirements: !ruby/object:Gem::Requirement
|
211
211
|
requirements:
|
212
212
|
- - ">="
|
@@ -219,22 +219,8 @@ dependencies:
|
|
219
219
|
- !ruby/object:Gem::Version
|
220
220
|
version: '0'
|
221
221
|
name: timecop
|
222
|
-
prerelease: false
|
223
222
|
type: :development
|
224
|
-
version_requirements: !ruby/object:Gem::Requirement
|
225
|
-
requirements:
|
226
|
-
- - ">="
|
227
|
-
- !ruby/object:Gem::Version
|
228
|
-
version: '0'
|
229
|
-
- !ruby/object:Gem::Dependency
|
230
|
-
requirement: !ruby/object:Gem::Requirement
|
231
|
-
requirements:
|
232
|
-
- - ">="
|
233
|
-
- !ruby/object:Gem::Version
|
234
|
-
version: '0'
|
235
|
-
name: jdbc-derby
|
236
223
|
prerelease: false
|
237
|
-
type: :development
|
238
224
|
version_requirements: !ruby/object:Gem::Requirement
|
239
225
|
requirements:
|
240
226
|
- - ">="
|
@@ -275,11 +261,11 @@ files:
|
|
275
261
|
- lib/logstash/filters/jdbc_streaming.rb
|
276
262
|
- lib/logstash/inputs/jdbc.rb
|
277
263
|
- lib/logstash/inputs/tzinfo_jruby_patch.rb
|
278
|
-
- lib/logstash/plugin_mixins/jdbc/checked_count_logger.rb
|
279
264
|
- lib/logstash/plugin_mixins/jdbc/common.rb
|
280
265
|
- lib/logstash/plugin_mixins/jdbc/jdbc.rb
|
281
|
-
- lib/logstash/plugin_mixins/jdbc/
|
266
|
+
- lib/logstash/plugin_mixins/jdbc/sequel_bootstrap.rb
|
282
267
|
- lib/logstash/plugin_mixins/jdbc/statement_handler.rb
|
268
|
+
- lib/logstash/plugin_mixins/jdbc/timezone_proxy.rb
|
283
269
|
- lib/logstash/plugin_mixins/jdbc/value_tracking.rb
|
284
270
|
- lib/logstash/plugin_mixins/jdbc_streaming.rb
|
285
271
|
- lib/logstash/plugin_mixins/jdbc_streaming/cache_payload.rb
|
@@ -307,10 +293,13 @@ files:
|
|
307
293
|
- spec/helpers/derbyrun.jar
|
308
294
|
- spec/inputs/integration/integ_spec.rb
|
309
295
|
- spec/inputs/jdbc_spec.rb
|
310
|
-
- spec/plugin_mixins/jdbc/
|
296
|
+
- spec/plugin_mixins/jdbc/timezone_proxy_spec.rb
|
297
|
+
- spec/plugin_mixins/jdbc/value_tracking_spec.rb
|
311
298
|
- spec/plugin_mixins/jdbc_streaming/parameter_handler_spec.rb
|
312
|
-
- vendor/jar-dependencies/org/apache/derby/derby/10.
|
313
|
-
- vendor/jar-dependencies/org/apache/derby/derbyclient/10.
|
299
|
+
- vendor/jar-dependencies/org/apache/derby/derby/10.15.2.1/derby-10.15.2.1.jar
|
300
|
+
- vendor/jar-dependencies/org/apache/derby/derbyclient/10.15.2.1/derbyclient-10.15.2.1.jar
|
301
|
+
- vendor/jar-dependencies/org/apache/derby/derbyshared/10.15.2.1/derbyshared-10.15.2.1.jar
|
302
|
+
- vendor/jar-dependencies/org/apache/derby/derbytools/10.15.2.1/derbytools-10.15.2.1.jar
|
314
303
|
homepage: http://www.elastic.co/guide/en/logstash/current/index.html
|
315
304
|
licenses:
|
316
305
|
- Apache License (2.0)
|
@@ -334,7 +323,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
334
323
|
- !ruby/object:Gem::Version
|
335
324
|
version: '0'
|
336
325
|
requirements: []
|
337
|
-
rubygems_version: 3.
|
326
|
+
rubygems_version: 3.3.26
|
338
327
|
signing_key:
|
339
328
|
specification_version: 4
|
340
329
|
summary: Integration with JDBC - input and filter plugins
|
@@ -360,5 +349,6 @@ test_files:
|
|
360
349
|
- spec/helpers/derbyrun.jar
|
361
350
|
- spec/inputs/integration/integ_spec.rb
|
362
351
|
- spec/inputs/jdbc_spec.rb
|
363
|
-
- spec/plugin_mixins/jdbc/
|
352
|
+
- spec/plugin_mixins/jdbc/timezone_proxy_spec.rb
|
353
|
+
- spec/plugin_mixins/jdbc/value_tracking_spec.rb
|
364
354
|
- spec/plugin_mixins/jdbc_streaming/parameter_handler_spec.rb
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module LogStash module PluginMixins module Jdbc
|
4
|
-
class CheckedCountLogger
|
5
|
-
def initialize(logger)
|
6
|
-
@logger = logger
|
7
|
-
@needs_check = true
|
8
|
-
@count_is_supported = false
|
9
|
-
@in_debug = @logger.debug?
|
10
|
-
end
|
11
|
-
|
12
|
-
def disable_count
|
13
|
-
@needs_check = false
|
14
|
-
@count_is_supported = false
|
15
|
-
end
|
16
|
-
|
17
|
-
def log_statement_parameters(statement, parameters, query)
|
18
|
-
return unless @in_debug
|
19
|
-
check_count_query(query) if @needs_check && query
|
20
|
-
if @count_is_supported
|
21
|
-
@logger.debug("Executing JDBC query", :statement => statement, :parameters => parameters, :count => execute_count(query))
|
22
|
-
else
|
23
|
-
@logger.debug("Executing JDBC query", :statement => statement, :parameters => parameters)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def check_count_query(query)
|
28
|
-
@needs_check = false
|
29
|
-
begin
|
30
|
-
execute_count(query)
|
31
|
-
@count_is_supported = true
|
32
|
-
rescue Exception => e
|
33
|
-
@logger.warn("Attempting a count query raised an error, the generated count statement is most likely incorrect but check networking, authentication or your statement syntax", "exception" => e.message)
|
34
|
-
@logger.warn("Ongoing count statement generation is being prevented")
|
35
|
-
@count_is_supported = false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def execute_count(query)
|
40
|
-
query.count
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end end end
|
@@ -1,175 +0,0 @@
|
|
1
|
-
require 'rufus/scheduler'
|
2
|
-
|
3
|
-
require 'logstash/util/loggable'
|
4
|
-
|
5
|
-
module LogStash module PluginMixins module Jdbc
|
6
|
-
class Scheduler < Rufus::Scheduler
|
7
|
-
|
8
|
-
include LogStash::Util::Loggable
|
9
|
-
|
10
|
-
# Rufus::Scheduler >= 3.4 moved the Time impl into a gem EoTime = ::EtOrbi::EoTime`
|
11
|
-
# Rufus::Scheduler 3.1 - 3.3 using it's own Time impl `Rufus::Scheduler::ZoTime`
|
12
|
-
TimeImpl = defined?(Rufus::Scheduler::EoTime) ? Rufus::Scheduler::EoTime :
|
13
|
-
(defined?(Rufus::Scheduler::ZoTime) ? Rufus::Scheduler::ZoTime : ::Time)
|
14
|
-
|
15
|
-
# @param cron [String] cron-line
|
16
|
-
# @param opts [Hash] scheduler options
|
17
|
-
# @return scheduler instance
|
18
|
-
def self.start_cron_scheduler(cron, opts = {}, &block)
|
19
|
-
unless block_given?
|
20
|
-
raise ArgumentError, 'missing (cron scheduler) block - worker task to execute'
|
21
|
-
end
|
22
|
-
scheduler = new_scheduler(opts)
|
23
|
-
scheduler.schedule_cron(cron, &block)
|
24
|
-
scheduler
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param opts [Hash] scheduler options
|
28
|
-
# @return scheduler instance
|
29
|
-
def self.new_scheduler(opts)
|
30
|
-
unless opts.key?(:thread_name)
|
31
|
-
raise ArgumentError, 'thread_name: option is required to be able to distinguish multiple scheduler threads'
|
32
|
-
end
|
33
|
-
opts[:max_work_threads] ||= 1
|
34
|
-
# amount the scheduler thread sleeps between checking whether jobs
|
35
|
-
# should trigger, default is 0.3 which is a bit too often ...
|
36
|
-
# in theory the cron expression '* * * * * *' supports running jobs
|
37
|
-
# every second but this is very rare, we could potentially go higher
|
38
|
-
opts[:frequency] ||= 1.0
|
39
|
-
|
40
|
-
new(opts)
|
41
|
-
end
|
42
|
-
|
43
|
-
# @overload
|
44
|
-
def timeout_jobs
|
45
|
-
# Rufus relies on `Thread.list` which is a blocking operation and with many schedulers
|
46
|
-
# (and threads) within LS will have a negative impact on performance as scheduler
|
47
|
-
# threads will end up waiting to obtain the `Thread.list` lock.
|
48
|
-
#
|
49
|
-
# However, this isn't necessary we can easily detect whether there are any jobs
|
50
|
-
# that might need to timeout: only when `@opts[:timeout]` is set causes worker thread(s)
|
51
|
-
# to have a `Thread.current[:rufus_scheduler_timeout]` that is not nil
|
52
|
-
return unless @opts[:timeout]
|
53
|
-
super
|
54
|
-
end
|
55
|
-
|
56
|
-
# @overload
|
57
|
-
def work_threads(query = :all)
|
58
|
-
if query == :__all_no_cache__ # special case from JobDecorator#start_work_thread
|
59
|
-
@_work_threads = nil # when a new worker thread is being added reset
|
60
|
-
return super(:all)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Gets executed every time a job is triggered, we're going to cache the
|
64
|
-
# worker threads for this scheduler (to avoid `Thread.list`) - they only
|
65
|
-
# change when a new thread is being started from #start_work_thread ...
|
66
|
-
work_threads = @_work_threads
|
67
|
-
if work_threads.nil?
|
68
|
-
work_threads = threads.select { |t| t[:rufus_scheduler_work_thread] }
|
69
|
-
@_work_threads = work_threads
|
70
|
-
end
|
71
|
-
|
72
|
-
case query
|
73
|
-
when :active then work_threads.select { |t| t[:rufus_scheduler_job] }
|
74
|
-
when :vacant then work_threads.reject { |t| t[:rufus_scheduler_job] }
|
75
|
-
else work_threads
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# @overload
|
80
|
-
def on_error(job, err)
|
81
|
-
details = { exception: err.class, message: err.message, backtrace: err.backtrace }
|
82
|
-
details[:cause] = err.cause if err.cause
|
83
|
-
|
84
|
-
details[:now] = debug_format_time(TimeImpl.now)
|
85
|
-
details[:last_time] = (debug_format_time(job.last_time) rescue nil)
|
86
|
-
details[:next_time] = (debug_format_time(job.next_time) rescue nil)
|
87
|
-
details[:job] = job
|
88
|
-
|
89
|
-
details[:opts] = @opts
|
90
|
-
details[:started_at] = started_at
|
91
|
-
details[:thread] = thread.inspect
|
92
|
-
details[:jobs_size] = @jobs.size
|
93
|
-
details[:work_threads_size] = work_threads.size
|
94
|
-
details[:work_queue_size] = work_queue.size
|
95
|
-
|
96
|
-
logger.error("Scheduler intercepted an error:", details)
|
97
|
-
|
98
|
-
rescue => e
|
99
|
-
logger.error("Scheduler failed in #on_error #{e.inspect}")
|
100
|
-
end
|
101
|
-
|
102
|
-
def debug_format_time(time)
|
103
|
-
# EtOrbi::EoTime used by (newer) Rufus::Scheduler has to_debug_s https://git.io/JyiPj
|
104
|
-
time.respond_to?(:to_debug_s) ? time.to_debug_s : time.strftime("%Y-%m-%dT%H:%M:%S.%L")
|
105
|
-
end
|
106
|
-
private :debug_format_time
|
107
|
-
|
108
|
-
# @private helper used by JobDecorator
|
109
|
-
def work_thread_name_prefix
|
110
|
-
( @opts[:thread_name] || "#{@thread_key}_scheduler" ) + '_worker-'
|
111
|
-
end
|
112
|
-
|
113
|
-
protected
|
114
|
-
|
115
|
-
# @overload
|
116
|
-
def start
|
117
|
-
ret = super() # @thread[:name] = @opts[:thread_name] || "#{@thread_key}_scheduler"
|
118
|
-
|
119
|
-
# at least set thread.name for easier thread dump analysis
|
120
|
-
if @thread.is_a?(Thread) && @thread.respond_to?(:name=)
|
121
|
-
@thread.name = @thread[:name] if @thread[:name]
|
122
|
-
end
|
123
|
-
|
124
|
-
ret
|
125
|
-
end
|
126
|
-
|
127
|
-
# @overload
|
128
|
-
def do_schedule(job_type, t, callable, opts, return_job_instance, block)
|
129
|
-
job_or_id = super
|
130
|
-
|
131
|
-
job_or_id.extend JobDecorator if return_job_instance
|
132
|
-
|
133
|
-
job_or_id
|
134
|
-
end
|
135
|
-
|
136
|
-
module JobDecorator
|
137
|
-
|
138
|
-
def start_work_thread
|
139
|
-
prev_thread_count = @scheduler.work_threads.size
|
140
|
-
|
141
|
-
ret = super() # does not return Thread instance in 3.0
|
142
|
-
|
143
|
-
work_threads = @scheduler.work_threads(:__all_no_cache__)
|
144
|
-
while prev_thread_count == work_threads.size # very unlikely
|
145
|
-
Thread.pass
|
146
|
-
work_threads = @scheduler.work_threads(:__all_no_cache__)
|
147
|
-
end
|
148
|
-
|
149
|
-
work_thread_name_prefix = @scheduler.work_thread_name_prefix
|
150
|
-
|
151
|
-
work_threads.sort! do |t1, t2|
|
152
|
-
if t1[:name].nil?
|
153
|
-
t2[:name].nil? ? 0 : +1 # nils at the end
|
154
|
-
elsif t2[:name].nil?
|
155
|
-
t1[:name].nil? ? 0 : -1
|
156
|
-
else
|
157
|
-
t1[:name] <=> t2[:name]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
work_threads.each_with_index do |thread, i|
|
162
|
-
unless thread[:name]
|
163
|
-
thread[:name] = "#{work_thread_name_prefix}#{sprintf('%02i', i)}"
|
164
|
-
thread.name = thread[:name] if thread.respond_to?(:name=)
|
165
|
-
# e.g. "[oracle]<jdbc_scheduler_worker-00"
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
ret
|
170
|
-
end
|
171
|
-
|
172
|
-
end
|
173
|
-
|
174
|
-
end
|
175
|
-
end end end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/devutils/rspec/spec_helper"
|
3
|
-
require "logstash/plugin_mixins/jdbc/scheduler"
|
4
|
-
|
5
|
-
describe LogStash::PluginMixins::Jdbc::Scheduler do
|
6
|
-
|
7
|
-
let(:thread_name) { '[test]<jdbc_scheduler' }
|
8
|
-
|
9
|
-
let(:opts) do
|
10
|
-
{ :max_work_threads => 2, :thread_name => thread_name }
|
11
|
-
end
|
12
|
-
|
13
|
-
subject(:scheduler) { LogStash::PluginMixins::Jdbc::Scheduler.new(opts) }
|
14
|
-
|
15
|
-
after { scheduler.stop(:wait) }
|
16
|
-
|
17
|
-
it "sets scheduler thread name" do
|
18
|
-
expect( scheduler.thread.name ).to include thread_name
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'cron schedule' do
|
22
|
-
|
23
|
-
before do
|
24
|
-
scheduler.schedule_cron('* * * * * *') { sleep 1.25 } # every second
|
25
|
-
end
|
26
|
-
|
27
|
-
it "sets worker thread names" do
|
28
|
-
sleep 3.0
|
29
|
-
threads = scheduler.work_threads
|
30
|
-
threads.sort! { |t1, t2| (t1.name || '') <=> (t2.name || '') }
|
31
|
-
|
32
|
-
expect( threads.size ).to eql 2
|
33
|
-
expect( threads.first.name ).to eql "#{thread_name}_worker-00"
|
34
|
-
expect( threads.last.name ).to eql "#{thread_name}_worker-01"
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'every 1s' do
|
40
|
-
|
41
|
-
before do
|
42
|
-
scheduler.schedule_in('1s') { raise 'TEST' } # every second
|
43
|
-
end
|
44
|
-
|
45
|
-
it "logs errors handled" do
|
46
|
-
expect( scheduler.logger ).to receive(:error).with /Scheduler intercepted an error/, hash_including(:message => 'TEST')
|
47
|
-
sleep 1.5
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'work threads' do
|
53
|
-
|
54
|
-
let(:opts) { super().merge :max_work_threads => 3 }
|
55
|
-
|
56
|
-
let(:counter) { java.util.concurrent.atomic.AtomicLong.new(0) }
|
57
|
-
|
58
|
-
before do
|
59
|
-
scheduler.schedule_cron('* * * * * *') { counter.increment_and_get; sleep 3.25 } # every second
|
60
|
-
end
|
61
|
-
|
62
|
-
it "are working" do
|
63
|
-
sleep(0.05) while counter.get == 0
|
64
|
-
expect( scheduler.work_threads.size ).to eql 1
|
65
|
-
sleep(0.05) while counter.get == 1
|
66
|
-
expect( scheduler.work_threads.size ).to eql 2
|
67
|
-
sleep(0.05) while counter.get == 2
|
68
|
-
expect( scheduler.work_threads.size ).to eql 3
|
69
|
-
|
70
|
-
sleep 1.25
|
71
|
-
expect( scheduler.work_threads.size ).to eql 3
|
72
|
-
sleep 1.25
|
73
|
-
expect( scheduler.work_threads.size ).to eql 3
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
Binary file
|