logstash-output-elasticsearch 5.1.1-java → 5.1.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/logstash/outputs/elasticsearch/common.rb +2 -1
- data/lib/logstash/outputs/elasticsearch/elasticsearch-template-es2x.json +1 -1
- data/lib/logstash/outputs/elasticsearch/elasticsearch-template-es5x.json +4 -3
- data/lib/logstash/outputs/elasticsearch/http_client.rb +2 -1
- data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +8 -5
- data/logstash-output-elasticsearch.gemspec +1 -2
- data/spec/es_spec_helper.rb +1 -62
- data/spec/integration/outputs/templates_5x_spec.rb +8 -2
- data/spec/integration/outputs/templates_spec.rb +7 -1
- data/spec/unit/outputs/elasticsearch/template_manager_spec.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d467502b3717a7e37fb897d6efc9fb690d03f045
|
4
|
+
data.tar.gz: 3f73d6fa34b9bc65bce91210bf45dd3fb2e935c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7daa79d6457e3fe835cad7603a84016ef1964b4d836fbe766139c3a6a2a0438af0c31c11ca8861150198fb7cec2d362028fe3b379e271d9db7ef3f5d7e2d6ab7
|
7
|
+
data.tar.gz: fae281ebd446f93f4cdbf9785143cfa0d3294d9b9b67d17098b60f8139f4903f0abeddb379e2e25e6406335e8e33291148d3d76e58b91da58581b91503f9a511
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 5.1.2
|
2
|
+
- Hide credentials in exceptions and log messages ([#482](https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/482))
|
3
|
+
- [internal] Remove dependency on longshoreman project
|
4
|
+
|
1
5
|
## 5.1.1
|
2
6
|
- Hide user and password from the URL logged during sniffing process.
|
3
7
|
|
@@ -208,7 +208,8 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
208
208
|
retry unless @stopping.true?
|
209
209
|
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
210
210
|
if RETRYABLE_CODES.include?(e.response_code)
|
211
|
-
|
211
|
+
safe_url = ::LogStash::Outputs::ElasticSearch::SafeURL.without_credentials(e.url)
|
212
|
+
log_hash = {:code => e.response_code, :url => safe_url}
|
212
213
|
log_hash[:body] = e.body if @logger.debug? # Generally this is too verbose
|
213
214
|
@logger.error("Attempted to send a bulk request to elasticsearch but received a bad HTTP response code!", log_hash)
|
214
215
|
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"_all" : {"enabled" : true, "omit_norms" : true},
|
9
9
|
"dynamic_templates" : [ {
|
10
10
|
"message_field" : {
|
11
|
-
"
|
11
|
+
"path_match" : "message",
|
12
12
|
"match_mapping_type" : "string",
|
13
13
|
"mapping" : {
|
14
14
|
"type" : "string", "index" : "analyzed", "omit_norms" : true,
|
@@ -1,5 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"template" : "logstash-*",
|
3
|
+
"version" : 50001,
|
3
4
|
"settings" : {
|
4
5
|
"index.refresh_interval" : "5s"
|
5
6
|
},
|
@@ -8,11 +9,11 @@
|
|
8
9
|
"_all" : {"enabled" : true, "norms" : false},
|
9
10
|
"dynamic_templates" : [ {
|
10
11
|
"message_field" : {
|
11
|
-
"
|
12
|
+
"path_match" : "message",
|
12
13
|
"match_mapping_type" : "string",
|
13
14
|
"mapping" : {
|
14
|
-
"type" : "
|
15
|
-
"
|
15
|
+
"type" : "text",
|
16
|
+
"norms" : false
|
16
17
|
}
|
17
18
|
}
|
18
19
|
}, {
|
@@ -184,7 +184,8 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
184
184
|
end
|
185
185
|
|
186
186
|
if path && url.path && url.path != "/" && url.path != ''
|
187
|
-
|
187
|
+
safe_url = ::LogStash::Outputs::ElasticSearch::SafeURL.without_credentials(url)
|
188
|
+
raise LogStash::ConfigurationError, "A path '#{url.path}' has been explicitly specified in the url '#{safe_url}', but you also specified a path of '#{path}'. This is probably a mistake, please remove one setting."
|
188
189
|
end
|
189
190
|
|
190
191
|
if path
|
@@ -194,14 +194,16 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
194
194
|
def resurrect_dead!
|
195
195
|
# Try to keep locking granularity low such that we don't affect IO...
|
196
196
|
@state_mutex.synchronize { @url_info.select {|url,meta| meta[:dead] } }.each do |url,meta|
|
197
|
+
safe_url = ::LogStash::Outputs::ElasticSearch::SafeURL.without_credentials(url)
|
197
198
|
begin
|
198
|
-
|
199
|
+
logger.info("Running health check to see if an Elasticsearch connection is working",
|
200
|
+
url: safe_url, healthcheck_path: @healthcheck_path)
|
199
201
|
perform_request_to_url(url, "HEAD", @healthcheck_path)
|
200
202
|
# If no exception was raised it must have succeeded!
|
201
|
-
logger.warn("
|
203
|
+
logger.warn("Restored connection to ES instance", :url => safe_url)
|
202
204
|
@state_mutex.synchronize { meta[:dead] = false }
|
203
205
|
rescue HostUnreachableError => e
|
204
|
-
logger.debug("Attempted to resurrect connection to dead ES instance
|
206
|
+
logger.debug("Attempted to resurrect connection to dead ES instance, but got an error.", url: safe_url, error_type: e.class, error: e.message)
|
205
207
|
end
|
206
208
|
end
|
207
209
|
end
|
@@ -325,8 +327,9 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
325
327
|
# In case a sniff happened removing the metadata just before there's nothing to mark
|
326
328
|
# This is an extreme edge case, but it can happen!
|
327
329
|
return unless meta
|
328
|
-
|
329
|
-
|
330
|
+
safe_url = ::LogStash::Outputs::ElasticSearch::SafeURL.without_credentials(url)
|
331
|
+
logger.warn("Marking url as dead.", :reason => error.message, :url => safe_url,
|
332
|
+
:error_message => error.message, :error_class => error.class.name)
|
330
333
|
meta[:dead] = true
|
331
334
|
meta[:last_error] = error
|
332
335
|
meta[:last_errored_at] = Time.now
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-output-elasticsearch'
|
4
|
-
s.version = '5.1.
|
4
|
+
s.version = '5.1.2'
|
5
5
|
s.licenses = ['apache-2.0']
|
6
6
|
s.summary = "Logstash Output to Elasticsearch"
|
7
7
|
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"
|
@@ -31,7 +31,6 @@ Gem::Specification.new do |s|
|
|
31
31
|
end
|
32
32
|
|
33
33
|
s.add_development_dependency 'logstash-devutils'
|
34
|
-
s.add_development_dependency 'longshoreman'
|
35
34
|
s.add_development_dependency 'flores'
|
36
35
|
# Still used in some specs, we should remove this ASAP
|
37
36
|
s.add_development_dependency 'elasticsearch'
|
data/spec/es_spec_helper.rb
CHANGED
@@ -1,30 +1,10 @@
|
|
1
1
|
require "logstash/devutils/rspec/spec_helper"
|
2
2
|
require "ftw"
|
3
|
-
require "logstash/plugin"
|
4
|
-
require "logstash/json"
|
5
|
-
require "stud/try"
|
6
|
-
require "longshoreman"
|
7
|
-
require "logstash/outputs/elasticsearch"
|
8
3
|
require 'elasticsearch'
|
9
4
|
|
10
|
-
CONTAINER_NAME = "logstash-output-elasticsearch-#{rand(999).to_s}"
|
11
|
-
CONTAINER_IMAGE = "elasticsearch"
|
12
|
-
CONTAINER_TAG = "2.0"
|
13
|
-
|
14
|
-
DOCKER_INTEGRATION = ENV["DOCKER_INTEGRATION"]
|
15
|
-
|
16
5
|
module ESHelper
|
17
6
|
def get_host_port
|
18
|
-
|
19
|
-
"#{addr}:#{get_port}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def get_port
|
23
|
-
return 9200 unless DOCKER_INTEGRATION
|
24
|
-
|
25
|
-
container = Longshoreman::Container.new
|
26
|
-
container.get(CONTAINER_NAME)
|
27
|
-
container.rport(9200)
|
7
|
+
"127.0.0.1:9200"
|
28
8
|
end
|
29
9
|
|
30
10
|
def get_client
|
@@ -32,47 +12,6 @@ module ESHelper
|
|
32
12
|
end
|
33
13
|
end
|
34
14
|
|
35
|
-
|
36
15
|
RSpec.configure do |config|
|
37
16
|
config.include ESHelper
|
38
|
-
|
39
|
-
if DOCKER_INTEGRATION
|
40
|
-
# this :all hook gets run before every describe block that is tagged with :integration => true.
|
41
|
-
config.before(:all, :integration => true) do
|
42
|
-
|
43
|
-
|
44
|
-
# check if container exists already before creating new one.
|
45
|
-
begin
|
46
|
-
ls = Longshoreman::new
|
47
|
-
ls.container.get(CONTAINER_NAME)
|
48
|
-
rescue Docker::Error::NotFoundError
|
49
|
-
scriptDir = File.expand_path File.dirname(__FILE__) + '/fixtures/scripts'
|
50
|
-
Longshoreman.new("#{CONTAINER_IMAGE}:#{CONTAINER_TAG}", CONTAINER_NAME, {
|
51
|
-
'Cmd' => [ "-Des.script.inline=on", "-Des.script.indexed=on" ],
|
52
|
-
'HostConfig' => {
|
53
|
-
'Binds' => ["#{scriptDir}:/usr/share/elasticsearch/config/scripts"],
|
54
|
-
'PublishAllPorts' => true
|
55
|
-
}
|
56
|
-
})
|
57
|
-
# TODO(talevy): verify ES is running instead of static timeout
|
58
|
-
sleep 10
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# we want to do a final cleanup after all :integration runs,
|
63
|
-
# but we don't want to clean up before the last block.
|
64
|
-
# This is a final blind check to see if the ES docker container is running and
|
65
|
-
# needs to be cleaned up. If no container can be found and/or docker is not
|
66
|
-
# running on the system, we do nothing.
|
67
|
-
config.after(:suite) do
|
68
|
-
# only cleanup docker container if system has docker and the container is running
|
69
|
-
begin
|
70
|
-
ls = Longshoreman::new
|
71
|
-
ls.container.get(CONTAINER_NAME)
|
72
|
-
ls.cleanup
|
73
|
-
rescue Docker::Error::NotFoundError, Excon::Errors::SocketError
|
74
|
-
# do nothing
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
17
|
end
|
@@ -27,6 +27,7 @@ describe "index template expected behavior for 5.x", :integration => true, :vers
|
|
27
27
|
|
28
28
|
subject.multi_receive([
|
29
29
|
LogStash::Event.new("message" => "sample message here"),
|
30
|
+
LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
|
30
31
|
LogStash::Event.new("somevalue" => 100),
|
31
32
|
LogStash::Event.new("somevalue" => 10),
|
32
33
|
LogStash::Event.new("somevalue" => 1),
|
@@ -40,7 +41,7 @@ describe "index template expected behavior for 5.x", :integration => true, :vers
|
|
40
41
|
# Wait or fail until everything's indexed.
|
41
42
|
Stud::try(20.times) do
|
42
43
|
r = @es.search
|
43
|
-
insist { r["hits"]["total"] } ==
|
44
|
+
insist { r["hits"]["total"] } == 8
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
@@ -60,11 +61,16 @@ describe "index template expected behavior for 5.x", :integration => true, :vers
|
|
60
61
|
reject { values }.include?(1)
|
61
62
|
end
|
62
63
|
|
63
|
-
it "does not create .keyword field for
|
64
|
+
it "does not create .keyword field for top-level message field" do
|
64
65
|
results = @es.search(:q => "message.keyword:\"sample message here\"")
|
65
66
|
insist { results["hits"]["total"] } == 0
|
66
67
|
end
|
67
68
|
|
69
|
+
it "creates .keyword field for nested message fields" do
|
70
|
+
results = @es.search(:q => "somemessage.message.keyword:\"sample nested message here\"")
|
71
|
+
insist { results["hits"]["total"] } == 1
|
72
|
+
end
|
73
|
+
|
68
74
|
it "creates .keyword field from any string field which is not_analyzed" do
|
69
75
|
results = @es.search(:q => "country.keyword:\"us\"")
|
70
76
|
insist { results["hits"]["total"] } == 1
|
@@ -26,6 +26,7 @@ describe "index template expected behavior", :integration => true, :version_less
|
|
26
26
|
|
27
27
|
subject.multi_receive([
|
28
28
|
LogStash::Event.new("message" => "sample message here"),
|
29
|
+
LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
|
29
30
|
LogStash::Event.new("somevalue" => 100),
|
30
31
|
LogStash::Event.new("somevalue" => 10),
|
31
32
|
LogStash::Event.new("somevalue" => 1),
|
@@ -39,7 +40,7 @@ describe "index template expected behavior", :integration => true, :version_less
|
|
39
40
|
# Wait or fail until everything's indexed.
|
40
41
|
Stud::try(20.times) do
|
41
42
|
r = @es.search
|
42
|
-
insist { r["hits"]["total"] } ==
|
43
|
+
insist { r["hits"]["total"] } == 8
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
@@ -64,6 +65,11 @@ describe "index template expected behavior", :integration => true, :version_less
|
|
64
65
|
insist { results["hits"]["total"] } == 0
|
65
66
|
end
|
66
67
|
|
68
|
+
it "creates .raw field for nested message fields" do
|
69
|
+
results = @es.search(:q => "somemessage.message.raw:\"sample nested message here\"")
|
70
|
+
insist { results["hits"]["total"] } == 1
|
71
|
+
end
|
72
|
+
|
67
73
|
it "creates .raw field from any string field which is not_analyzed" do
|
68
74
|
results = @es.search(:q => "country.raw:\"us\"")
|
69
75
|
insist { results["hits"]["total"] } == 1
|
@@ -48,7 +48,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
context "elasticsearch 5.x" do
|
51
|
-
it "chooses the
|
51
|
+
it "chooses the 5x template" do
|
52
52
|
expect(described_class.default_template_path("5")).to match(/elasticsearch-template-es5x.json/)
|
53
53
|
end
|
54
54
|
end
|
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: 5.1.
|
4
|
+
version: 5.1.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,20 +126,6 @@ dependencies:
|
|
126
126
|
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
|
-
- !ruby/object:Gem::Dependency
|
130
|
-
requirement: !ruby/object:Gem::Requirement
|
131
|
-
requirements:
|
132
|
-
- - ">="
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version: '0'
|
135
|
-
name: longshoreman
|
136
|
-
prerelease: false
|
137
|
-
type: :development
|
138
|
-
version_requirements: !ruby/object:Gem::Requirement
|
139
|
-
requirements:
|
140
|
-
- - ">="
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
version: '0'
|
143
129
|
- !ruby/object:Gem::Dependency
|
144
130
|
requirement: !ruby/object:Gem::Requirement
|
145
131
|
requirements:
|