logstash-integration-jdbc 5.0.7 → 5.1.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 +4 -4
- data/CHANGELOG.md +8 -0
- data/docs/filter-jdbc_static.asciidoc +2 -2
- data/docs/input-jdbc.asciidoc +12 -0
- data/lib/logstash/filters/jdbc/lookup.rb +6 -0
- data/lib/logstash/filters/jdbc_static.rb +5 -0
- data/lib/logstash/inputs/jdbc.rb +23 -1
- data/logstash-integration-jdbc.gemspec +3 -1
- data/spec/filters/jdbc/lookup_spec.rb +31 -0
- data/spec/inputs/jdbc_spec.rb +42 -0
- metadata +30 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 59bbd486f1af029b2e7fe07b9356ac1703d864fc9838c3e2275453bf669eae18
|
|
4
|
+
data.tar.gz: 7f2a890f71fe484bd36935491ca5797795b15bad86f9e52317e385c8546316a9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dfb59eb31fd43a12e8baaa3c861f8558ed6158ed1693b7994f147ee035ee46e09c7f041648376cf11c510f86ef72221229944fdae1db3bdf3ec273318fbf6279
|
|
7
|
+
data.tar.gz: fae0dcec43219c1c98581ee0ff441818c4cafe8cb24d6cae08cc521f74ba4055a21178657fb3e989d9e9f2572c5a750bce975839f62f5309c70cbc096cb03e35
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## 5.1.0
|
|
2
|
+
- Added `target` option to JDBC input, allowing the row columns to target a specific field instead of being expanded
|
|
3
|
+
at the root of the event. This allows the input to play nicer with the Elastic Common Schema when
|
|
4
|
+
the input does not follow the schema. [#69](https://github.com/logstash-plugins/logstash-integration-jdbc/issues/69)
|
|
5
|
+
|
|
6
|
+
- Added `target` to JDBC filter static `local_lookups` to verify it's properly valued when ECS is enabled.
|
|
7
|
+
[#71](https://github.com/logstash-plugins/logstash-integration-jdbc/issues/71)
|
|
8
|
+
|
|
1
9
|
## 5.0.7
|
|
2
10
|
- Feat: try hard to log Java cause (chain) [#62](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/62)
|
|
3
11
|
|
|
@@ -422,7 +422,7 @@ according to the table below.
|
|
|
422
422
|
|=======================================================================
|
|
423
423
|
|Setting |Input type|Required
|
|
424
424
|
| id|string|No
|
|
425
|
-
|
|
|
425
|
+
| local_table|string|Yes
|
|
426
426
|
| query|string|Yes
|
|
427
427
|
| max_rows|number|No
|
|
428
428
|
| jdbc_connection_string|string|No
|
|
@@ -438,7 +438,7 @@ id::
|
|
|
438
438
|
An optional identifier. This is used to identify the loader that is
|
|
439
439
|
generating error messages and log lines.
|
|
440
440
|
|
|
441
|
-
|
|
441
|
+
local_table::
|
|
442
442
|
The destination table in the local lookup database that the loader will fill.
|
|
443
443
|
|
|
444
444
|
query::
|
data/docs/input-jdbc.asciidoc
CHANGED
|
@@ -211,6 +211,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
|
|
|
211
211
|
| <<plugins-{type}s-{plugin}-sql_log_level>> |<<string,string>>, one of `["fatal", "error", "warn", "info", "debug"]`|No
|
|
212
212
|
| <<plugins-{type}s-{plugin}-statement>> |<<string,string>>|No
|
|
213
213
|
| <<plugins-{type}s-{plugin}-statement_filepath>> |a valid filesystem path|No
|
|
214
|
+
| <<plugins-{type}s-{plugin}-target>> | {logstash-ref}/field-references-deepdive.html[field reference] | No
|
|
214
215
|
| <<plugins-{type}s-{plugin}-tracking_column>> |<<string,string>>|No
|
|
215
216
|
| <<plugins-{type}s-{plugin}-tracking_column_type>> |<<string,string>>, one of `["numeric", "timestamp"]`|No
|
|
216
217
|
| <<plugins-{type}s-{plugin}-use_column_value>> |<<boolean,boolean>>|No
|
|
@@ -535,6 +536,17 @@ with the `parameters` setting.
|
|
|
535
536
|
|
|
536
537
|
Path of file containing statement to execute
|
|
537
538
|
|
|
539
|
+
[id="plugins-{type}s-{plugin}-target"]
|
|
540
|
+
===== `target`
|
|
541
|
+
|
|
542
|
+
* Value type is {logstash-ref}/field-references-deepdive.html[field reference]
|
|
543
|
+
* There is no default value for this setting.
|
|
544
|
+
|
|
545
|
+
Without a `target`, events are created from each row column at the root level.
|
|
546
|
+
When the `target` is set to a field reference, the column of each row is placed in the target field instead.
|
|
547
|
+
|
|
548
|
+
This option can be useful to avoid populating unknown fields when a downstream schema such as ECS is enforced.
|
|
549
|
+
|
|
538
550
|
[id="plugins-{type}s-{plugin}-tracking_column"]
|
|
539
551
|
===== `tracking_column`
|
|
540
552
|
|
|
@@ -56,6 +56,12 @@ module LogStash module Filters module Jdbc
|
|
|
56
56
|
@target = options["target"]
|
|
57
57
|
@id_used_as_target = @target.nil?
|
|
58
58
|
if @id_used_as_target
|
|
59
|
+
# target shouldn't be nil if ecs_compatibility is not :disabled
|
|
60
|
+
if globals[:ecs_compatibility] != :disabled
|
|
61
|
+
logger.info('ECS compatibility is enabled but no ``target`` option was specified, it is recommended'\
|
|
62
|
+
' to set the option to avoid potential schema conflicts (if your data is ECS compliant or'\
|
|
63
|
+
' non-conflicting feel free to ignore this message)')
|
|
64
|
+
end
|
|
59
65
|
@target = @id
|
|
60
66
|
end
|
|
61
67
|
@options = options
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require "logstash-integration-jdbc_jars"
|
|
3
3
|
require "logstash/filters/base"
|
|
4
4
|
require "logstash/namespace"
|
|
5
|
+
require "logstash/plugin_mixins/ecs_compatibility_support"
|
|
5
6
|
require_relative "jdbc/loader"
|
|
6
7
|
require_relative "jdbc/loader_schedule"
|
|
7
8
|
require_relative "jdbc/repeating_load_runner"
|
|
@@ -14,6 +15,9 @@ require_relative "jdbc/lookup_processor"
|
|
|
14
15
|
|
|
15
16
|
#
|
|
16
17
|
module LogStash module Filters class JdbcStatic < LogStash::Filters::Base
|
|
18
|
+
# adds ecs_compatibility config which could be :disabled or :v1
|
|
19
|
+
include LogStash::PluginMixins::ECSCompatibilitySupport(:disabled, :v1, :v8 => :v1)
|
|
20
|
+
|
|
17
21
|
config_name "jdbc_static"
|
|
18
22
|
|
|
19
23
|
# Define the loaders, an Array of Hashes, to fetch remote data and create local tables.
|
|
@@ -214,6 +218,7 @@ module LogStash module Filters class JdbcStatic < LogStash::Filters::Base
|
|
|
214
218
|
options["lookup_jdbc_driver_class"] = @lookup_jdbc_driver_class
|
|
215
219
|
options["lookup_jdbc_driver_library"] = @lookup_jdbc_driver_library
|
|
216
220
|
options["lookup_jdbc_connection_string"] = @lookup_jdbc_connection_string
|
|
221
|
+
options["ecs_compatibility"] = ecs_compatibility
|
|
217
222
|
options
|
|
218
223
|
end
|
|
219
224
|
|
data/lib/logstash/inputs/jdbc.rb
CHANGED
|
@@ -3,6 +3,8 @@ require "logstash/inputs/base"
|
|
|
3
3
|
require "logstash/namespace"
|
|
4
4
|
require "logstash/plugin_mixins/jdbc/common"
|
|
5
5
|
require "logstash/plugin_mixins/jdbc/jdbc"
|
|
6
|
+
require "logstash/plugin_mixins/ecs_compatibility_support"
|
|
7
|
+
require "logstash/plugin_mixins/validator_support/field_reference_validation_adapter"
|
|
6
8
|
|
|
7
9
|
# this require_relative returns early unless the JRuby version is between 9.2.0.0 and 9.2.8.0
|
|
8
10
|
require_relative "tzinfo_jruby_patch"
|
|
@@ -129,6 +131,11 @@ require_relative "tzinfo_jruby_patch"
|
|
|
129
131
|
module LogStash module Inputs class Jdbc < LogStash::Inputs::Base
|
|
130
132
|
include LogStash::PluginMixins::Jdbc::Common
|
|
131
133
|
include LogStash::PluginMixins::Jdbc::Jdbc
|
|
134
|
+
# adds ecs_compatibility config which could be :disabled or :v1
|
|
135
|
+
include LogStash::PluginMixins::ECSCompatibilitySupport(:disabled,:v1,:v8 => :v1)
|
|
136
|
+
# adds :field_reference validator adapter
|
|
137
|
+
extend LogStash::PluginMixins::ValidatorSupport::FieldReferenceValidationAdapter
|
|
138
|
+
|
|
132
139
|
config_name "jdbc"
|
|
133
140
|
|
|
134
141
|
# If undefined, Logstash will complain, even if codec is unused.
|
|
@@ -209,6 +216,9 @@ module LogStash module Inputs class Jdbc < LogStash::Inputs::Base
|
|
|
209
216
|
|
|
210
217
|
config :prepared_statement_bind_values, :validate => :array, :default => []
|
|
211
218
|
|
|
219
|
+
# Define the target field to store the loaded columns
|
|
220
|
+
config :target, :validate => :field_reference, :required => false
|
|
221
|
+
|
|
212
222
|
attr_reader :database # for test mocking/stubbing
|
|
213
223
|
|
|
214
224
|
public
|
|
@@ -260,6 +270,13 @@ module LogStash module Inputs class Jdbc < LogStash::Inputs::Base
|
|
|
260
270
|
converters[encoding] = converter
|
|
261
271
|
end
|
|
262
272
|
end
|
|
273
|
+
|
|
274
|
+
# target must be populated if ecs_compatibility is not :disabled
|
|
275
|
+
if @target.nil? && ecs_compatibility != :disabled
|
|
276
|
+
logger.info('ECS compatibility is enabled but no ``target`` option was specified, it is recommended'\
|
|
277
|
+
' to set the option to avoid potential schema conflicts (if your data is ECS compliant or'\
|
|
278
|
+
' non-conflicting feel free to ignore this message)')
|
|
279
|
+
end
|
|
263
280
|
end # def register
|
|
264
281
|
|
|
265
282
|
# test injection points
|
|
@@ -318,7 +335,12 @@ module LogStash module Inputs class Jdbc < LogStash::Inputs::Base
|
|
|
318
335
|
## do the necessary conversions to string elements
|
|
319
336
|
row = Hash[row.map { |k, v| [k.to_s, convert(k, v)] }]
|
|
320
337
|
end
|
|
321
|
-
|
|
338
|
+
if @target
|
|
339
|
+
event = LogStash::Event.new
|
|
340
|
+
event.set(@target, row)
|
|
341
|
+
else
|
|
342
|
+
event = LogStash::Event.new(row)
|
|
343
|
+
end
|
|
322
344
|
decorate(event)
|
|
323
345
|
queue << event
|
|
324
346
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = 'logstash-integration-jdbc'
|
|
3
|
-
s.version = '5.0
|
|
3
|
+
s.version = '5.1.0'
|
|
4
4
|
s.licenses = ['Apache License (2.0)']
|
|
5
5
|
s.summary = "Integration with JDBC - input and filter plugins"
|
|
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"
|
|
@@ -36,6 +36,8 @@ Gem::Specification.new do |s|
|
|
|
36
36
|
s.add_runtime_dependency 'tzinfo-data'
|
|
37
37
|
# 3.5 limitation is required for jdbc-static loading schedule
|
|
38
38
|
s.add_runtime_dependency 'rufus-scheduler', '< 3.5'
|
|
39
|
+
s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.2'
|
|
40
|
+
s.add_runtime_dependency "logstash-mixin-validator_support", '~> 1.0'
|
|
39
41
|
|
|
40
42
|
s.add_development_dependency "childprocess"
|
|
41
43
|
s.add_development_dependency 'logstash-devutils'
|
|
@@ -248,6 +248,37 @@ module LogStash module Filters module Jdbc
|
|
|
248
248
|
expect(subject.valid?).to be_falsey
|
|
249
249
|
end
|
|
250
250
|
end
|
|
251
|
+
|
|
252
|
+
describe "validation of target option" do
|
|
253
|
+
let(:lookup_hash) do
|
|
254
|
+
{
|
|
255
|
+
"query" => "select * from servers WHERE ip LIKE ? AND os LIKE ?",
|
|
256
|
+
"prepared_parameters" => ["%%{[ip]}"],
|
|
257
|
+
}
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "should log a warn when ECS is enabled and target not defined" do
|
|
261
|
+
|
|
262
|
+
class LoggableLookup < Lookup
|
|
263
|
+
|
|
264
|
+
@@TEST_LOGGER = nil
|
|
265
|
+
|
|
266
|
+
def self.logger=(log)
|
|
267
|
+
@@TEST_LOGGER = log
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def self.logger
|
|
271
|
+
@@TEST_LOGGER
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
spy_logger = double("logger")
|
|
276
|
+
expect(spy_logger).to receive(:info).once.with(/ECS compatibility is enabled but no .*?target.*? was specified/)
|
|
277
|
+
LoggableLookup.logger = spy_logger
|
|
278
|
+
|
|
279
|
+
LoggableLookup.new(lookup_hash, {:ecs_compatibility => 'v1'}, "lookup-1")
|
|
280
|
+
end
|
|
281
|
+
end
|
|
251
282
|
end
|
|
252
283
|
end end end
|
|
253
284
|
|
data/spec/inputs/jdbc_spec.rb
CHANGED
|
@@ -328,6 +328,48 @@ describe LogStash::Inputs::Jdbc do
|
|
|
328
328
|
|
|
329
329
|
end
|
|
330
330
|
|
|
331
|
+
context "when using target option" do
|
|
332
|
+
let(:settings) do
|
|
333
|
+
{
|
|
334
|
+
"statement" => "SELECT * from test_table FETCH FIRST 1 ROWS ONLY",
|
|
335
|
+
"target" => "sub_field"
|
|
336
|
+
}
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
before do
|
|
340
|
+
plugin.register
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
after do
|
|
344
|
+
plugin.stop
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it "should put all columns under sub-field" do
|
|
348
|
+
db[:test_table].insert(:num => 1, :custom_time => Time.now.utc, :created_at => Time.now.utc, :string => "Test target option")
|
|
349
|
+
|
|
350
|
+
plugin.run(queue)
|
|
351
|
+
|
|
352
|
+
expect(queue.size).to eq(1)
|
|
353
|
+
event = queue.pop
|
|
354
|
+
expect(event.get("[sub_field][string]")).to eq("Test target option")
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
context "when using target option is not set and ecs_compatibility is enabled" do
|
|
359
|
+
let(:settings) do
|
|
360
|
+
{
|
|
361
|
+
"statement" => "SELECT * from test_table FETCH FIRST 1 ROWS ONLY",
|
|
362
|
+
"ecs_compatibility" => :v1
|
|
363
|
+
}
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it "should log a warn of missed target usage" do
|
|
367
|
+
expect(plugin.logger).to receive(:info).once.with(/ECS compatibility is enabled but no .*?target.*? was specified/)
|
|
368
|
+
|
|
369
|
+
plugin.register
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
331
373
|
context "when fetching time data" do
|
|
332
374
|
|
|
333
375
|
let(:settings) do
|
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.0
|
|
4
|
+
version: 5.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Elastic
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-05-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -142,6 +142,34 @@ dependencies:
|
|
|
142
142
|
- - "<"
|
|
143
143
|
- !ruby/object:Gem::Version
|
|
144
144
|
version: '3.5'
|
|
145
|
+
- !ruby/object:Gem::Dependency
|
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - "~>"
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: '1.2'
|
|
151
|
+
name: logstash-mixin-ecs_compatibility_support
|
|
152
|
+
prerelease: false
|
|
153
|
+
type: :runtime
|
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - "~>"
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: '1.2'
|
|
159
|
+
- !ruby/object:Gem::Dependency
|
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - "~>"
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '1.0'
|
|
165
|
+
name: logstash-mixin-validator_support
|
|
166
|
+
prerelease: false
|
|
167
|
+
type: :runtime
|
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
+
requirements:
|
|
170
|
+
- - "~>"
|
|
171
|
+
- !ruby/object:Gem::Version
|
|
172
|
+
version: '1.0'
|
|
145
173
|
- !ruby/object:Gem::Dependency
|
|
146
174
|
requirement: !ruby/object:Gem::Requirement
|
|
147
175
|
requirements:
|