logstash-output-elasticsearch 5.1.1-java → 5.1.2-java
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|