logstash-filter-elasticsearch 4.1.0 → 4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce70bb1953a72a5ce4d0af40226a69cbc1f3b117c797b978cf5d8fec197ddd8e
4
- data.tar.gz: b0ad6ba97293de4e617eb40d753ac23067446aa0e6f079472f6add2aa0e159ad
3
+ metadata.gz: 1e52f705a48101e5fa0848fd410b13ce60f4d56912539905824c302b684d8bab
4
+ data.tar.gz: de8e58fa7515cd3096250b770739c5de74a421172452c259b2bcc9c34c62b8e0
5
5
  SHA512:
6
- metadata.gz: 13675886f681a5cfafda041f7f02f26bf1c1713cf257b9e4021db03207dd021ec248e72c44b12ed130216d8f4203cc713cb0e7c089b8f00efa2428d22f2f0845
7
- data.tar.gz: 370907463f7ba33797a2f8f7d3069314328170c61392ad65e0b09eb6f57eeca9bc3468f3901b08c85f06abffb585e234a839b66e1d44dc541914489d6861cda4
6
+ metadata.gz: 0becf0596e1f620b90170d0a36006f5664f62453ab37a8be30d8da487ce777479fab3664890ce130da33a370c115a274721a4ea9edd6e6096f400941c50d750f
7
+ data.tar.gz: 5e0a0d77375a2f181d07af70cdcefacc22534043e323cf97d1f0c291853f4b02d79fba7873d51d40a4e4b256494fac1df7149684e962849cc557f472cf6e7f3c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 4.2.0
2
+ - Add `target` configuration option to store the result into it [#196](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/196)
3
+
4
+ ## 4.1.1
5
+ - Add elastic-transport client support used in elasticsearch-ruby 8.x [#191](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/191)
6
+
1
7
  ## 4.1.0
2
8
  - Added support for custom headers [#188](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/188)
3
9
 
data/docs/index.asciidoc CHANGED
@@ -162,6 +162,7 @@ NOTE: As of version `4.0.0` of this plugin, a number of previously deprecated se
162
162
  | <<plugins-{type}s-{plugin}-ssl_truststore_type>> |<<string,string>>|No
163
163
  | <<plugins-{type}s-{plugin}-ssl_verification_mode>> |<<string,string>>, one of `["full", "none"]`|No
164
164
  | <<plugins-{type}s-{plugin}-tag_on_failure>> |<<array,array>>|No
165
+ | <<plugins-{type}s-{plugin}-target>> |<<string,string>>|No
165
166
  | <<plugins-{type}s-{plugin}-user>> |<<string,string>>|No
166
167
  |=======================================================================
167
168
 
@@ -175,8 +176,11 @@ filter plugins.
175
176
 
176
177
  * Value type is <<hash,hash>>
177
178
  * Default value is `{}`
179
+ * Format: `"aggregation_name" => "[path][on][event]"`:
180
+ ** `aggregation_name`: aggregation name in result from {es}
181
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
178
182
 
179
- Hash of aggregation names to copy from elasticsearch response into Logstash event fields
183
+ A mapping of aggregations to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
180
184
 
181
185
  Example:
182
186
  [source,ruby]
@@ -246,8 +250,11 @@ These custom headers will override any headers previously set by the plugin such
246
250
 
247
251
  * Value type is <<hash,hash>>
248
252
  * Default value is `{}`
253
+ * Format: `"path.in.source" => "[path][on][event]"`:
254
+ ** `path.in.source`: field path in document source of result from {es}, using dot-notation
255
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
249
256
 
250
- Hash of docinfo fields to copy from old event (found via elasticsearch) into new event
257
+ A mapping of docinfo (`_source`) fields to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
251
258
 
252
259
  Example:
253
260
  [source,ruby]
@@ -273,9 +280,11 @@ Whether results should be sorted or not
273
280
 
274
281
  * Value type is <<array,array>>
275
282
  * Default value is `{}`
283
+ * Format: `"path.in.result" => "[path][on][event]"`:
284
+ ** `path.in.result`: field path in indexed result from {es}, using dot-notation
285
+ ** `[path][on][event]`: path for where to place the value on the current event, using field-reference notation
276
286
 
277
- An array of fields to copy from the old event (found via elasticsearch) into the
278
- new event, currently being processed.
287
+ A mapping of indexed fields to copy into the <<plugins-{type}s-{plugin}-target>> of the current event.
279
288
 
280
289
  In the following example, the values of `@timestamp` and `event_id` on the event
281
290
  found via elasticsearch are copied to the current event's
@@ -523,6 +532,43 @@ WARNING: Setting certificate verification to `none` disables many security benef
523
532
 
524
533
  Tags the event on failure to look up previous log event information. This can be used in later analysis.
525
534
 
535
+ [id="plugins-{type}s-{plugin}-target"]
536
+ ===== `target`
537
+
538
+ * Value type is <<string,string>>
539
+ * There is no default value for this setting.
540
+
541
+ Define the target field for placing the result data.
542
+ If this setting is omitted, the target will be the root (top level) of the event.
543
+
544
+ 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.
545
+
546
+ For example, if you want the data to be put in the `operation` field:
547
+ [source,ruby]
548
+ if [type] == "end" {
549
+ filter {
550
+ query => "type:start AND transaction:%{[transactionId]}"
551
+ elasticsearch {
552
+ target => "transaction"
553
+ fields => {
554
+ "@timestamp" => "started"
555
+ "transaction_id" => "id"
556
+ }
557
+ }
558
+ }
559
+ }
560
+
561
+ `fields` fields will be expanded into a data structure in the `target` field, overall shape looks like this:
562
+ [source,ruby]
563
+ {
564
+ "transaction" => {
565
+ "started" => "2025-04-29T12:01:46.263Z"
566
+ "id" => "1234567890"
567
+ }
568
+ }
569
+
570
+ NOTE: when writing to a field that already exists on the event, the previous value will be overwritten.
571
+
526
572
  [id="plugins-{type}s-{plugin}-user"]
527
573
  ===== `user`
528
574
 
@@ -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,13 +2,19 @@
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'
8
+ require 'logstash/plugin_mixins/validator_support/field_reference_validation_adapter'
6
9
  require "monitor"
7
10
 
8
11
  require_relative "elasticsearch/client"
9
- require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
10
12
 
11
13
  class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
14
+
15
+ include LogStash::PluginMixins::ECSCompatibilitySupport
16
+ include LogStash::PluginMixins::ECSCompatibilitySupport::TargetCheck
17
+
12
18
  config_name "elasticsearch"
13
19
 
14
20
  # List of elasticsearch hosts to use for querying.
@@ -119,6 +125,9 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
119
125
  # Tags the event on failure to look up geo information. This can be used in later analysis.
120
126
  config :tag_on_failure, :validate => :array, :default => ["_elasticsearch_lookup_failure"]
121
127
 
128
+ # If set, the the result set will be nested under the target field
129
+ config :target, :validate => :field_reference
130
+
122
131
  # How many times to retry on failure?
123
132
  config :retry_on_failure, :validate => :number, :default => 0
124
133
 
@@ -174,6 +183,9 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
174
183
 
175
184
  test_connection!
176
185
  setup_serverless
186
+ if get_client.es_transport_client_type == "elasticsearch_transport"
187
+ require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
188
+ end
177
189
  end # def register
178
190
 
179
191
  def filter(event)
@@ -203,17 +215,19 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
203
215
  matched = true
204
216
  @fields.each do |old_key, new_key|
205
217
  old_key_path = extract_path(old_key)
206
- set = resultsHits.map do |doc|
218
+ extracted_hit_values = resultsHits.map do |doc|
207
219
  extract_value(doc["_source"], old_key_path)
208
220
  end
209
- event.set(new_key, set.count > 1 ? set : set.first)
221
+ value_to_set = extracted_hit_values.count > 1 ? extracted_hit_values : extracted_hit_values.first
222
+ set_to_event_target(event, new_key, value_to_set)
210
223
  end
211
224
  @docinfo_fields.each do |old_key, new_key|
212
225
  old_key_path = extract_path(old_key)
213
- set = resultsHits.map do |doc|
226
+ extracted_docs_info = resultsHits.map do |doc|
214
227
  extract_value(doc, old_key_path)
215
228
  end
216
- event.set(new_key, set.count > 1 ? set : set.first)
229
+ value_to_set = extracted_docs_info.count > 1 ? extracted_docs_info : extracted_docs_info.first
230
+ set_to_event_target(event, new_key, value_to_set)
217
231
  end
218
232
  end
219
233
 
@@ -221,7 +235,7 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
221
235
  if !resultsAggs.nil? && !resultsAggs.empty?
222
236
  matched = true
223
237
  @aggregation_fields.each do |agg_name, ls_field|
224
- event.set(ls_field, resultsAggs[agg_name])
238
+ set_to_event_target(event, ls_field, resultsAggs[agg_name])
225
239
  end
226
240
  end
227
241
 
@@ -254,6 +268,18 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
254
268
 
255
269
  private
256
270
 
271
+ # if @target is defined, creates a nested structure to inject result into target field
272
+ # if not defined, directly sets to the top-level event field
273
+ # @param event [LogStash::Event]
274
+ # @param new_key [String] name of the field to set
275
+ # @param value_to_set [Array] values to set
276
+ # @return [void]
277
+ def set_to_event_target(event, new_key, value_to_set)
278
+ key_to_set = target ? "[#{target}][#{new_key}]" : new_key
279
+
280
+ event.set(key_to_set, value_to_set)
281
+ end
282
+
257
283
  def client_options
258
284
  @client_options ||= {
259
285
  :user => @user,
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-elasticsearch'
4
- s.version = '4.1.0'
4
+ s.version = '4.2.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"
8
8
  s.authors = ["Elastic"]
9
9
  s.email = 'info@elastic.co'
10
- s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
10
+ s.homepage = "https://elastic.co/logstash"
11
11
  s.require_paths = ["lib"]
12
12
 
13
13
  # Files
@@ -21,9 +21,11 @@ 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'
28
+ s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
27
29
  s.add_development_dependency 'cabin', ['~> 0.6']
28
30
  s.add_development_dependency 'webrick'
29
31
  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: 4.1.0
4
+ version: 4.2.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-23 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:
@@ -72,6 +92,20 @@ dependencies:
72
92
  - - "~>"
73
93
  - !ruby/object:Gem::Version
74
94
  version: '1.0'
95
+ - !ruby/object:Gem::Dependency
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.0'
101
+ name: logstash-mixin-validator_support
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.0'
75
109
  - !ruby/object:Gem::Dependency
76
110
  requirement: !ruby/object:Gem::Requirement
77
111
  requirements:
@@ -160,7 +194,7 @@ files:
160
194
  - spec/filters/fixtures/test_certs/ls.der.sha256
161
195
  - spec/filters/fixtures/test_certs/ls.key
162
196
  - spec/filters/integration/elasticsearch_spec.rb
163
- homepage: http://www.elastic.co/guide/en/logstash/current/index.html
197
+ homepage: https://elastic.co/logstash
164
198
  licenses:
165
199
  - Apache License (2.0)
166
200
  metadata: