logstash-input-elasticsearch 4.22.0 → 5.0.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.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.22.0
4
+ version: 5.0.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-04-07 00:00:00.000000000 Z
11
+ date: 2024-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -92,9 +92,6 @@ dependencies:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: 7.17.9
95
- - - "<"
96
- - !ruby/object:Gem::Version
97
- version: '9'
98
95
  name: elasticsearch
99
96
  type: :runtime
100
97
  prerelease: false
@@ -103,9 +100,6 @@ dependencies:
103
100
  - - ">="
104
101
  - !ruby/object:Gem::Version
105
102
  version: 7.17.9
106
- - - "<"
107
- - !ruby/object:Gem::Version
108
- version: '9'
109
103
  - !ruby/object:Gem::Dependency
110
104
  requirement: !ruby/object:Gem::Requirement
111
105
  requirements:
@@ -278,26 +272,21 @@ files:
278
272
  - lib/logstash/helpers/loggable_try.rb
279
273
  - lib/logstash/inputs/elasticsearch.rb
280
274
  - lib/logstash/inputs/elasticsearch/aggregation.rb
281
- - lib/logstash/inputs/elasticsearch/cursor_tracker.rb
282
275
  - lib/logstash/inputs/elasticsearch/paginated_search.rb
283
276
  - lib/logstash/inputs/elasticsearch/patches/_elasticsearch_transport_connections_selector.rb
284
277
  - lib/logstash/inputs/elasticsearch/patches/_elasticsearch_transport_http_manticore.rb
285
278
  - logstash-input-elasticsearch.gemspec
286
279
  - spec/es_helper.rb
287
- - spec/fixtures/test_certs/GENERATED_AT
288
280
  - spec/fixtures/test_certs/ca.crt
289
281
  - spec/fixtures/test_certs/ca.der.sha256
290
282
  - spec/fixtures/test_certs/ca.key
291
- - spec/fixtures/test_certs/es.chain.crt
292
283
  - spec/fixtures/test_certs/es.crt
293
284
  - spec/fixtures/test_certs/es.key
294
- - spec/fixtures/test_certs/renew.sh
295
- - spec/inputs/cursor_tracker_spec.rb
296
285
  - spec/inputs/elasticsearch_spec.rb
297
286
  - spec/inputs/elasticsearch_ssl_spec.rb
298
287
  - spec/inputs/integration/elasticsearch_spec.rb
299
288
  - spec/inputs/paginated_search_spec.rb
300
- homepage: https://elastic.co/logstash
289
+ homepage: http://www.elastic.co/guide/en/logstash/current/index.html
301
290
  licenses:
302
291
  - Apache License (2.0)
303
292
  metadata:
@@ -324,15 +313,11 @@ specification_version: 4
324
313
  summary: Reads query results from an Elasticsearch cluster
325
314
  test_files:
326
315
  - spec/es_helper.rb
327
- - spec/fixtures/test_certs/GENERATED_AT
328
316
  - spec/fixtures/test_certs/ca.crt
329
317
  - spec/fixtures/test_certs/ca.der.sha256
330
318
  - spec/fixtures/test_certs/ca.key
331
- - spec/fixtures/test_certs/es.chain.crt
332
319
  - spec/fixtures/test_certs/es.crt
333
320
  - spec/fixtures/test_certs/es.key
334
- - spec/fixtures/test_certs/renew.sh
335
- - spec/inputs/cursor_tracker_spec.rb
336
321
  - spec/inputs/elasticsearch_spec.rb
337
322
  - spec/inputs/elasticsearch_ssl_spec.rb
338
323
  - spec/inputs/integration/elasticsearch_spec.rb
@@ -1,58 +0,0 @@
1
- require 'fileutils'
2
-
3
- module LogStash; module Inputs; class Elasticsearch
4
- class CursorTracker
5
- include LogStash::Util::Loggable
6
-
7
- attr_reader :last_value
8
-
9
- def initialize(last_run_metadata_path:, tracking_field:, tracking_field_seed:)
10
- @last_run_metadata_path = last_run_metadata_path
11
- @last_value_hashmap = Java::java.util.concurrent.ConcurrentHashMap.new
12
- @last_value = IO.read(@last_run_metadata_path) rescue nil || tracking_field_seed
13
- @tracking_field = tracking_field
14
- logger.info "Starting value for cursor field \"#{@tracking_field}\": #{@last_value}"
15
- @mutex = Mutex.new
16
- end
17
-
18
- def checkpoint_cursor(intermediate: true)
19
- @mutex.synchronize do
20
- if intermediate
21
- # in intermediate checkpoints pick the smallest
22
- converge_last_value {|v1, v2| v1 < v2 ? v1 : v2}
23
- else
24
- # in the last search of a PIT choose the largest
25
- converge_last_value {|v1, v2| v1 > v2 ? v1 : v2}
26
- @last_value_hashmap.clear
27
- end
28
- IO.write(@last_run_metadata_path, @last_value)
29
- end
30
- end
31
-
32
- def converge_last_value(&block)
33
- return if @last_value_hashmap.empty?
34
- new_last_value = @last_value_hashmap.reduceValues(1000, &block)
35
- logger.debug? && logger.debug("converge_last_value: got #{@last_value_hashmap.values.inspect}. won: #{new_last_value}")
36
- return if new_last_value == @last_value
37
- @last_value = new_last_value
38
- logger.info "New cursor value for field \"#{@tracking_field}\" is: #{new_last_value}"
39
- end
40
-
41
- def record_last_value(event)
42
- value = event.get(@tracking_field)
43
- logger.trace? && logger.trace("storing last_value if #{@tracking_field} for #{Thread.current.object_id}: #{value}")
44
- @last_value_hashmap.put(Thread.current.object_id, value)
45
- end
46
-
47
- def inject_cursor(query_json)
48
- # ":present" means "now - 30s" to avoid grabbing partially visible data in the PIT
49
- result = query_json.gsub(":last_value", @last_value.to_s).gsub(":present", now_minus_30s)
50
- logger.debug("inject_cursor: injected values for ':last_value' and ':present'", :query => result)
51
- result
52
- end
53
-
54
- def now_minus_30s
55
- Java::java.time.Instant.now.minusSeconds(30).to_s
56
- end
57
- end
58
- end; end; end
@@ -1 +0,0 @@
1
- 2024-12-26T22:27:15+00:00
@@ -1,38 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
3
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
4
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMA0xCzAJBgNVBAMTAmVzMIIBIjANBgkqhkiG
5
- 9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5V
6
- V21nXpYzQJoQbuWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz
7
- 36pcFw7UyF51/AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/c
8
- MjNrUC7iP0dvfOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH
9
- /z07/mVKoBAa5DVoNGvxN0fCE7vW7hkhT8+frJcsYFatAbnf6ql0KzEa8lN9u0gR
10
- hQNM3zcKKsjEMomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABo2cwZTAY
11
- BgNVHREEETAPgg1lbGFzdGljc2VhcmNoMAkGA1UdEwQCMAAwHQYDVR0OBBYEFFQU
12
- K+6Cg2kExRj1xSDzEi4kkgKXMB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGB
13
- wpBGMA0GCSqGSIb3DQEBCwUAA4IBAQB6cZ7IrDzcAoOZgAt9RlOe2yzQeH+alttp
14
- CSQVINjJotS1WvmtqjBB6ArqLpXIGU89TZsktNe/NQJzgYSaMnlIuHVLFdxJYmwU
15
- T1cP6VC/brmqP/dd5y7VWE7Lp+Wd5CxKl/WY+9chmgc+a1fW/lnPEJJ6pca1Bo8b
16
- byIL0yY2IUv4R2eh1IyQl9oGH1GOPLgO7cY04eajxYcOVA2eDSItoyDtrJfkFP/P
17
- UXtC1JAkvWKuujFEiBj0AannhroWlp3gvChhBwCuCAU0KXD6g8BE8tn6oT1+FW7J
18
- avSfHxAe+VHtYhF8sJ8jrdm0d7E4GKS9UR/pkLAL1JuRdJ1VkPx3
19
- -----END CERTIFICATE-----
20
- -----BEGIN CERTIFICATE-----
21
- MIIDFTCCAf2gAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
22
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
23
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlm
24
- aWNhdGUgVG9vbCBBdXRvZ2VuZXJhdGVkIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
25
- AQ8AMIIBCgKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
26
- QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
27
- 90IzGE0GU4D90OW/L4QkGX0fv3VQbL8KGFKBoF04pXIaSGMStFN4wirutHtQboYv
28
- 99X4kbLjVSIuubUpA/v9dUP1TNl8ar+HKUWRM96ijHkFTF3FR0NnZyt44gP5qC0h
29
- i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
30
- m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABozIwMDAPBgNVHRMBAf8E
31
- BTADAQH/MB0GA1UdDgQWBBTIJMnuftpfkxNCOkbF0R4xgcKQRjANBgkqhkiG9w0B
32
- AQsFAAOCAQEAhfg/cmXc4Uh90yiXU8jOW8saQjTsq4ZMDQiLfJsNmNNYmHFN0vhv
33
- lJRI1STdy7+GpjS5QbrMjQIxWSS8X8xysE4Rt81IrWmLuao35TRFyoiE1seBQ5sz
34
- p/BxZUe57JvWi9dyzv2df4UfWFdGBhzdr80odZmz4i5VIv6qCKJKsGikcuLpepmp
35
- E/UKnKHeR/dFWsxzA9P2OzHTUNBMOOA2PyAUL49pwoChwJeOWN/zAgwMWLbuHFG0
36
- IN0u8swAmeH98QdvzbhiOatGNpqfTNvQEDc19yVjfXKpBVZQ79WtronYSqrbrUa1
37
- T2zD8bIVP7CdddD/UmpT1SSKh4PJxudy5Q==
38
- -----END CERTIFICATE-----
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -e
4
- cd "$(dirname "$0")"
5
-
6
- openssl x509 -x509toreq -in ca.crt -copy_extensions copyall -signkey ca.key -out ca.csr
7
- openssl x509 -req -copy_extensions copyall -days 365 -in ca.csr -set_serial 0x01 -signkey ca.key -out ca.crt && rm ca.csr
8
- openssl x509 -in ca.crt -outform der | sha256sum | awk '{print $1}' > ca.der.sha256
9
-
10
- openssl x509 -x509toreq -in es.crt -copy_extensions copyall -signkey es.key -out es.csr
11
- openssl x509 -req -copy_extensions copyall -days 365 -in es.csr -set_serial 0x01 -CA ca.crt -CAkey ca.key -out es.crt && rm es.csr
12
- cat es.crt ca.crt > es.chain.crt
13
-
14
- # output ISO8601 timestamp to file
15
- date -Iseconds > GENERATED_AT
@@ -1,72 +0,0 @@
1
- # encoding: utf-8
2
- require "logstash/devutils/rspec/spec_helper"
3
- require "logstash/devutils/rspec/shared_examples"
4
- require "logstash/inputs/elasticsearch"
5
- require "logstash/inputs/elasticsearch/cursor_tracker"
6
-
7
- describe LogStash::Inputs::Elasticsearch::CursorTracker do
8
-
9
- let(:last_run_metadata_path) { Tempfile.new('cursor_tracker_testing').path }
10
- let(:tracking_field_seed) { "1980-01-01T23:59:59.999999999Z" }
11
- let(:options) do
12
- {
13
- :last_run_metadata_path => last_run_metadata_path,
14
- :tracking_field => "my_field",
15
- :tracking_field_seed => tracking_field_seed
16
- }
17
- end
18
-
19
- subject { described_class.new(**options) }
20
-
21
- it "creating a class works" do
22
- expect(subject).to be_a described_class
23
- end
24
-
25
- describe "checkpoint_cursor" do
26
- before(:each) do
27
- subject.checkpoint_cursor(intermediate: false) # store seed value
28
- [
29
- Thread.new(subject) {|subject| subject.record_last_value(LogStash::Event.new("my_field" => "2025-01-03T23:59:59.999999999Z")) },
30
- Thread.new(subject) {|subject| subject.record_last_value(LogStash::Event.new("my_field" => "2025-01-01T23:59:59.999999999Z")) },
31
- Thread.new(subject) {|subject| subject.record_last_value(LogStash::Event.new("my_field" => "2025-01-02T23:59:59.999999999Z")) },
32
- ].each(&:join)
33
- end
34
- context "when doing intermediate checkpoint" do
35
- it "persists the smallest value" do
36
- subject.checkpoint_cursor(intermediate: true)
37
- expect(IO.read(last_run_metadata_path)).to eq("2025-01-01T23:59:59.999999999Z")
38
- end
39
- end
40
- context "when doing non-intermediate checkpoint" do
41
- it "persists the largest value" do
42
- subject.checkpoint_cursor(intermediate: false)
43
- expect(IO.read(last_run_metadata_path)).to eq("2025-01-03T23:59:59.999999999Z")
44
- end
45
- end
46
- end
47
-
48
- describe "inject_cursor" do
49
- let(:new_value) { "2025-01-03T23:59:59.999999999Z" }
50
- let(:fake_now) { "2026-09-19T23:59:59.999999999Z" }
51
-
52
- let(:query) do
53
- %q[
54
- { "query": { "range": { "event.ingested": { "gt": :last_value, "lt": :present}}}, "sort": [ { "event.ingested": {"order": "asc", "format": "strict_date_optional_time_nanos", "numeric_type" : "date_nanos" } } ] }
55
- ]
56
- end
57
-
58
- before(:each) do
59
- subject.record_last_value(LogStash::Event.new("my_field" => new_value))
60
- subject.checkpoint_cursor(intermediate: false)
61
- allow(subject).to receive(:now_minus_30s).and_return(fake_now)
62
- end
63
-
64
- it "injects the value of the cursor into json query if it contains :last_value" do
65
- expect(subject.inject_cursor(query)).to match(/#{new_value}/)
66
- end
67
-
68
- it "injects current time into json query if it contains :present" do
69
- expect(subject.inject_cursor(query)).to match(/#{fake_now}/)
70
- end
71
- end
72
- end