logstash-output-elasticsearch 6.3.0-java → 7.0.0-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 +4 -4
- data/CHANGELOG.md +6 -2
- data/lib/logstash/outputs/elasticsearch.rb +15 -34
- data/lib/logstash/outputs/elasticsearch/http_client.rb +3 -6
- data/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb +2 -2
- data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +10 -26
- data/lib/logstash/outputs/elasticsearch/http_client_builder.rb +30 -9
- data/logstash-output-elasticsearch.gemspec +1 -1
- data/spec/unit/http_client_builder_spec.rb +158 -0
- data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +15 -68
- metadata +45 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76021c7104485b80a897db193e8bcb698bcb3e88
|
4
|
+
data.tar.gz: f4f3bcec4e2f448a1f424b53c03c6c96ca46f5dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1e75e1711a6e2f376d1e69e2bceeb029a617e96195841dd1673a4bf4d151223336816a967fde9a9be6d71edacd2f727f60f0f50162ce48dba17b2fbdf01f770
|
7
|
+
data.tar.gz: 53ace3cb794f69182d6eae22c3041879a587b682a5fb9939c76d4a64f5e5e042928943edcd08966496250903dc1f78f997bddb0f8a80bb676e7d97c7c7f76387
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
##
|
2
|
-
-
|
1
|
+
## 7.0.0
|
2
|
+
- introduce customization of bulk, healthcheck and sniffing paths with the behaviour:
|
3
|
+
- if not set: the default value will be used
|
4
|
+
- if not set and path is also set: the default is appended to path
|
5
|
+
- if set: the set value will be used, ignoring the default and path setting
|
6
|
+
- removes absolute_healthcheck_path and query_parameters
|
3
7
|
|
4
8
|
## 6.2.6
|
5
9
|
- Fixed: Change how the healthcheck_path is treated: either append it to any existing path (default) or replace any existing path
|
@@ -103,6 +103,10 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
103
103
|
# not also set this field. That will raise an error at startup
|
104
104
|
config :path, :validate => :string
|
105
105
|
|
106
|
+
# HTTP Path to perform the _bulk requests to
|
107
|
+
# this defaults to a concatenation of the path parameter and "_bulk"
|
108
|
+
config :bulk_path, :validate => :string
|
109
|
+
|
106
110
|
# Pass a set of key value pairs as the URL query string. This query string is added
|
107
111
|
# to every host listed in the 'hosts' configuration. If the 'hosts' list contains
|
108
112
|
# urls that already have query strings, the one specified here will be appended.
|
@@ -145,6 +149,12 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
145
149
|
# How long to wait, in seconds, between sniffing attempts
|
146
150
|
config :sniffing_delay, :validate => :number, :default => 5
|
147
151
|
|
152
|
+
# HTTP Path to be used for the sniffing requests
|
153
|
+
# the default value is computed by concatenating the path value and "_nodes/http"
|
154
|
+
# if sniffing_path is set it will be used as an absolute path
|
155
|
+
# do not use full URL here, only paths, e.g. "/sniff/_nodes/http"
|
156
|
+
config :sniffing_path, :validate => :string
|
157
|
+
|
148
158
|
# Set the address of a forward HTTP proxy.
|
149
159
|
# This used to accept hashes as arguments but now only accepts
|
150
160
|
# arguments of the URI type to prevent leaking credentials.
|
@@ -171,40 +181,11 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
171
181
|
# which is bad.
|
172
182
|
config :pool_max_per_route, :validate => :number, :default => 100
|
173
183
|
|
174
|
-
#
|
175
|
-
# background to see if it has come back again
|
176
|
-
#
|
177
|
-
#
|
178
|
-
config :healthcheck_path, :validate => :string
|
179
|
-
|
180
|
-
# When a `healthcheck_path` config is provided, this additional flag can be used to
|
181
|
-
# specify whether the healthcheck_path is appended to the existing path (default)
|
182
|
-
# or is treated as the absolute URL path.
|
183
|
-
#
|
184
|
-
# For example, if hosts url is "http://localhost:9200/es" and healthcheck_path is "/health",
|
185
|
-
# the health check url will be:
|
186
|
-
#
|
187
|
-
# * with `absolute_healthcheck_path: true`: "http://localhost:9200/es/health"
|
188
|
-
# * with `absolute_healthcheck_path: false`: "http://localhost:9200/health"
|
189
|
-
config :absolute_healthcheck_path, :validate => :boolean, :default => false
|
190
|
-
|
191
|
-
# If sniffing is enabled, this plugin will periodically execute a request
|
192
|
-
# to one of the nodes to retrieve the list of other nodes eligible to receive
|
193
|
-
# bulk requests. By default this path is `_nodes/http` but if you need to set
|
194
|
-
# it to something else, this is the place
|
195
|
-
# NOTE: any query parameters present in the URL or query_params config option will be removed
|
196
|
-
config :sniffing_path, :validate => :string, :default => "_nodes/http"
|
197
|
-
|
198
|
-
# When a `sniffing_path` config is provided, this additional flag can be used to
|
199
|
-
# specify whether this sniffing_path is appended to the existing path (default)
|
200
|
-
# or is treated as the absolute URL path.
|
201
|
-
#
|
202
|
-
# For example, if hosts url is "http://localhost:9200/es" and sniffing_path is "/_sniffing",
|
203
|
-
# the sniffing request will be sent to:
|
204
|
-
#
|
205
|
-
# * with `absolute_sniffing_path: true`: "http://localhost:9200/es/_sniffing"
|
206
|
-
# * with `absolute_sniffing_path: false`: "http://localhost:9200/_sniffing"
|
207
|
-
config :absolute_sniffing_path, :validate => :boolean, :default => false
|
184
|
+
# HTTP Path where a HEAD request is sent when a backend is marked down
|
185
|
+
# the request is sent in the background to see if it has come back again
|
186
|
+
# before it is once again eligible to service requests.
|
187
|
+
# If you have custom firewall rules you may need to change this
|
188
|
+
config :healthcheck_path, :validate => :string
|
208
189
|
|
209
190
|
# How frequently, in seconds, to wait between resurrection attempts.
|
210
191
|
# Resurrection is the process by which backend endpoints marked 'down' are checked
|
@@ -58,6 +58,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
58
58
|
@pool = build_pool(@options)
|
59
59
|
# mutex to prevent requests and sniffing to access the
|
60
60
|
# connection pool at the same time
|
61
|
+
@bulk_path = @options[:bulk_path]
|
61
62
|
end
|
62
63
|
|
63
64
|
def build_url_template
|
@@ -129,8 +130,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
129
130
|
end
|
130
131
|
|
131
132
|
def bulk_send(bulk_body)
|
132
|
-
|
133
|
-
url, response = @pool.post("_bulk", nil, bulk_body)
|
133
|
+
_, response = @pool.post(@bulk_path, nil, bulk_body)
|
134
134
|
LogStash::Json.load(response.body)
|
135
135
|
end
|
136
136
|
|
@@ -138,7 +138,6 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
138
138
|
@pool.close
|
139
139
|
end
|
140
140
|
|
141
|
-
|
142
141
|
def calculate_property(uris, property, default, sniff_check)
|
143
142
|
values = uris.map(&property).uniq
|
144
143
|
|
@@ -249,10 +248,8 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
249
248
|
pool_options = {
|
250
249
|
:sniffing => sniffing,
|
251
250
|
:sniffer_delay => options[:sniffer_delay],
|
252
|
-
:healthcheck_path => options[:healthcheck_path],
|
253
|
-
:absolute_healthcheck_path => options[:absolute_healthcheck_path],
|
254
251
|
:sniffing_path => options[:sniffing_path],
|
255
|
-
:
|
252
|
+
:healthcheck_path => options[:healthcheck_path],
|
256
253
|
:resurrect_delay => options[:resurrect_delay],
|
257
254
|
:url_normalizer => self.method(:host_to_url)
|
258
255
|
}
|
@@ -79,7 +79,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
79
79
|
resp
|
80
80
|
end
|
81
81
|
|
82
|
-
def format_url(url, path)
|
82
|
+
def format_url(url, path=nil)
|
83
83
|
|
84
84
|
request_uri = url.uri
|
85
85
|
|
@@ -92,7 +92,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
92
92
|
# and restore it after this operation
|
93
93
|
query = request_uri.query
|
94
94
|
request_uri = URI.join(request_uri, relative_path)
|
95
|
-
request_uri.query = query
|
95
|
+
request_uri.query = query if query
|
96
96
|
else
|
97
97
|
request_uri = request_uri.clone
|
98
98
|
end
|
@@ -28,15 +28,14 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
attr_reader :logger, :adapter, :sniffing, :sniffer_delay, :resurrect_delay, :healthcheck_path, :
|
31
|
+
attr_reader :logger, :adapter, :sniffing, :sniffer_delay, :resurrect_delay, :healthcheck_path, :sniffing_path, :bulk_path
|
32
32
|
|
33
33
|
ROOT_URI_PATH = '/'.freeze
|
34
34
|
|
35
35
|
DEFAULT_OPTIONS = {
|
36
36
|
:healthcheck_path => ROOT_URI_PATH,
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:absolute_sniffing_path => false,
|
37
|
+
:sniffing_path => "/_nodes/http",
|
38
|
+
:bulk_path => "/_bulk",
|
40
39
|
:scheme => 'http',
|
41
40
|
:resurrect_delay => 5,
|
42
41
|
:sniffing => false,
|
@@ -51,10 +50,9 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
51
50
|
raise ArgumentError, "No URL Normalizer specified!" unless options[:url_normalizer]
|
52
51
|
@url_normalizer = options[:url_normalizer]
|
53
52
|
DEFAULT_OPTIONS.merge(options).tap do |merged|
|
54
|
-
@
|
55
|
-
@absolute_healthcheck_path = merged[:absolute_healthcheck_path]
|
53
|
+
@bulk_path = merged[:bulk_path]
|
56
54
|
@sniffing_path = merged[:sniffing_path]
|
57
|
-
@
|
55
|
+
@healthcheck_path = merged[:healthcheck_path]
|
58
56
|
@resurrect_delay = merged[:resurrect_delay]
|
59
57
|
@sniffing = merged[:sniffing]
|
60
58
|
@sniffer_delay = merged[:sniffer_delay]
|
@@ -156,17 +154,9 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
156
154
|
ES2_SNIFF_RE_URL = /([^\/]*)?\/?([^:]*):([0-9]+)/
|
157
155
|
# Sniffs and returns the results. Does not update internal URLs!
|
158
156
|
def check_sniff
|
159
|
-
resp =
|
160
|
-
with_connection do |url|
|
161
|
-
sniffing_url = url.clone
|
162
|
-
sniffing_url.query = nil
|
163
|
-
if @absolute_sniffing_path
|
164
|
-
sniffing_url.path = ROOT_URI_PATH
|
165
|
-
end
|
166
|
-
resp = perform_request_to_url(sniffing_url, :get, @sniffing_path, {}, nil)
|
167
|
-
end
|
157
|
+
_, resp = perform_request(:get, @sniffing_path)
|
168
158
|
parsed = LogStash::Json.load(resp.body)
|
169
|
-
|
159
|
+
|
170
160
|
nodes = parsed['nodes']
|
171
161
|
if !nodes || nodes.empty?
|
172
162
|
@logger.warn("Sniff returned no nodes! Will not update hosts.")
|
@@ -242,17 +232,11 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
242
232
|
# Try to keep locking granularity low such that we don't affect IO...
|
243
233
|
@state_mutex.synchronize { @url_info.select {|url,meta| meta[:state] != :alive } }.each do |url,meta|
|
244
234
|
begin
|
245
|
-
path = healthcheck_path
|
246
|
-
healthcheck_url = LogStash::Util::SafeURI.new(url.uri.clone)
|
247
|
-
healthcheck_url.query = nil
|
248
|
-
if @absolute_healthcheck_path
|
249
|
-
healthcheck_url.path = ROOT_URI_PATH
|
250
|
-
end
|
251
235
|
logger.info("Running health check to see if an Elasticsearch connection is working",
|
252
|
-
:healthcheck_url =>
|
253
|
-
response = perform_request_to_url(
|
236
|
+
:healthcheck_url => url, :path => @healthcheck_path)
|
237
|
+
response = perform_request_to_url(url, :head, @healthcheck_path)
|
254
238
|
# If no exception was raised it must have succeeded!
|
255
|
-
logger.warn("Restored connection to ES instance", :url =>
|
239
|
+
logger.warn("Restored connection to ES instance", :url => url.sanitized)
|
256
240
|
@state_mutex.synchronize { meta[:state] = :alive }
|
257
241
|
rescue HostUnreachableError, BadResponseCodeError => e
|
258
242
|
logger.warn("Attempted to resurrect connection to dead ES instance, but got an error.", url: url.sanitized, error_type: e.class, error: e.message)
|
@@ -13,11 +13,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
13
13
|
|
14
14
|
common_options = {
|
15
15
|
:client_settings => client_settings,
|
16
|
-
:resurrect_delay => params["resurrect_delay"]
|
17
|
-
:healthcheck_path => params["healthcheck_path"],
|
18
|
-
:absolute_healthcheck_path => params["absolute_healthcheck_path"],
|
19
|
-
:sniffing_path => params["sniffing_path"],
|
20
|
-
:absolute_sniffing_path => params["absolute_sniffing_path"]
|
16
|
+
:resurrect_delay => params["resurrect_delay"]
|
21
17
|
}
|
22
18
|
|
23
19
|
if params["sniffing"]
|
@@ -28,7 +24,25 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
28
24
|
common_options[:timeout] = params["timeout"] if params["timeout"]
|
29
25
|
|
30
26
|
if params["path"]
|
31
|
-
client_settings[:path] = "/#{params["path"]}/"
|
27
|
+
client_settings[:path] = dedup_slashes("/#{params["path"]}/")
|
28
|
+
end
|
29
|
+
|
30
|
+
common_options[:bulk_path] = if params["bulk_path"]
|
31
|
+
dedup_slashes("/#{params["bulk_path"]}")
|
32
|
+
else
|
33
|
+
dedup_slashes("/#{params["path"]}/_bulk")
|
34
|
+
end
|
35
|
+
|
36
|
+
common_options[:sniffing_path] = if params["sniffing_path"]
|
37
|
+
dedup_slashes("/#{params["sniffing_path"]}")
|
38
|
+
else
|
39
|
+
dedup_slashes("/#{params["path"]}/_nodes/http")
|
40
|
+
end
|
41
|
+
|
42
|
+
common_options[:healthcheck_path] = if params["healthcheck_path"]
|
43
|
+
dedup_slashes("/#{params["healthcheck_path"]}")
|
44
|
+
else
|
45
|
+
dedup_slashes("/#{params["path"]}")
|
32
46
|
end
|
33
47
|
|
34
48
|
if params["parameters"]
|
@@ -79,9 +93,11 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
79
93
|
}
|
80
94
|
common_options.merge! update_options if params["action"] == 'update'
|
81
95
|
|
82
|
-
|
83
|
-
|
84
|
-
|
96
|
+
create_http_client(common_options.merge(:hosts => hosts, :logger => logger))
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.create_http_client(options)
|
100
|
+
LogStash::Outputs::ElasticSearch::HttpClient.new(options)
|
85
101
|
end
|
86
102
|
|
87
103
|
def self.setup_ssl(logger, params)
|
@@ -133,5 +149,10 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
133
149
|
:password => unsafe_escaped_password
|
134
150
|
}
|
135
151
|
end
|
152
|
+
|
153
|
+
private
|
154
|
+
def self.dedup_slashes(url)
|
155
|
+
url.gsub(/\/+/, "/")
|
156
|
+
end
|
136
157
|
end
|
137
158
|
end; end; end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-elasticsearch'
|
3
|
-
s.version = '
|
3
|
+
s.version = '7.0.0'
|
4
4
|
s.licenses = ['apache-2.0']
|
5
5
|
s.summary = "Logstash Output to 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"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "logstash/devutils/rspec/spec_helper"
|
1
2
|
require "logstash/outputs/elasticsearch"
|
2
3
|
require "logstash/outputs/elasticsearch/http_client"
|
3
4
|
require "logstash/outputs/elasticsearch/http_client_builder"
|
@@ -32,4 +33,161 @@ describe LogStash::Outputs::ElasticSearch::HttpClientBuilder do
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
36
|
+
|
37
|
+
describe "customizing action paths" do
|
38
|
+
let(:hosts) { [ ::LogStash::Util::SafeURI.new("http://localhost:9200") ] }
|
39
|
+
let(:options) { {"hosts" => hosts } }
|
40
|
+
let(:logger) { double("logger") }
|
41
|
+
before :each do
|
42
|
+
[:debug, :debug?, :info?, :info, :warn].each do |level|
|
43
|
+
allow(logger).to receive(level)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "healthcheck_path" do
|
48
|
+
|
49
|
+
context "when setting bulk_path" do
|
50
|
+
let(:bulk_path) { "/meh" }
|
51
|
+
let(:options) { super.merge("bulk_path" => bulk_path) }
|
52
|
+
|
53
|
+
context "when using path" do
|
54
|
+
let(:options) { super.merge("path" => "/path") }
|
55
|
+
it "ignores the path setting" do
|
56
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
57
|
+
expect(options[:bulk_path]).to eq(bulk_path)
|
58
|
+
end
|
59
|
+
described_class.build(logger, hosts, options)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
context "when not using path" do
|
63
|
+
|
64
|
+
it "uses the bulk_path setting" do
|
65
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
66
|
+
expect(options[:bulk_path]).to eq(bulk_path)
|
67
|
+
end
|
68
|
+
described_class.build(logger, hosts, options)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "when not setting bulk_path" do
|
74
|
+
|
75
|
+
context "when using path" do
|
76
|
+
let(:path) { "/meh" }
|
77
|
+
let(:options) { super.merge("path" => path) }
|
78
|
+
it "sets bulk_path to path+_bulk" do
|
79
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
80
|
+
expect(options[:bulk_path]).to eq("#{path}/_bulk")
|
81
|
+
end
|
82
|
+
described_class.build(logger, hosts, options)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when not using path" do
|
87
|
+
it "sets the bulk_path to _bulk" do
|
88
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
89
|
+
expect(options[:bulk_path]).to eq("/_bulk")
|
90
|
+
end
|
91
|
+
described_class.build(logger, hosts, options)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
describe "healthcheck_path" do
|
97
|
+
context "when setting healthcheck_path" do
|
98
|
+
let(:healthcheck_path) { "/meh" }
|
99
|
+
let(:options) { super.merge("healthcheck_path" => healthcheck_path) }
|
100
|
+
|
101
|
+
context "when using path" do
|
102
|
+
let(:options) { super.merge("path" => "/path") }
|
103
|
+
it "ignores the path setting" do
|
104
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
105
|
+
expect(options[:healthcheck_path]).to eq(healthcheck_path)
|
106
|
+
end
|
107
|
+
described_class.build(logger, hosts, options)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
context "when not using path" do
|
111
|
+
|
112
|
+
it "uses the healthcheck_path setting" do
|
113
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
114
|
+
expect(options[:healthcheck_path]).to eq(healthcheck_path)
|
115
|
+
end
|
116
|
+
described_class.build(logger, hosts, options)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "when not setting healthcheck_path" do
|
122
|
+
|
123
|
+
context "when using path" do
|
124
|
+
let(:path) { "/meh" }
|
125
|
+
let(:options) { super.merge("path" => path) }
|
126
|
+
it "sets healthcheck_path to path" do
|
127
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
128
|
+
expect(options[:healthcheck_path]).to eq(path)
|
129
|
+
end
|
130
|
+
described_class.build(logger, hosts, options)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context "when not using path" do
|
135
|
+
it "sets the healthcheck_path to root" do
|
136
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
137
|
+
expect(options[:healthcheck_path]).to eq("/")
|
138
|
+
end
|
139
|
+
described_class.build(logger, hosts, options)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
describe "sniffing_path" do
|
145
|
+
context "when setting sniffing_path" do
|
146
|
+
let(:sniffing_path) { "/meh" }
|
147
|
+
let(:options) { super.merge("sniffing_path" => sniffing_path) }
|
148
|
+
|
149
|
+
context "when using path" do
|
150
|
+
let(:options) { super.merge("path" => "/path") }
|
151
|
+
it "ignores the path setting" do
|
152
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
153
|
+
expect(options[:sniffing_path]).to eq(sniffing_path)
|
154
|
+
end
|
155
|
+
described_class.build(logger, hosts, options)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
context "when not using path" do
|
159
|
+
|
160
|
+
it "uses the sniffing_path setting" do
|
161
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
162
|
+
expect(options[:sniffing_path]).to eq(sniffing_path)
|
163
|
+
end
|
164
|
+
described_class.build(logger, hosts, options)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "when not setting sniffing_path" do
|
170
|
+
|
171
|
+
context "when using path" do
|
172
|
+
let(:path) { "/meh" }
|
173
|
+
let(:options) { super.merge("path" => path) }
|
174
|
+
it "sets sniffing_path to path+_nodes/http" do
|
175
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
176
|
+
expect(options[:sniffing_path]).to eq("#{path}/_nodes/http")
|
177
|
+
end
|
178
|
+
described_class.build(logger, hosts, options)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context "when not using path" do
|
183
|
+
it "sets the sniffing_path to _nodes/http" do
|
184
|
+
expect(described_class).to receive(:create_http_client) do |options|
|
185
|
+
expect(options[:sniffing_path]).to eq("/_nodes/http")
|
186
|
+
end
|
187
|
+
described_class.build(logger, hosts, options)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
35
193
|
end
|
@@ -45,46 +45,29 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe "healthcheck url handling" do
|
48
|
-
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
let(:options) { super.merge(:absolute_healthcheck_path => absolute_healthcheck_path, :path => path, :healthcheck_path => healthcheck_path) }
|
53
|
-
|
54
|
-
context "when using query params in the initial url" do
|
55
|
-
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200?q=s")] }
|
56
|
-
it "is removed from the healthcheck request" do
|
48
|
+
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200")] }
|
49
|
+
|
50
|
+
context "and not setting healthcheck_path" do
|
51
|
+
it "performs the healthcheck to the root" do
|
57
52
|
expect(adapter).to receive(:perform_request) do |url, method, req_path, _, _|
|
58
53
|
expect(method).to eq(:head)
|
59
|
-
expect(url.
|
54
|
+
expect(url.path).to be_empty
|
55
|
+
expect(req_path).to eq("/")
|
60
56
|
end
|
61
57
|
subject.healthcheck!
|
62
58
|
end
|
63
59
|
end
|
64
60
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
subject.healthcheck!
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "when disabled" do
|
79
|
-
let(:absolute_healthcheck_path) { false }
|
80
|
-
it "should use the healthcheck_path as a relative path" do
|
81
|
-
expect(adapter).to receive(:perform_request) do |url, method, req_path, _, _|
|
82
|
-
expect(method).to eq(:head)
|
83
|
-
expect(req_path).to eq(healthcheck_path)
|
84
|
-
expect(url.path).to eq(path)
|
85
|
-
end
|
86
|
-
subject.healthcheck!
|
61
|
+
context "and setting healthcheck_path" do
|
62
|
+
let(:healthcheck_path) { "/my/health" }
|
63
|
+
let(:options) { super.merge(:healthcheck_path => healthcheck_path) }
|
64
|
+
it "performs the healthcheck to the healthcheck_path" do
|
65
|
+
expect(adapter).to receive(:perform_request) do |url, method, req_path, _, _|
|
66
|
+
expect(method).to eq(:head)
|
67
|
+
expect(url.path).to be_empty
|
68
|
+
expect(req_path).to eq(healthcheck_path)
|
87
69
|
end
|
70
|
+
subject.healthcheck!
|
88
71
|
end
|
89
72
|
end
|
90
73
|
end
|
@@ -102,42 +85,6 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
|
|
102
85
|
expect(subject.sniffer_alive?).to eql(true)
|
103
86
|
end
|
104
87
|
end
|
105
|
-
describe "absolute_sniffing_path" do
|
106
|
-
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200#{path}")] }
|
107
|
-
let(:path) { "/meh" }
|
108
|
-
let(:options) { super.merge(:absolute_sniffing_path => absolute_sniffing_path, :path => path, :sniffing_path => sniffing_path) }
|
109
|
-
let(:sniffing_path) { "/some/other/path" }
|
110
|
-
let(:absolute_sniffing_path) { false }
|
111
|
-
let(:response) { double("manticore_response") }
|
112
|
-
|
113
|
-
before(:each) { allow(response).to receive(:body).and_return("{}") }
|
114
|
-
|
115
|
-
context "when enabled" do
|
116
|
-
let(:absolute_sniffing_path) { true }
|
117
|
-
it "should use the sniffing_path as the absolute path" do
|
118
|
-
expect(subject).to receive(:perform_request_to_url) do |url, method, req_path, _, _|
|
119
|
-
expect(method).to eq(:get)
|
120
|
-
expect(req_path).to eq(sniffing_path)
|
121
|
-
expect(url.path).to eq("/")
|
122
|
-
response
|
123
|
-
end
|
124
|
-
subject.check_sniff
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
context "when disabled" do
|
129
|
-
let(:absolute_sniffing_path) { false }
|
130
|
-
it "should use the sniffing_path as a relative path" do
|
131
|
-
expect(subject).to receive(:perform_request_to_url) do |url, method, req_path, _, _|
|
132
|
-
expect(method).to eq(:get)
|
133
|
-
expect(req_path).to eq(sniffing_path)
|
134
|
-
expect(url.path).to eq(path)
|
135
|
-
response
|
136
|
-
end
|
137
|
-
subject.check_sniff
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
88
|
end
|
142
89
|
|
143
90
|
describe "closing" do
|
metadata
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - ">="
|
18
17
|
- !ruby/object:Gem::Version
|
@@ -20,7 +19,10 @@ dependencies:
|
|
20
19
|
- - "~>"
|
21
20
|
- !ruby/object:Gem::Version
|
22
21
|
version: '0.0'
|
23
|
-
|
22
|
+
name: stud
|
23
|
+
prerelease: false
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
@@ -28,25 +30,22 @@ dependencies:
|
|
28
30
|
- - "~>"
|
29
31
|
- !ruby/object:Gem::Version
|
30
32
|
version: '0.0'
|
31
|
-
prerelease: false
|
32
|
-
type: :runtime
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
|
35
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
36
35
|
requirements:
|
37
36
|
- - "~>"
|
38
37
|
- !ruby/object:Gem::Version
|
39
38
|
version: '0.6'
|
40
|
-
|
39
|
+
name: cabin
|
40
|
+
prerelease: false
|
41
|
+
type: :runtime
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
43
|
requirements:
|
42
44
|
- - "~>"
|
43
45
|
- !ruby/object:Gem::Version
|
44
46
|
version: '0.6'
|
45
|
-
prerelease: false
|
46
|
-
type: :runtime
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
50
49
|
requirements:
|
51
50
|
- - ">="
|
52
51
|
- !ruby/object:Gem::Version
|
@@ -54,7 +53,10 @@ dependencies:
|
|
54
53
|
- - "<="
|
55
54
|
- !ruby/object:Gem::Version
|
56
55
|
version: '2.99'
|
57
|
-
|
56
|
+
name: logstash-core-plugin-api
|
57
|
+
prerelease: false
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
60
|
requirements:
|
59
61
|
- - ">="
|
60
62
|
- !ruby/object:Gem::Version
|
@@ -62,74 +64,63 @@ dependencies:
|
|
62
64
|
- - "<="
|
63
65
|
- !ruby/object:Gem::Version
|
64
66
|
version: '2.99'
|
65
|
-
prerelease: false
|
66
|
-
type: :runtime
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
name: ftw
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - "~>"
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: 0.0.42
|
74
68
|
requirement: !ruby/object:Gem::Requirement
|
75
69
|
requirements:
|
76
70
|
- - "~>"
|
77
71
|
- !ruby/object:Gem::Version
|
78
72
|
version: 0.0.42
|
73
|
+
name: ftw
|
79
74
|
prerelease: false
|
80
75
|
type: :development
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: addressable
|
83
76
|
version_requirements: !ruby/object:Gem::Requirement
|
84
77
|
requirements:
|
85
78
|
- - "~>"
|
86
79
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
80
|
+
version: 0.0.42
|
81
|
+
- !ruby/object:Gem::Dependency
|
88
82
|
requirement: !ruby/object:Gem::Requirement
|
89
83
|
requirements:
|
90
84
|
- - "~>"
|
91
85
|
- !ruby/object:Gem::Version
|
92
86
|
version: 2.3.0
|
87
|
+
name: addressable
|
93
88
|
prerelease: false
|
94
89
|
type: :development
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: logstash-codec-plain
|
97
90
|
version_requirements: !ruby/object:Gem::Requirement
|
98
91
|
requirements:
|
99
|
-
- - "
|
92
|
+
- - "~>"
|
100
93
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
94
|
+
version: 2.3.0
|
95
|
+
- !ruby/object:Gem::Dependency
|
102
96
|
requirement: !ruby/object:Gem::Requirement
|
103
97
|
requirements:
|
104
98
|
- - ">="
|
105
99
|
- !ruby/object:Gem::Version
|
106
100
|
version: '0'
|
101
|
+
name: logstash-codec-plain
|
107
102
|
prerelease: false
|
108
103
|
type: :development
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
name: json
|
111
104
|
version_requirements: !ruby/object:Gem::Requirement
|
112
105
|
requirements:
|
113
106
|
- - ">="
|
114
107
|
- !ruby/object:Gem::Version
|
115
108
|
version: '0'
|
109
|
+
- !ruby/object:Gem::Dependency
|
116
110
|
requirement: !ruby/object:Gem::Requirement
|
117
111
|
requirements:
|
118
112
|
- - ">="
|
119
113
|
- !ruby/object:Gem::Version
|
120
114
|
version: '0'
|
115
|
+
name: json
|
121
116
|
prerelease: false
|
122
117
|
type: :development
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
name: manticore
|
125
118
|
version_requirements: !ruby/object:Gem::Requirement
|
126
119
|
requirements:
|
127
120
|
- - ">="
|
128
121
|
- !ruby/object:Gem::Version
|
129
|
-
version: 0
|
130
|
-
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
version: 1.0.0
|
122
|
+
version: '0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
133
124
|
requirement: !ruby/object:Gem::Requirement
|
134
125
|
requirements:
|
135
126
|
- - ">="
|
@@ -138,50 +129,59 @@ dependencies:
|
|
138
129
|
- - "<"
|
139
130
|
- !ruby/object:Gem::Version
|
140
131
|
version: 1.0.0
|
132
|
+
name: manticore
|
141
133
|
prerelease: false
|
142
134
|
type: :runtime
|
143
|
-
- !ruby/object:Gem::Dependency
|
144
|
-
name: logstash-devutils
|
145
135
|
version_requirements: !ruby/object:Gem::Requirement
|
146
136
|
requirements:
|
147
137
|
- - ">="
|
148
138
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
139
|
+
version: 0.5.4
|
140
|
+
- - "<"
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 1.0.0
|
143
|
+
- !ruby/object:Gem::Dependency
|
150
144
|
requirement: !ruby/object:Gem::Requirement
|
151
145
|
requirements:
|
152
146
|
- - ">="
|
153
147
|
- !ruby/object:Gem::Version
|
154
148
|
version: '0'
|
149
|
+
name: logstash-devutils
|
155
150
|
prerelease: false
|
156
151
|
type: :development
|
157
|
-
- !ruby/object:Gem::Dependency
|
158
|
-
name: flores
|
159
152
|
version_requirements: !ruby/object:Gem::Requirement
|
160
153
|
requirements:
|
161
154
|
- - ">="
|
162
155
|
- !ruby/object:Gem::Version
|
163
156
|
version: '0'
|
157
|
+
- !ruby/object:Gem::Dependency
|
164
158
|
requirement: !ruby/object:Gem::Requirement
|
165
159
|
requirements:
|
166
160
|
- - ">="
|
167
161
|
- !ruby/object:Gem::Version
|
168
162
|
version: '0'
|
163
|
+
name: flores
|
169
164
|
prerelease: false
|
170
165
|
type: :development
|
171
|
-
- !ruby/object:Gem::Dependency
|
172
|
-
name: elasticsearch
|
173
166
|
version_requirements: !ruby/object:Gem::Requirement
|
174
167
|
requirements:
|
175
168
|
- - ">="
|
176
169
|
- !ruby/object:Gem::Version
|
177
170
|
version: '0'
|
171
|
+
- !ruby/object:Gem::Dependency
|
178
172
|
requirement: !ruby/object:Gem::Requirement
|
179
173
|
requirements:
|
180
174
|
- - ">="
|
181
175
|
- !ruby/object:Gem::Version
|
182
176
|
version: '0'
|
177
|
+
name: elasticsearch
|
183
178
|
prerelease: false
|
184
179
|
type: :development
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
185
|
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
|
186
186
|
email: info@elastic.co
|
187
187
|
executables: []
|