logstash-output-elasticsearch 11.15.1-java → 11.15.2-java

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: 6ad6b80e4c6db7a54c8b7a830f6a922a7057b2e7585820db8a6c093b57db3800
4
- data.tar.gz: 82cd893394fc7ac08ae7a79b2cd953f80fbf258ec2faad225300a2ce516ab208
3
+ metadata.gz: d000a73f7c5397c4e4643c0d1dbb4efb0c04b290054b0d455f020ec3443765d5
4
+ data.tar.gz: 9330ee2b0e8a903cc966c502fdc321e39fb2ee15b7b2782f2539567743346d71
5
5
  SHA512:
6
- metadata.gz: b861d195377c3eeadf4489d21780be6627597aa0b93992bd7378b7cf680f6f99ac120ae342a4b48739ee6ef2652aa9238ee9fc08838cbed0f6dae0c887b06daa
7
- data.tar.gz: 16091be406132dbb590ad76a0ba2e83cb0729717d8229b410bccbcabc660a7a26146fd2c7aaae6976f954bd17f1f763c6353552699ffd67173efb9917b913658
6
+ metadata.gz: ddcee04fc7e64d4dd77b6c868c34e65e9fff345c7d1d2c37da5752ae612f09ae8147d0686cfdcdee8494c9c6e6c6045a204ddc157db959733c677f719ca958f9
7
+ data.tar.gz: '032939b34d7fbf6b4107295ea12c80ea651da05b29290154da37e6ff2b04cb123dcc07dee3bdce2ba184f06d2a2d0b4036dac9b3d8099e403bfda836efb4f29e'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 11.15.2
2
+ - Restores DLQ logging behavior from 11.8.x to include the action-tuple as structured [#1105](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1105)
3
+
1
4
  ## 11.15.1
2
5
  - Move async finish_register to bottom of register to avoid race condition [#1125](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1125)
3
6
 
@@ -405,7 +405,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
405
405
 
406
406
  event_mapping_errors.each do |event_mapping_error|
407
407
  detailed_message = "#{event_mapping_error.message}; event: `#{event_mapping_error.event.to_hash_with_metadata}`"
408
- handle_dlq_status(event_mapping_error.event, :warn, detailed_message)
408
+ @dlq_writer ? @dlq_writer.write(event_mapping_error.event, detailed_message) : @logger.warn(detailed_message)
409
409
  end
410
410
  @document_level_metrics.increment(:non_retryable_failures, event_mapping_errors.size)
411
411
  end
@@ -422,7 +422,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
422
422
  successful_events << @event_mapper.call(event)
423
423
  rescue EventMappingError => ie
424
424
  event_mapping_errors << FailedEventMapping.new(event, ie.message)
425
- end
425
+ end
426
426
  end
427
427
  MapEventsResult.new(successful_events, event_mapping_errors)
428
428
  end
@@ -227,22 +227,16 @@ module LogStash; module PluginMixins; module ElasticSearch
227
227
  end
228
228
 
229
229
  def handle_dlq_response(message, action, status, response)
230
- _, action_params = action.event, [action[0], action[1], action[2]]
230
+ event, action_params = action.event, [action[0], action[1], action[2]]
231
231
 
232
- # TODO: Change this to send a map with { :status => status, :action => action } in the future
233
- detailed_message = "#{message} status: #{status}, action: #{action_params}, response: #{response}"
234
-
235
- log_level = dig_value(response, 'index', 'error', 'type') == 'invalid_index_name_exception' ? :error : :warn
236
-
237
- handle_dlq_status(action.event, log_level, detailed_message)
238
- end
239
-
240
- def handle_dlq_status(event, log_level, message)
241
- # To support bwc, we check if DLQ exists. otherwise we log and drop event (previous behavior)
242
232
  if @dlq_writer
243
- @dlq_writer.write(event, "#{message}")
233
+ # TODO: Change this to send a map with { :status => status, :action => action } in the future
234
+ detailed_message = "#{message} status: #{status}, action: #{action_params}, response: #{response}"
235
+ @dlq_writer.write(event, "#{detailed_message}")
244
236
  else
245
- @logger.send log_level, message
237
+ log_level = dig_value(response, 'index', 'error', 'type') == 'invalid_index_name_exception' ? :error : :warn
238
+
239
+ @logger.public_send(log_level, message, status: status, action: action_params, response: response)
246
240
  end
247
241
  end
248
242
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '11.15.1'
3
+ s.version = '11.15.2'
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"
@@ -67,19 +67,24 @@ module ESHelper
67
67
  end
68
68
 
69
69
  RSpec::Matchers.define :have_hits do |expected|
70
+ hits_count_path = ESHelper.es_version_satisfies?(">=7") ? %w(hits total value) : %w(hits total)
71
+
70
72
  match do |actual|
71
- if ESHelper.es_version_satisfies?(">=7")
72
- expected == actual['hits']['total']['value']
73
- else
74
- expected == actual['hits']['total']
75
- end
73
+ @actual_hits_count = actual&.dig(*hits_count_path)
74
+ values_match? expected, @actual_hits_count
75
+ end
76
+ failure_message do |actual|
77
+ "expected that #{actual} with #{@actual_hits_count || "UNKNOWN" } hits would have #{expected} hits"
76
78
  end
77
79
  end
78
80
 
79
81
  RSpec::Matchers.define :have_index_pattern do |expected|
80
82
  match do |actual|
81
- test_against = Array(actual['index_patterns'].nil? ? actual['template'] : actual['index_patterns'])
82
- test_against.include?(expected)
83
+ @actual_index_pattterns = Array(actual['index_patterns'].nil? ? actual['template'] : actual['index_patterns'])
84
+ @actual_index_pattterns.any? { |v| values_match? expected, v }
85
+ end
86
+ failure_message do |actual|
87
+ "expected that #{actual} with index patterns #{@actual_index_pattterns} would have included `#{expected}`"
83
88
  end
84
89
  end
85
90
 
@@ -23,7 +23,9 @@ describe "index template expected behavior", :integration => true do
23
23
 
24
24
  elasticsearch_client.indices.delete_template(:name => '*')
25
25
  # This can fail if there are no indexes, ignore failure.
26
- elasticsearch_client.indices.delete(:index => '*') rescue nil
26
+ elasticsearch_client.indices.delete(:index => '*') rescue puts("DELETE INDICES ERROR: #{$!}")
27
+ # Since we are pinned to ES client 7.x, we need to delete data streams the hard way...
28
+ elasticsearch_client.perform_request("DELETE", "/_data_stream/*") rescue puts("DELETE DATA STREAMS ERROR: #{$!}")
27
29
  end
28
30
 
29
31
  context 'with ecs_compatibility => disabled' do
@@ -1121,41 +1121,63 @@ describe LogStash::Outputs::ElasticSearch do
1121
1121
  end if LOGSTASH_VERSION > '6.0'
1122
1122
 
1123
1123
  context 'handling elasticsearch document-level status meant for the DLQ' do
1124
+ let(:es_api_action) { "CUSTOM_ACTION" }
1125
+ let(:es_api_params) { Hash['_index' => 'MY_INDEX'] }
1126
+
1124
1127
  let(:options) { { "manage_template" => false, "data_stream" => 'false' } }
1125
- let(:action) { LogStash::Outputs::ElasticSearch::EventActionTuple.new(:action, :params, LogStash::Event.new("foo" => "bar")) }
1128
+ let(:action) { LogStash::Outputs::ElasticSearch::EventActionTuple.new(es_api_action, es_api_params, LogStash::Event.new("foo" => "bar")) }
1129
+
1130
+ let(:logger) { double('logger').as_null_object }
1131
+ before(:each) { subject.instance_variable_set(:@logger, logger) }
1126
1132
 
1127
1133
  context 'when @dlq_writer is nil' do
1128
1134
  before { subject.instance_variable_set '@dlq_writer', nil }
1129
- let(:action) { LogStash::Outputs::ElasticSearch::EventActionTuple.new(:action, :params, LogStash::Event.new("foo" => "bar")) }
1130
1135
 
1131
1136
  context 'resorting to previous behaviour of logging the error' do
1132
1137
  context 'getting an invalid_index_name_exception' do
1133
1138
  it 'should log at ERROR level' do
1134
- subject.instance_variable_set(:@logger, double("logger").as_null_object)
1139
+ # logger = double("logger").as_null_object
1140
+ # subject.instance_variable_set(:@logger, logger)
1141
+
1135
1142
  mock_response = { 'index' => { 'error' => { 'type' => 'invalid_index_name_exception' } } }
1136
1143
  subject.handle_dlq_response("Could not index event to Elasticsearch.", action, :some_status, mock_response)
1144
+
1145
+ expect(logger).to have_received(:error).with(a_string_including("Could not index event to Elasticsearch"),
1146
+ a_hash_including(:status => :some_status,
1147
+ :action => [es_api_action, es_api_params, action.event.to_hash],
1148
+ :response => mock_response))
1137
1149
  end
1138
1150
  end
1139
1151
 
1140
1152
  context 'when getting any other exception' do
1141
1153
  it 'should log at WARN level' do
1142
- logger = double("logger").as_null_object
1143
- subject.instance_variable_set(:@logger, logger)
1144
- expect(logger).to receive(:warn).with(a_string_including "Could not index event to Elasticsearch. status: some_status, action: [:action, :params, {")
1154
+ # logger = double("logger").as_null_object
1155
+ # subject.instance_variable_set(:@logger, logger)
1156
+
1145
1157
  mock_response = { 'index' => { 'error' => { 'type' => 'illegal_argument_exception' } } }
1146
1158
  subject.handle_dlq_response("Could not index event to Elasticsearch.", action, :some_status, mock_response)
1159
+
1160
+ expect(logger).to have_received(:warn).with(a_string_including("Could not index event to Elasticsearch"),
1161
+ a_hash_including(:status => :some_status,
1162
+ :action => [es_api_action, es_api_params, action.event.to_hash],
1163
+ :response => mock_response))
1147
1164
  end
1148
1165
  end
1149
1166
 
1150
1167
  context 'when the response does not include [error]' do
1151
1168
  it 'should not fail, but just log a warning' do
1152
- logger = double("logger").as_null_object
1153
- subject.instance_variable_set(:@logger, logger)
1154
- expect(logger).to receive(:warn).with(a_string_including "Could not index event to Elasticsearch. status: some_status, action: [:action, :params, {")
1169
+ # logger = double("logger").as_null_object
1170
+ # subject.instance_variable_set(:@logger, logger)
1171
+
1155
1172
  mock_response = { 'index' => {} }
1156
1173
  expect do
1157
1174
  subject.handle_dlq_response("Could not index event to Elasticsearch.", action, :some_status, mock_response)
1158
1175
  end.to_not raise_error
1176
+
1177
+ expect(logger).to have_received(:warn).with(a_string_including("Could not index event to Elasticsearch"),
1178
+ a_hash_including(:status => :some_status,
1179
+ :action => [es_api_action, es_api_params, action.event.to_hash],
1180
+ :response => mock_response))
1159
1181
  end
1160
1182
  end
1161
1183
  end
@@ -1175,6 +1197,8 @@ describe LogStash::Outputs::ElasticSearch do
1175
1197
  mock_response = { 'index' => { 'error' => { 'type' => 'illegal_argument_exception' } } }
1176
1198
  action = LogStash::Outputs::ElasticSearch::EventActionTuple.new(:action, :params, event)
1177
1199
  subject.handle_dlq_response("Could not index event to Elasticsearch.", action, 404, mock_response)
1200
+
1201
+ expect(logger).to_not have_received(:warn).with(a_string_including("Could not index event to Elasticsearch"))
1178
1202
  end
1179
1203
  end
1180
1204
 
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.15.1
4
+ version: 11.15.2
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-20 00:00:00.000000000 Z
11
+ date: 2023-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -356,7 +356,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
356
356
  - !ruby/object:Gem::Version
357
357
  version: '0'
358
358
  requirements: []
359
- rubygems_version: 3.2.29
359
+ rubygems_version: 3.1.6
360
360
  signing_key:
361
361
  specification_version: 4
362
362
  summary: Stores logs in Elasticsearch