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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -12
- data/docs/index.asciidoc +19 -233
- data/lib/logstash/inputs/elasticsearch/aggregation.rb +8 -11
- data/lib/logstash/inputs/elasticsearch/paginated_search.rb +2 -12
- data/lib/logstash/inputs/elasticsearch.rb +21 -137
- data/logstash-input-elasticsearch.gemspec +3 -3
- data/spec/fixtures/test_certs/ca.crt +18 -17
- data/spec/fixtures/test_certs/ca.der.sha256 +1 -1
- data/spec/fixtures/test_certs/es.crt +18 -17
- data/spec/inputs/elasticsearch_spec.rb +22 -126
- data/spec/inputs/integration/elasticsearch_spec.rb +2 -10
- metadata +3 -18
- data/lib/logstash/inputs/elasticsearch/cursor_tracker.rb +0 -58
- data/spec/fixtures/test_certs/GENERATED_AT +0 -1
- data/spec/fixtures/test_certs/es.chain.crt +0 -38
- data/spec/fixtures/test_certs/renew.sh +0 -15
- data/spec/inputs/cursor_tracker_spec.rb +0 -72
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
|
+
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:
|
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:
|
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
|