logstash-filter-elasticsearch 3.17.0 → 3.18.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aaf8d73f069f6550d53c38b1a27f5444f77b774bbe62d66b7b7dd276be4125fc
4
- data.tar.gz: 19b2d5030a25fd03c78baf5edb6b18a649cc0751fa02f38fdfd8a9959669b9bc
3
+ metadata.gz: f93bd5f45ce46abe35c9fb54f03ce2f2241a6a7e5c530671a2954324f7965b18
4
+ data.tar.gz: 3bd3ae0babbeb6e46a1e6001888aa85c8fc47d7fb5c794a0063ad7688f3d3bd0
5
5
  SHA512:
6
- metadata.gz: f3792d01a260e9dcada0ddc7df7aaebbfc1280025781f4c8f2640eaba3abd0d777982f31b794cd7e37b1ce9430bd1f2a60d73dc05ddb8fc0eedd778d9574f1c6
7
- data.tar.gz: 0743bccc0a8da98dd91d697ab1b05e95fae2853fd24e8d6db6887ec7ad636de2ae970ff65e15d491388402c702d71adc2190b987a30e5ee2f30a39daf5014954
6
+ metadata.gz: a59b18ddbb4706e50c94c7af206886b430063370376adee33b5795635d813142e662d55830b8401cd17b2e4ecfc69bace939f2ffd16daf2ecedfc4e1f16e5717
7
+ data.tar.gz: eb3c6a279badcc7b9fdaea8831cfeff276cde141773d28f9ead912606c816f30320e706efd34799060349bb09df09c8a4e5f05bf5f6ed2ccb9b0d5b19207eaff
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 3.18.0
2
+ - Add `target` configuration option to store the result into it [#197](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/197)
3
+
4
+ ## 3.17.1
5
+ - Add elastic-transport client support used in elasticsearch-ruby 8.x [#193](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/193)
6
+
1
7
  ## 3.17.0
2
8
  - Added support for custom headers [#190](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/190)
3
9
 
data/docs/index.asciidoc CHANGED
@@ -160,6 +160,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
160
160
  | <<plugins-{type}s-{plugin}-ssl_truststore_type>> |<<string,string>>|No
161
161
  | <<plugins-{type}s-{plugin}-ssl_verification_mode>> |<<string,string>>, one of `["full", "none"]`|No
162
162
  | <<plugins-{type}s-{plugin}-tag_on_failure>> |<<array,array>>|No
163
+ | <<plugins-{type}s-{plugin}-target>> |<<string,string>>|No
163
164
  | <<plugins-{type}s-{plugin}-user>> |<<string,string>>|No
164
165
  |=======================================================================
165
166
 
@@ -173,8 +174,11 @@ filter plugins.
173
174
 
174
175
  * Value type is <<hash,hash>>
175
176
  * Default value is `{}`
177
+ * Format: `"aggregation_name" => "[path][on][event]"`:
178
+ ** `aggregation_name`: aggregation name in result from {es}
179
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
176
180
 
177
- Hash of aggregation names to copy from elasticsearch response into Logstash event fields
181
+ A mapping of aggregations to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
178
182
 
179
183
  Example:
180
184
  [source,ruby]
@@ -244,8 +248,11 @@ These custom headers will override any headers previously set by the plugin such
244
248
 
245
249
  * Value type is <<hash,hash>>
246
250
  * Default value is `{}`
251
+ * Format: `"path.in.source" => "[path][on][event]"`:
252
+ ** `path.in.source`: field path in document source of result from {es}, using dot-notation
253
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
247
254
 
248
- Hash of docinfo fields to copy from old event (found via elasticsearch) into new event
255
+ A mapping of docinfo (`_source`) fields to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
249
256
 
250
257
  Example:
251
258
  [source,ruby]
@@ -271,9 +278,11 @@ Whether results should be sorted or not
271
278
 
272
279
  * Value type is <<array,array>>
273
280
  * Default value is `{}`
281
+ * Format: `"path.in.result" => "[path][on][event]"`:
282
+ ** `path.in.result`: field path in indexed result from {es}, using dot-notation
283
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
274
284
 
275
- An array of fields to copy from the old event (found via elasticsearch) into the
276
- new event, currently being processed.
285
+ A mapping of indexed fields to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
277
286
 
278
287
  In the following example, the values of `@timestamp` and `event_id` on the event
279
288
  found via elasticsearch are copied to the current event's
@@ -521,6 +530,43 @@ WARNING: Setting certificate verification to `none` disables many security benef
521
530
 
522
531
  Tags the event on failure to look up previous log event information. This can be used in later analysis.
523
532
 
533
+ [id="plugins-{type}s-{plugin}-target"]
534
+ ===== `target`
535
+
536
+ * Value type is <<string,string>>
537
+ * There is no default value for this setting.
538
+
539
+ Define the target field for placing the result data.
540
+ If this setting is omitted, the target will be the root (top level) of the event.
541
+
542
+ The destination fields specified in <<plugins-{type}s-{plugin}-fields>>, <<plugins-{type}s-{plugin}-aggregation_fields>>, and <<plugins-{type}s-{plugin}-docinfo_fields>> are relative to this target.
543
+
544
+ For example, if you want the data to be put in the `operation` field:
545
+ [source,ruby]
546
+ if [type] == "end" {
547
+ filter {
548
+ query => "type:start AND transaction:%{[transactionId]}"
549
+ elasticsearch {
550
+ target => "transaction"
551
+ fields => {
552
+ "@timestamp" => "started"
553
+ "transaction_id" => "id"
554
+ }
555
+ }
556
+ }
557
+ }
558
+
559
+ `fields` fields will be expanded into a data structure in the `target` field, overall shape looks like this:
560
+ [source,ruby]
561
+ {
562
+ "transaction" => {
563
+ "started" => "2025-04-29T12:01:46.263Z"
564
+ "id" => "1234567890"
565
+ }
566
+ }
567
+
568
+ NOTE: when writing to a field that already exists on the event, the previous value will be overwritten.
569
+
524
570
  [id="plugins-{type}s-{plugin}-user"]
525
571
  ===== `user`
526
572
 
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
  require "elasticsearch"
3
3
  require "base64"
4
- require "elasticsearch/transport/transport/http/manticore"
5
4
 
6
5
 
7
6
  module LogStash
@@ -9,6 +8,7 @@ module LogStash
9
8
  class ElasticsearchClient
10
9
 
11
10
  attr_reader :client
11
+ attr_reader :es_transport_client_type
12
12
 
13
13
  BUILD_FLAVOR_SERVERLESS = 'serverless'.freeze
14
14
  DEFAULT_EAV_HEADER = { "Elastic-Api-Version" => "2023-10-31" }.freeze
@@ -44,7 +44,7 @@ module LogStash
44
44
 
45
45
  client_options = {
46
46
  hosts: hosts,
47
- transport_class: ::Elasticsearch::Transport::Transport::HTTP::Manticore,
47
+ transport_class: get_transport_client_class,
48
48
  transport_options: transport_options,
49
49
  ssl: ssl_options,
50
50
  retry_on_failure: options[:retry_on_failure],
@@ -98,6 +98,20 @@ module LogStash
98
98
  token = ::Base64.strict_encode64(api_key.value)
99
99
  { 'Authorization' => "ApiKey #{token}" }
100
100
  end
101
+
102
+ def get_transport_client_class
103
+ # LS-core includes `elasticsearch` gem. The gem is composed of two separate gems: `elasticsearch-api` and `elasticsearch-transport`
104
+ # And now `elasticsearch-transport` is old, instead we have `elastic-transport`.
105
+ # LS-core updated `elasticsearch` > 8: https://github.com/elastic/logstash/pull/17161
106
+ # Following source bits are for the compatibility to support both `elasticsearch-transport` and `elastic-transport` gems
107
+ require "elasticsearch/transport/transport/http/manticore"
108
+ es_transport_client_type = "elasticsearch_transport"
109
+ ::Elasticsearch::Transport::Transport::HTTP::Manticore
110
+ rescue ::LoadError
111
+ require "elastic/transport/transport/http/manticore"
112
+ es_transport_client_type = "elastic_transport"
113
+ ::Elastic::Transport::Transport::HTTP::Manticore
114
+ end
101
115
  end
102
116
  end
103
117
  end
@@ -2,14 +2,20 @@
2
2
  require "logstash/filters/base"
3
3
  require "logstash/namespace"
4
4
  require "logstash/json"
5
+ require 'logstash/plugin_mixins/ecs_compatibility_support'
6
+ require 'logstash/plugin_mixins/ecs_compatibility_support/target_check'
5
7
  require 'logstash/plugin_mixins/ca_trusted_fingerprint_support'
6
8
  require "logstash/plugin_mixins/normalize_config_support"
9
+ require 'logstash/plugin_mixins/validator_support/field_reference_validation_adapter'
7
10
  require "monitor"
8
11
 
9
12
  require_relative "elasticsearch/client"
10
- require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
11
13
 
12
14
  class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
15
+
16
+ include LogStash::PluginMixins::ECSCompatibilitySupport
17
+ include LogStash::PluginMixins::ECSCompatibilitySupport::TargetCheck
18
+
13
19
  config_name "elasticsearch"
14
20
 
15
21
  # List of elasticsearch hosts to use for querying.
@@ -132,6 +138,9 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
132
138
  # Tags the event on failure to look up geo information. This can be used in later analysis.
133
139
  config :tag_on_failure, :validate => :array, :default => ["_elasticsearch_lookup_failure"]
134
140
 
141
+ # If set, the the result set will be nested under the target field
142
+ config :target, :validate => :field_reference
143
+
135
144
  # How many times to retry on failure?
136
145
  config :retry_on_failure, :validate => :number, :default => 0
137
146
 
@@ -183,6 +192,9 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
183
192
 
184
193
  test_connection!
185
194
  setup_serverless
195
+ if get_client.es_transport_client_type == "elasticsearch_transport"
196
+ require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
197
+ end
186
198
  end # def register
187
199
 
188
200
  def filter(event)
@@ -212,17 +224,19 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
212
224
  matched = true
213
225
  @fields.each do |old_key, new_key|
214
226
  old_key_path = extract_path(old_key)
215
- set = resultsHits.map do |doc|
227
+ extracted_hit_values = resultsHits.map do |doc|
216
228
  extract_value(doc["_source"], old_key_path)
217
229
  end
218
- event.set(new_key, set.count > 1 ? set : set.first)
230
+ value_to_set = extracted_hit_values.count > 1 ? extracted_hit_values : extracted_hit_values.first
231
+ set_to_event_target(event, new_key, value_to_set)
219
232
  end
220
233
  @docinfo_fields.each do |old_key, new_key|
221
234
  old_key_path = extract_path(old_key)
222
- set = resultsHits.map do |doc|
235
+ extracted_docs_info = resultsHits.map do |doc|
223
236
  extract_value(doc, old_key_path)
224
237
  end
225
- event.set(new_key, set.count > 1 ? set : set.first)
238
+ value_to_set = extracted_docs_info.count > 1 ? extracted_docs_info : extracted_docs_info.first
239
+ set_to_event_target(event, new_key, value_to_set)
226
240
  end
227
241
  end
228
242
 
@@ -230,7 +244,7 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
230
244
  if !resultsAggs.nil? && !resultsAggs.empty?
231
245
  matched = true
232
246
  @aggregation_fields.each do |agg_name, ls_field|
233
- event.set(ls_field, resultsAggs[agg_name])
247
+ set_to_event_target(event, ls_field, resultsAggs[agg_name])
234
248
  end
235
249
  end
236
250
 
@@ -263,6 +277,18 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
263
277
 
264
278
  private
265
279
 
280
+ # if @target is defined, creates a nested structure to inject result into target field
281
+ # if not defined, directly sets to the top-level event field
282
+ # @param event [LogStash::Event]
283
+ # @param new_key [String] name of the field to set
284
+ # @param value_to_set [Array] values to set
285
+ # @return [void]
286
+ def set_to_event_target(event, new_key, value_to_set)
287
+ key_to_set = target ? "[#{target}][#{new_key}]" : new_key
288
+
289
+ event.set(key_to_set, value_to_set)
290
+ end
291
+
266
292
  def client_options
267
293
  @client_options ||= {
268
294
  :user => @user,
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-elasticsearch'
4
- s.version = '3.17.0'
4
+ s.version = '3.18.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Copies fields from previous log events in Elasticsearch to current events "
7
7
  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"
@@ -21,10 +21,12 @@ Gem::Specification.new do |s|
21
21
 
22
22
  # Gem dependencies
23
23
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
24
- s.add_runtime_dependency 'elasticsearch', ">= 7.14.9" # LS >= 6.7 and < 7.14 all used version 5.0.5
24
+ s.add_runtime_dependency 'elasticsearch', ">= 7.14.9", '< 9'
25
25
  s.add_runtime_dependency 'manticore', ">= 0.7.1"
26
+ s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~> 1.3'
26
27
  s.add_runtime_dependency 'logstash-mixin-ca_trusted_fingerprint_support', '~> 1.0'
27
28
  s.add_runtime_dependency 'logstash-mixin-normalize_config_support', '~>1.0'
29
+ s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
28
30
  s.add_development_dependency 'cabin', ['~> 0.6']
29
31
  s.add_development_dependency 'webrick'
30
32
  s.add_development_dependency 'logstash-devutils'
@@ -60,9 +60,18 @@ describe LogStash::Filters::Elasticsearch do
60
60
  allow(plugin).to receive(:get_client).and_return(filter_client)
61
61
  allow(filter_client).to receive(:serverless?).and_return(true)
62
62
  allow(filter_client).to receive(:client).and_return(es_client)
63
- allow(es_client).to receive(:info).with(a_hash_including(:headers => LogStash::Filters::ElasticsearchClient::DEFAULT_EAV_HEADER)).and_raise(
64
- Elasticsearch::Transport::Transport::Errors::BadRequest.new
65
- )
63
+
64
+ if elastic_ruby_v8_client_available?
65
+ allow(es_client).to receive(:info)
66
+ .with(a_hash_including(
67
+ :headers => LogStash::Filters::ElasticsearchClient::DEFAULT_EAV_HEADER))
68
+ .and_raise(Elastic::Transport::Transport::Errors::BadRequest.new)
69
+ else
70
+ allow(es_client).to receive(:info)
71
+ .with(a_hash_including(
72
+ :headers => LogStash::Filters::ElasticsearchClient::DEFAULT_EAV_HEADER))
73
+ .and_raise(Elasticsearch::Transport::Transport::Errors::BadRequest.new)
74
+ end
66
75
  end
67
76
 
68
77
  it "raises an exception when Elastic Api Version is not supported" do
@@ -103,6 +112,11 @@ describe LogStash::Filters::Elasticsearch do
103
112
 
104
113
  before(:each) do
105
114
  allow(LogStash::Filters::ElasticsearchClient).to receive(:new).and_return(client)
115
+ if elastic_ruby_v8_client_available?
116
+ allow(client).to receive(:es_transport_client_type).and_return('elastic_transport')
117
+ else
118
+ allow(client).to receive(:es_transport_client_type).and_return('elasticsearch_transport')
119
+ end
106
120
  allow(client).to receive(:search).and_return(response)
107
121
  allow(plugin).to receive(:test_connection!)
108
122
  allow(plugin).to receive(:setup_serverless)
@@ -347,6 +361,11 @@ describe LogStash::Filters::Elasticsearch do
347
361
 
348
362
  before do
349
363
  allow(plugin).to receive(:get_client).and_return(client_double)
364
+ if elastic_ruby_v8_client_available?
365
+ allow(client_double).to receive(:es_transport_client_type).and_return('elastic_transport')
366
+ else
367
+ allow(client_double).to receive(:es_transport_client_type).and_return('elasticsearch_transport')
368
+ end
350
369
  allow(client_double).to receive(:client).and_return(transport_double)
351
370
  end
352
371
 
@@ -506,7 +525,12 @@ describe LogStash::Filters::Elasticsearch do
506
525
  # this spec is a safeguard to trigger an assessment of thread-safety should
507
526
  # we choose a different transport adapter in the future.
508
527
  transport_class = extract_transport(client).options.fetch(:transport_class)
509
- expect(transport_class).to equal ::Elasticsearch::Transport::Transport::HTTP::Manticore
528
+ if elastic_ruby_v8_client_available?
529
+ allow(client).to receive(:es_transport_client_type).and_return("elastic_transport")
530
+ expect(transport_class).to equal ::Elastic::Transport::Transport::HTTP::Manticore
531
+ else
532
+ expect(transport_class).to equal ::Elasticsearch::Transport::Transport::HTTP::Manticore
533
+ end
510
534
  end
511
535
 
512
536
  it 'uses a client with sufficient connection pool size' do
@@ -821,6 +845,11 @@ describe LogStash::Filters::Elasticsearch do
821
845
 
822
846
  before(:each) do
823
847
  allow(LogStash::Filters::ElasticsearchClient).to receive(:new).and_return(client)
848
+ if elastic_ruby_v8_client_available?
849
+ allow(client).to receive(:es_transport_client_type).and_return('elastic_transport')
850
+ else
851
+ allow(client).to receive(:es_transport_client_type).and_return('elasticsearch_transport')
852
+ end
824
853
  allow(plugin).to receive(:test_connection!)
825
854
  allow(plugin).to receive(:setup_serverless)
826
855
  plugin.register
@@ -835,11 +864,46 @@ describe LogStash::Filters::Elasticsearch do
835
864
  end
836
865
  end
837
866
 
838
- # @note can be removed once gem depends on elasticsearch >= 6.x
839
- def extract_transport(client) # on 7.x client.transport is a ES::Transport::Client
867
+ describe "#set_to_event_target" do
868
+
869
+ context "when `@target` is nil, default behavior" do
870
+ let(:config) {{ }}
871
+
872
+ it "sets the value directly to the top-level event field" do
873
+ plugin.send(:set_to_event_target, event, "new_field", %w[value1 value2])
874
+ expect(event.get("new_field")).to eq(%w[value1 value2])
875
+ end
876
+ end
877
+
878
+ context "when @target is defined" do
879
+ let(:config) {{ "target" => "nested" }}
880
+
881
+ it "creates a nested structure under the target field" do
882
+ plugin.send(:set_to_event_target, event, "new_field", %w[value1 value2])
883
+ expect(event.get("nested")).to eq({ "new_field" => %w[value1 value2] })
884
+ end
885
+
886
+ it "overwrites existing target field with new data" do
887
+ event.set("nested", { "existing_field" => "existing_value", "new_field" => "value0" })
888
+ plugin.send(:set_to_event_target, event, "new_field", ["value1"])
889
+ expect(event.get("nested")).to eq({ "existing_field" => "existing_value", "new_field" => ["value1"] })
890
+ end
891
+ end
892
+ end
893
+
894
+ def extract_transport(client)
895
+ # on 7x: client.transport.transport
896
+ # on >=8.x: client.transport
840
897
  client.transport.respond_to?(:transport) ? client.transport.transport : client.transport
841
898
  end
842
899
 
900
+ def elastic_ruby_v8_client_available?
901
+ Elasticsearch::Transport
902
+ false
903
+ rescue NameError # NameError: uninitialized constant Elasticsearch::Transport if Elastic Ruby client is not available
904
+ true
905
+ end
906
+
843
907
  class MockResponse
844
908
  attr_reader :code, :headers
845
909
 
@@ -84,7 +84,9 @@ describe LogStash::Filters::Elasticsearch, :integration => true do
84
84
  end
85
85
 
86
86
  it "fails to register plugin" do
87
- expect { plugin.register }.to raise_error Elasticsearch::Transport::Transport::Errors::Unauthorized
87
+ expect { plugin.register }.to raise_error elastic_ruby_v8_client_available? ?
88
+ Elastic::Transport::Transport::Errors::Unauthorized :
89
+ Elasticsearch::Transport::Transport::Errors::Unauthorized
88
90
  end
89
91
 
90
92
  end if ELASTIC_SECURITY_ENABLED
@@ -150,5 +152,10 @@ describe LogStash::Filters::Elasticsearch, :integration => true do
150
152
  end
151
153
  end
152
154
  end
153
-
155
+ def elastic_ruby_v8_client_available?
156
+ Elasticsearch::Transport
157
+ false
158
+ rescue NameError # NameError: uninitialized constant Elasticsearch::Transport if Elastic Ruby client is not available
159
+ true
160
+ end
154
161
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.17.0
4
+ version: 3.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-29 00:00:00.000000000 Z
11
+ date: 2025-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -36,6 +36,9 @@ dependencies:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
38
  version: 7.14.9
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '9'
39
42
  name: elasticsearch
40
43
  type: :runtime
41
44
  prerelease: false
@@ -44,6 +47,9 @@ dependencies:
44
47
  - - ">="
45
48
  - !ruby/object:Gem::Version
46
49
  version: 7.14.9
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '9'
47
53
  - !ruby/object:Gem::Dependency
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
@@ -58,6 +64,20 @@ dependencies:
58
64
  - - ">="
59
65
  - !ruby/object:Gem::Version
60
66
  version: 0.7.1
67
+ - !ruby/object:Gem::Dependency
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '1.3'
73
+ name: logstash-mixin-ecs_compatibility_support
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.3'
61
81
  - !ruby/object:Gem::Dependency
62
82
  requirement: !ruby/object:Gem::Requirement
63
83
  requirements:
@@ -86,6 +106,20 @@ dependencies:
86
106
  - - "~>"
87
107
  - !ruby/object:Gem::Version
88
108
  version: '1.0'
109
+ - !ruby/object:Gem::Dependency
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '1.0'
115
+ name: logstash-mixin-validator_support
116
+ type: :runtime
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.0'
89
123
  - !ruby/object:Gem::Dependency
90
124
  requirement: !ruby/object:Gem::Requirement
91
125
  requirements: