logstash-output-elasticsearch 11.9.0-java → 11.9.1-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad30f3f3af7faaebf3409ac23375e99531def7d30940330f0f617e007f341b1d
4
- data.tar.gz: d06a9954211995b266d08cfbc6586164275d5d269ef5716ba18d4f7e3ca4cf5c
3
+ metadata.gz: 4dbc44fb5e78b53368adb97d43b613c4a3c843e1a1308aa6d008cb105ee4301c
4
+ data.tar.gz: 9ed115a974e20bda89d63d6b2bf37dc5c7c42f8f40b46badbad072db0a698683
5
5
  SHA512:
6
- metadata.gz: ad84072b2dcc3d3a567b18cc89bbd3390e93303e952188053a8f61cbefbddb0a8bf46453fb8df0b94cecaf29304452b85fbe7a822bb9ece0763c4278b514ff91
7
- data.tar.gz: 348d53c674b7b2730ce918403e705ddbda5f9745ca2564e922d3762bff9de7a455ff871c269669dc1e74d5e0c5f89c7997221eca4c851a073b1540b2a8bbdc15
6
+ metadata.gz: 9df0d61b80c78cd992b46428b24836db44094d636384940e976a0a09a58245bec59def6031d8426a24d41bdb0644ac49d4e8b558ef32c684554fbf03104a148c
7
+ data.tar.gz: 8c63cfaa83e3acad5d864dbf2d170fcf0e9111f31e8053fc2ce2a8a4d8af696355fda7b3e7152dc0764bce8e36c3afdd432c5a344f97a2b9b4b6c6c17e6a52d9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 11.9.1
2
+ - Fixes a possible infinite-retry-loop that could occur when this plugin is configured with an `action` whose value contains a [sprintf-style placeholder][] that fails to be resolved for an individual event. Events in this state will be routed to the pipeline's [dead letter queue][DLQ] if it is available, or will be logged-and-dropped so that the remaining events in the batch can be processed [#1080](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1080)
3
+
4
+ [sprintf-style placeholder]: https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html#sprintf
5
+ [DLQ]: https://www.elastic.co/guide/en/logstash/current/dead-letter-queues.html
6
+
1
7
  ## 11.9.0
2
8
  - Feature: force unresolved dynamic index names to be sent into DLQ. This feature could be explicitly disabled using `dlq_on_failed_indexname_interpolation` setting [#1084](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1084)
3
9
 
data/README.md CHANGED
@@ -19,7 +19,7 @@ Need help? Try #logstash on freenode IRC or the https://discuss.elastic.co/c/log
19
19
 
20
20
  ## Developing
21
21
 
22
- ### 1. Plugin Developement and Testing
22
+ ### 1. Plugin Development and Testing
23
23
 
24
24
  #### Code
25
25
  - To get started, you'll need JRuby with the Bundler gem installed.
data/docs/index.asciidoc CHANGED
@@ -395,7 +395,7 @@ The Elasticsearch action to perform. Valid actions are:
395
395
  document if not already present. See the `doc_as_upsert` option. NOTE: This does not work and is not supported
396
396
  in Elasticsearch 1.x. Please upgrade to ES 2.x or greater to use this feature with Logstash!
397
397
  - A sprintf style string to change the action based on the content of the event. The value `%{[foo]}`
398
- would use the foo field for the action
398
+ would use the foo field for the action. If resolved action is not in [`index`, `delete`, `create`, `update`], the event will not be sent to {es}, and instead either will be sent to the pipeline's <<dead-letter-queues,dead letter queue (DLQ)>> if it is enabled, or will be logged and dropped.
399
399
 
400
400
  For more details on actions, check out the {ref}/docs-bulk.html[Elasticsearch bulk API documentation].
401
401
 
@@ -120,6 +120,7 @@ module LogStash; module Outputs; class ElasticSearch;
120
120
  else
121
121
  stream_writer = body_stream
122
122
  end
123
+
123
124
  bulk_responses = []
124
125
  batch_actions = []
125
126
  bulk_actions.each_with_index do |action, index|
@@ -142,13 +143,16 @@ module LogStash; module Outputs; class ElasticSearch;
142
143
  stream_writer.write(as_json)
143
144
  batch_actions << action
144
145
  end
146
+
145
147
  stream_writer.close if http_compression
148
+
146
149
  logger.debug("Sending final bulk request for batch.",
147
150
  :action_count => batch_actions.size,
148
151
  :payload_size => stream_writer.pos,
149
152
  :content_length => body_stream.size,
150
153
  :batch_offset => (actions.size - batch_actions.size))
151
154
  bulk_responses << bulk_send(body_stream, batch_actions) if body_stream.size > 0
155
+
152
156
  body_stream.close if !http_compression
153
157
  join_bulk_responses(bulk_responses)
154
158
  end
@@ -367,36 +367,41 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
367
367
  wait_for_successful_connection if @after_successful_connection_done
368
368
  events_mapped = safe_interpolation_map_events(events)
369
369
  retrying_submit(events_mapped.successful_events)
370
- unless events_mapped.failed_events.empty?
371
- @logger.error("Can't map some events, needs to be handled by DLQ #{events_mapped.failed_events}")
372
- send_failed_resolutions_to_dlq(events_mapped.failed_events)
370
+ unless events_mapped.event_mapping_errors.empty?
371
+ handle_event_mapping_errors(events_mapped.event_mapping_errors)
373
372
  end
374
373
  end
375
374
 
376
- # @param: Arrays of EventActionTuple
375
+ # @param: Arrays of FailedEventMapping
377
376
  private
378
- def send_failed_resolutions_to_dlq(failed_action_tuples)
379
- failed_action_tuples.each do |action|
380
- handle_dlq_status(action, "warn", "Could not resolve dynamic index")
377
+ def handle_event_mapping_errors(event_mapping_errors)
378
+ # if DQL is enabled, log the events to provide issue insights to users.
379
+ if @dlq_writer
380
+ @logger.warn("Events could not be indexed and routing to DLQ, count: #{event_mapping_errors.size}")
381
381
  end
382
+
383
+ event_mapping_errors.each do |event_mapping_error|
384
+ detailed_message = "#{event_mapping_error.message}; event: `#{event_mapping_error.event.to_hash_with_metadata}`"
385
+ handle_dlq_status(event_mapping_error.event, :warn, detailed_message)
386
+ end
387
+ @document_level_metrics.increment(:non_retryable_failures, event_mapping_errors.size)
382
388
  end
383
389
 
384
- MapEventsResult = Struct.new(:successful_events, :failed_events)
390
+ MapEventsResult = Struct.new(:successful_events, :event_mapping_errors)
391
+ FailedEventMapping = Struct.new(:event, :message)
385
392
 
386
393
  private
387
394
  def safe_interpolation_map_events(events)
388
395
  successful_events = [] # list of LogStash::Outputs::ElasticSearch::EventActionTuple
389
- failed_events = [] # list of LogStash::Event
396
+ event_mapping_errors = [] # list of FailedEventMapping
390
397
  events.each do |event|
391
- begin
398
+ begin
392
399
  successful_events << @event_mapper.call(event)
393
- rescue IndexInterpolationError, e
394
- action = event.sprintf(@action || 'index')
395
- event_action_tuple = EventActionTuple.new(action, [], event)
396
- failed_events << event_action_tuple
400
+ rescue EventMappingError => ie
401
+ event_mapping_errors << FailedEventMapping.new(event, ie.message)
397
402
  end
398
403
  end
399
- MapEventsResult.new(successful_events, failed_events)
404
+ MapEventsResult.new(successful_events, event_mapping_errors)
400
405
  end
401
406
 
402
407
  public
@@ -449,6 +454,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
449
454
  end
450
455
 
451
456
  action = event.sprintf(@action || 'index')
457
+ raise UnsupportedActionError, action unless VALID_HTTP_ACTIONS.include?(action)
452
458
 
453
459
  if action == 'update'
454
460
  params[:_upsert] = LogStash::Json.load(event.sprintf(@upsert)) if @upsert != ""
@@ -476,13 +482,21 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
476
482
 
477
483
  end
478
484
 
479
- class IndexInterpolationError < ArgumentError
480
- attr_reader :bad_formatted_index
485
+ class EventMappingError < ArgumentError
486
+ def initialize(msg = nil)
487
+ super
488
+ end
489
+ end
481
490
 
491
+ class IndexInterpolationError < EventMappingError
482
492
  def initialize(bad_formatted_index)
483
493
  super("Badly formatted index, after interpolation still contains placeholder: [#{bad_formatted_index}]")
494
+ end
495
+ end
484
496
 
485
- @bad_formatted_index = bad_formatted_index
497
+ class UnsupportedActionError < EventMappingError
498
+ def initialize(bad_action)
499
+ super("Elasticsearch doesn't support [#{bad_action}] action")
486
500
  end
487
501
  end
488
502
 
@@ -214,13 +214,13 @@ module LogStash; module PluginMixins; module ElasticSearch
214
214
 
215
215
  log_level = dig_value(response, 'index', 'error', 'type') == 'invalid_index_name_exception' ? :error : :warn
216
216
 
217
- handle_dlq_status(action, log_level, detailed_message)
217
+ handle_dlq_status(action.event, log_level, detailed_message)
218
218
  end
219
219
 
220
- def handle_dlq_status(action, log_level, message)
220
+ def handle_dlq_status(event, log_level, message)
221
221
  # To support bwc, we check if DLQ exists. otherwise we log and drop event (previous behavior)
222
222
  if @dlq_writer
223
- @dlq_writer.write(action.event, "#{message}")
223
+ @dlq_writer.write(event, "#{message}")
224
224
  else
225
225
  @logger.send log_level, message
226
226
  end
@@ -259,7 +259,6 @@ module LogStash; module PluginMixins; module ElasticSearch
259
259
  status = action_props["status"]
260
260
  error = action_props["error"]
261
261
  action = actions[idx]
262
- action_params = action[1]
263
262
 
264
263
  # Retry logic: If it is success, we move on. If it is a failure, we have 3 paths:
265
264
  # - For 409, we log and drop. there is nothing we can do
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '11.9.0'
3
+ s.version = '11.9.1'
4
4
  s.licenses = ['apache-2.0']
5
5
  s.summary = "Stores logs in Elasticsearch"
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"
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
33
33
  s.add_development_dependency 'cabin', ['~> 0.6']
34
34
  s.add_development_dependency 'webrick'
35
35
  s.add_development_dependency 'webmock'
36
+ s.add_development_dependency 'rspec-collection_matchers'
36
37
  # Still used in some specs, we should remove this ASAP
37
38
  s.add_development_dependency 'elasticsearch'
38
39
  end
@@ -137,7 +137,7 @@ describe "indexing with sprintf resolution", :integration => true do
137
137
  before { subject.instance_variable_set('@dlq_writer', dlq_writer) }
138
138
 
139
139
  it "should doesn't create an index name with unresolved placeholders" do
140
- expect(dlq_writer).to receive(:write).once.with(event, /Could not resolve dynamic index/)
140
+ expect(dlq_writer).to receive(:write).once.with(event, a_string_including("Badly formatted index, after interpolation still contains placeholder"))
141
141
  subject.multi_receive(events)
142
142
 
143
143
  escaped_index_name = CGI.escape("%{[index_name]}_dynamic")
@@ -0,0 +1,75 @@
1
+ require_relative "../../../spec/es_spec_helper"
2
+
3
+ describe "Unsupported actions testing...", :integration => true do
4
+ require "logstash/outputs/elasticsearch"
5
+
6
+ INDEX = "logstash-unsupported-actions-rejected"
7
+
8
+ def get_es_output( options={} )
9
+ settings = {
10
+ "manage_template" => true,
11
+ "index" => INDEX,
12
+ "template_overwrite" => true,
13
+ "hosts" => get_host_port(),
14
+ "action" => "%{action_field}",
15
+ "document_id" => "%{doc_id}",
16
+ "ecs_compatibility" => "disabled"
17
+ }
18
+ LogStash::Outputs::ElasticSearch.new(settings.merge!(options))
19
+ end
20
+
21
+ before :each do
22
+ @es = get_client
23
+ # Delete all templates first.
24
+ # Clean ES of data before we start.
25
+ @es.indices.delete_template(:name => "*")
26
+ # This can fail if there are no indexes, ignore failure.
27
+ @es.indices.delete(:index => "*") rescue nil
28
+ # index single doc for update purpose
29
+ @es.index(
30
+ :index => INDEX,
31
+ :type => doc_type,
32
+ :id => "2",
33
+ :body => { :message => 'Test to doc indexing', :counter => 1 }
34
+ )
35
+ @es.index(
36
+ :index => INDEX,
37
+ :type => doc_type,
38
+ :id => "3",
39
+ :body => { :message => 'Test to doc deletion', :counter => 2 }
40
+ )
41
+ @es.indices.refresh
42
+ end
43
+
44
+ context "multiple actions include unsupported action" do
45
+ let(:events) {[
46
+ LogStash::Event.new("action_field" => "index", "doc_id" => 1, "message"=> "hello"),
47
+ LogStash::Event.new("action_field" => "update", "doc_id" => 2, "message"=> "hi"),
48
+ LogStash::Event.new("action_field" => "delete", "doc_id" => 3),
49
+ LogStash::Event.new("action_field" => "unsupported_action", "doc_id" => 4, "message"=> "world!")
50
+ ]}
51
+
52
+ it "should reject unsupported doc" do
53
+ subject = get_es_output
54
+ subject.register
55
+ subject.multi_receive(events)
56
+
57
+ index_or_update = proc do |event|
58
+ action = event.get("action_field")
59
+ action.eql?("index") || action.eql?("update")
60
+ end
61
+
62
+ indexed_events = events.select { |event| index_or_update.call(event) }
63
+ rejected_events = events.select { |event| !index_or_update.call(event) }
64
+
65
+ indexed_events.each do |event|
66
+ response = @es.get(:index => INDEX, :type => doc_type, :id => event.get("doc_id"), :refresh => true)
67
+ expect(response['_source']['message']).to eq(event.get("message"))
68
+ end
69
+
70
+ rejected_events.each do |event|
71
+ expect {@es.get(:index => INDEX, :type => doc_type, :id => event.get("doc_id"), :refresh => true)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -266,6 +266,7 @@ describe LogStash::Outputs::ElasticSearch::HttpClient do
266
266
  end
267
267
  end
268
268
  end
269
+
269
270
  end
270
271
  end
271
272
  end
@@ -3,8 +3,8 @@ require "base64"
3
3
  require "flores/random"
4
4
  require 'concurrent/atomic/count_down_latch'
5
5
  require "logstash/outputs/elasticsearch"
6
-
7
6
  require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
7
+ require 'rspec/collection_matchers'
8
8
 
9
9
  describe LogStash::Outputs::ElasticSearch do
10
10
  subject(:elasticsearch_output_instance) { described_class.new(options) }
@@ -347,7 +347,7 @@ describe LogStash::Outputs::ElasticSearch do
347
347
  }
348
348
  },
349
349
  # NOTE: this is an artificial success (usually everything fails with a 500) but even if some doc where
350
- # to succeed due the unexpected reponse items we can not clearly identify which actions to retry ...
350
+ # to succeed due the unexpected response items we can not clearly identify which actions to retry ...
351
351
  {"index"=>{"_index"=>"bar2", "_type"=>"_doc", "_id"=>nil, "status"=>201}},
352
352
  {"index"=>{"_index"=>"bar2", "_type"=>"_doc", "_id"=>nil, "status"=>500,
353
353
  "error"=>{"type" => "illegal_state_exception",
@@ -381,6 +381,104 @@ describe LogStash::Outputs::ElasticSearch do
381
381
  subject.multi_receive(events)
382
382
  end
383
383
  end
384
+
385
+ context "unsupported actions" do
386
+ let(:options) { super().merge("index" => "logstash", "action" => "%{action_field}") }
387
+
388
+ context "with multiple valid actions with one trailing invalid action" do
389
+ let(:events) {[
390
+ LogStash::Event.new("action_field" => "index", "id" => 1, "message"=> "hello"),
391
+ LogStash::Event.new("action_field" => "index", "id" => 2, "message"=> "hi"),
392
+ LogStash::Event.new("action_field" => "index", "id" => 3, "message"=> "bye"),
393
+ LogStash::Event.new("action_field" => "unsupported_action", "id" => 4, "message"=> "world!")
394
+ ]}
395
+ it "rejects unsupported actions" do
396
+ event_result = subject.send(:safe_interpolation_map_events, events)
397
+ expect(event_result.successful_events).to have_exactly(3).items
398
+ event_result.successful_events.each do |action, _|
399
+ expect(action).to_not eql("unsupported_action")
400
+ end
401
+ expect(event_result.event_mapping_errors).to have_exactly(1).items
402
+ event_result.event_mapping_errors.each do |event_mapping_error|
403
+ expect(event_mapping_error.message).to eql("Elasticsearch doesn't support [unsupported_action] action")
404
+ end
405
+ end
406
+ end
407
+
408
+ context "with one leading invalid action followed by multiple valid actions" do
409
+ let(:events) {[
410
+ LogStash::Event.new("action_field" => "unsupported_action", "id" => 1, "message"=> "world!"),
411
+ LogStash::Event.new("action_field" => "index", "id" => 2, "message"=> "hello"),
412
+ LogStash::Event.new("action_field" => "index", "id" => 3, "message"=> "hi"),
413
+ LogStash::Event.new("action_field" => "index", "id" => 4, "message"=> "bye")
414
+ ]}
415
+ it "rejects unsupported actions" do
416
+ event_result = subject.send(:safe_interpolation_map_events, events)
417
+ expect(event_result.successful_events).to have_exactly(3).items
418
+ event_result.successful_events.each do |action, _|
419
+ expect(action).to_not eql("unsupported_action")
420
+ end
421
+ expect(event_result.event_mapping_errors).to have_exactly(1).items
422
+ event_result.event_mapping_errors.each do |event_mapping_error|
423
+ expect(event_mapping_error.message).to eql("Elasticsearch doesn't support [unsupported_action] action")
424
+ end
425
+ end
426
+ end
427
+
428
+ context "with batch of multiple invalid actions and no valid actions" do
429
+ let(:events) {[
430
+ LogStash::Event.new("action_field" => "unsupported_action1", "id" => 1, "message"=> "world!"),
431
+ LogStash::Event.new("action_field" => "unsupported_action2", "id" => 2, "message"=> "hello"),
432
+ LogStash::Event.new("action_field" => "unsupported_action3", "id" => 3, "message"=> "hi"),
433
+ LogStash::Event.new("action_field" => "unsupported_action4", "id" => 4, "message"=> "bye")
434
+ ]}
435
+ it "rejects unsupported actions" do
436
+ event_result = subject.send(:safe_interpolation_map_events, events)
437
+ expect(event_result.successful_events).to have(:no).items
438
+ event_result.successful_events.each do |action, _|
439
+ expect(action).to_not eql("unsupported_action")
440
+ end
441
+ expect(event_result.event_mapping_errors).to have_exactly(4).items
442
+ event_result.event_mapping_errors.each do |event_mapping_error|
443
+ expect(event_mapping_error.message).to include "Elasticsearch doesn't support"
444
+ end
445
+ end
446
+ end
447
+
448
+ context "with batch of intermixed valid and invalid actions" do
449
+ let(:events) {[
450
+ LogStash::Event.new("action_field" => "index", "id" => 1, "message"=> "world!"),
451
+ LogStash::Event.new("action_field" => "unsupported_action2", "id" => 2, "message"=> "hello"),
452
+ LogStash::Event.new("action_field" => "unsupported_action3", "id" => 3, "message"=> "hi"),
453
+ LogStash::Event.new("action_field" => "index", "id" => 4, "message"=> "bye")
454
+ ]}
455
+ it "rejects unsupported actions" do
456
+ event_result = subject.send(:safe_interpolation_map_events, events)
457
+ expect(event_result.successful_events).to have_exactly(2).items
458
+ expect(event_result.event_mapping_errors).to have_exactly(2).items
459
+ event_result.event_mapping_errors.each do |event_mapping_error|
460
+ expect(event_mapping_error.message).to include "Elasticsearch doesn't support"
461
+ end
462
+ end
463
+ end
464
+
465
+ context "with batch of exactly one action that is invalid" do
466
+ let(:events) {[
467
+ LogStash::Event.new("action_field" => "index", "id" => 1, "message"=> "world!"),
468
+ LogStash::Event.new("action_field" => "index", "id" => 2, "message"=> "hello"),
469
+ LogStash::Event.new("action_field" => "unsupported_action3", "id" => 3, "message"=> "hi"),
470
+ LogStash::Event.new("action_field" => "index", "id" => 4, "message"=> "bye")
471
+ ]}
472
+ it "rejects unsupported action" do
473
+ event_result = subject.send(:safe_interpolation_map_events, events)
474
+ expect(event_result.successful_events).to have_exactly(3).items
475
+ expect(event_result.event_mapping_errors).to have_exactly(1).items
476
+ event_result.event_mapping_errors.each do |event_mapping_error|
477
+ expect(event_mapping_error.message).to eql("Elasticsearch doesn't support [unsupported_action3] action")
478
+ end
479
+ end
480
+ end
481
+ end
384
482
  end
385
483
 
386
484
  context '413 errors' do
@@ -772,6 +870,7 @@ describe LogStash::Outputs::ElasticSearch do
772
870
 
773
871
  context 'when @dlq_writer is nil' do
774
872
  before { subject.instance_variable_set '@dlq_writer', nil }
873
+ let(:action) { LogStash::Outputs::ElasticSearch::EventActionTuple.new(:action, :params, LogStash::Event.new("foo" => "bar")) }
775
874
 
776
875
  context 'resorting to previous behaviour of logging the error' do
777
876
  context 'getting an invalid_index_name_exception' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.9.0
4
+ version: 11.9.1
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-20 00:00:00.000000000 Z
11
+ date: 2022-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -196,6 +196,20 @@ dependencies:
196
196
  - - ">="
197
197
  - !ruby/object:Gem::Version
198
198
  version: '0'
199
+ - !ruby/object:Gem::Dependency
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ name: rspec-collection_matchers
206
+ prerelease: false
207
+ type: :development
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
199
213
  - !ruby/object:Gem::Dependency
200
214
  requirement: !ruby/object:Gem::Requirement
201
215
  requirements:
@@ -288,6 +302,7 @@ files:
288
302
  - spec/integration/outputs/routing_spec.rb
289
303
  - spec/integration/outputs/sniffer_spec.rb
290
304
  - spec/integration/outputs/templates_spec.rb
305
+ - spec/integration/outputs/unsupported_actions_spec.rb
291
306
  - spec/integration/outputs/update_spec.rb
292
307
  - spec/spec_helper.rb
293
308
  - spec/support/elasticsearch/api/actions/delete_ilm_policy.rb
@@ -373,6 +388,7 @@ test_files:
373
388
  - spec/integration/outputs/routing_spec.rb
374
389
  - spec/integration/outputs/sniffer_spec.rb
375
390
  - spec/integration/outputs/templates_spec.rb
391
+ - spec/integration/outputs/unsupported_actions_spec.rb
376
392
  - spec/integration/outputs/update_spec.rb
377
393
  - spec/spec_helper.rb
378
394
  - spec/support/elasticsearch/api/actions/delete_ilm_policy.rb