logstash-input-elasticsearch 4.9.0 → 4.10.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 +16 -0
- data/README.md +1 -1
- data/docs/index.asciidoc +48 -25
- data/lib/logstash/inputs/elasticsearch.rb +47 -35
- data/lib/logstash/inputs/{patch.rb → elasticsearch/patches/_elasticsearch_transport_connections_selector.rb} +9 -6
- data/lib/logstash/inputs/elasticsearch/patches/_elasticsearch_transport_http_manticore.rb +33 -0
- data/logstash-input-elasticsearch.gemspec +8 -8
- data/spec/es_helper.rb +17 -16
- data/spec/fixtures/test_certs/ca.crt +20 -0
- data/spec/fixtures/test_certs/ca.key +27 -0
- data/spec/fixtures/test_certs/client/ls.crt +20 -0
- data/spec/fixtures/test_certs/client/ls.key +27 -0
- data/spec/fixtures/test_certs/es.crt +20 -0
- data/spec/fixtures/test_certs/es.key +27 -0
- data/spec/inputs/elasticsearch_spec.rb +153 -132
- data/spec/inputs/integration/elasticsearch_spec.rb +24 -12
- metadata +65 -61
- data/spec/fixtures/test_certs/ca/ca.crt +0 -32
- data/spec/fixtures/test_certs/ca/ca.key +0 -51
- data/spec/fixtures/test_certs/test.crt +0 -36
- data/spec/fixtures/test_certs/test.key +0 -51
data/spec/es_helper.rb
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
module ESHelper
|
2
2
|
def self.get_host_port
|
3
|
-
|
4
|
-
|
3
|
+
if ENV["INTEGRATION"] == "true" || ENV["SECURE_INTEGRATION"] == "true"
|
4
|
+
"elasticsearch:9200"
|
5
|
+
else
|
6
|
+
"localhost:9200" # for local running integration specs outside docker
|
7
|
+
end
|
5
8
|
end
|
6
9
|
|
7
|
-
def self.get_client(options
|
8
|
-
|
9
|
-
|
10
|
+
def self.get_client(options)
|
11
|
+
require 'elasticsearch/transport/transport/http/faraday' # supports user/password options
|
12
|
+
host, port = get_host_port.split(':')
|
13
|
+
host_opts = { host: host, port: port, scheme: 'http' }
|
14
|
+
ssl_opts = {}
|
10
15
|
|
11
16
|
if options[:ca_file]
|
12
|
-
|
13
|
-
|
14
|
-
host, port = h.split(":")
|
15
|
-
{ :host => host, :scheme => 'https', :port => port }
|
16
|
-
end
|
17
|
+
ssl_opts = { ca_file: options[:ca_file], version: 'TLSv1.2', verify: false }
|
18
|
+
host_opts[:scheme] = 'https'
|
17
19
|
end
|
18
20
|
|
19
|
-
transport_options = {}
|
20
|
-
|
21
21
|
if options[:user] && options[:password]
|
22
|
-
|
23
|
-
|
22
|
+
host_opts[:user] = options[:user]
|
23
|
+
host_opts[:password] = options[:password]
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
Elasticsearch::Client.new(hosts: [host_opts],
|
27
|
+
transport_options: { ssl: ssl_opts },
|
28
|
+
transport_class: Elasticsearch::Transport::Transport::HTTP::Faraday)
|
28
29
|
end
|
29
30
|
|
30
31
|
def self.doc_type
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDSTCCAjGgAwIBAgIUUcAg9c8B8jiliCkOEJyqoAHrmccwDQYJKoZIhvcNAQEL
|
3
|
+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
|
4
|
+
cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNDU1WhcNMjQwODExMDUxNDU1WjA0MTIwMAYD
|
5
|
+
VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
|
6
|
+
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1HuusRuGNsztd4EQvqwcMr
|
7
|
+
8XvnNNaalerpMOorCGySEFrNf0HxDIVMGMCrOv1F8SvlcGq3XANs2MJ4F2xhhLZr
|
8
|
+
PpqVHx+QnSZ66lu5R89QVSuMh/dCMxhNBlOA/dDlvy+EJBl9H791UGy/ChhSgaBd
|
9
|
+
OKVyGkhjErRTeMIq7rR7UG6GL/fV+JGy41UiLrm1KQP7/XVD9UzZfGq/hylFkTPe
|
10
|
+
oox5BUxdxUdDZ2creOID+agtIYuJVIkelKPQ+ljBY3kWBRexqJQsvyNUs1gZpjpz
|
11
|
+
YUCzuVcXDRuJXYQXGqWXhsBPfJv+ZcSyMIBUfWT/G13cWU1iwufPy0NjajowPZsC
|
12
|
+
AwEAAaNTMFEwHQYDVR0OBBYEFMgkye5+2l+TE0I6RsXRHjGBwpBGMB8GA1UdIwQY
|
13
|
+
MBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
|
14
|
+
hvcNAQELBQADggEBAIgtJW8sy5lBpzPRHkmWSS/SCZIPsABW+cHqQ3e0udrI3CLB
|
15
|
+
G9n7yqAPWOBTbdqC2GM8dvAS/Twx4Bub/lWr84dFCu+t0mQq4l5kpJMVRS0KKXPL
|
16
|
+
DwJbUN3oPNYy4uPn5Xi+XY3BYFce5vwJUsqIxeAbIOxVTNx++k5DFnB0ESAM23QL
|
17
|
+
sgUZl7xl3/DkdO4oHj30gmTRW9bjCJ6umnHIiO3JoJatrprurUIt80vHC4Ndft36
|
18
|
+
NBQ9mZpequ4RYjpSZNLcVsxyFAYwEY4g8MvH0MoMo2RRLfehmMCzXnI/Wh2qEyYz
|
19
|
+
emHprBii/5y1HieKXlX9CZRb5qEPHckDVXW3znw=
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEowIBAAKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
|
3
|
+
QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
|
4
|
+
90IzGE0GU4D90OW/L4QkGX0fv3VQbL8KGFKBoF04pXIaSGMStFN4wirutHtQboYv
|
5
|
+
99X4kbLjVSIuubUpA/v9dUP1TNl8ar+HKUWRM96ijHkFTF3FR0NnZyt44gP5qC0h
|
6
|
+
i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
|
7
|
+
m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABAoIBABmBC0P6Ebegljkk
|
8
|
+
lO26GdbOKvbfqulDS3mN5QMyXkUMopea03YzMnKUJriE+2O33a1mUcuDPWnLpYPK
|
9
|
+
BTiQieYHlulNtY0Bzf+R69igRq9+1WpZftGnzrlu7NVxkOokRqWJv3546ilV7QZ0
|
10
|
+
f9ngmu+tiN7hEnlBC8m613VMuGGb3czwbCizEVZxlZX0Dk2GExbH7Yf3NNs/aOP/
|
11
|
+
8x6CqgL+rhrtOQ80xwRrOlEF8oSSjXCzypa3nFv21YO3J2lVo4BoIwnHgOzyz46A
|
12
|
+
b37gekqXXajIYQ0HAB+NDgVoCRFFJ7Xe16mgB3DpyUpUJzwiMedJkeQ0TprIownQ
|
13
|
+
+1mPe9ECgYEA/K4jc0trr3sk8KtcZjOYdpvwrhEqSSGEPeGfFujZaKOb8PZ8PX6j
|
14
|
+
MbCTV12nEgm8FEhZQ3azxLnO17gbJ2A+Ksm/IIwnTWlqvvMZD5qTQ7L3qZuCtbWQ
|
15
|
+
+EGC/H1SDjhiwvjHcXP61/tYL/peApBSoj0L4kC+U/VaNyvicudKk08CgYEAr46J
|
16
|
+
4VJBJfZ4ZaUBRy53+fy+mknOfaj2wo8MnD3u+/x4YWTapqvDOPN2nJVtKlIsxbS4
|
17
|
+
qCO+fzUV17YHlsQmGULNbtFuXWJkP/RcLVbe8VYg/6tmk0dJwNAe90flagX2KJov
|
18
|
+
8eDX129nNpuUqrNNWsfeLmPmH6vUzpKlga+1zfUCgYBrbUHHJ96dmbZn2AMNtIvy
|
19
|
+
iXP3HXcj5msJwB3aKJ8eHMkU1kaWAnwxiQfrkfaQ9bCP0v6YbyQY1IJ7NlvdDs7/
|
20
|
+
dAydMtkW0WW/zyztdGN92d3vrx0QUiRTV87vt/wl7ZUXnZt1wcB5CPRCWaiUYHWx
|
21
|
+
YlDmHW6N1XdIk5DQF0OegwKBgEt7S8k3Zo9+A5IgegYy8p7njsQjy8a3qTFJ9DAR
|
22
|
+
aPmrOc8WX/SdkVihRXRZwxAZOOrgoyyYAcYL+xI+T9EBESh3UoC9R2ibb2MYG7Ha
|
23
|
+
0gyN7a4/8eCNHCbs1QOZRAhr+8TFVqv28pbMbWJLToZ+hVns6Zikl0MyzFLtNoAm
|
24
|
+
HlMpAoGBAIOkqnwwuRKhWprL59sdcJfWY26os9nvuDV4LoKFNEFLJhj2AA2/3UlV
|
25
|
+
v85gqNSxnMNlHLZC9l2HZ3mKv/mfx1aikmFvyhJAnk5u0f9KkexmCPLjQzS5q3ba
|
26
|
+
yFuxK2DXwN4x46RgQPFlLjOTCX0BG6rkEu4JdonF8ETSjoCtGEU8
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDMTCCAhmgAwIBAgIUCJ5+zdYJIlL04EOwC0tqVbZYKQUwDQYJKoZIhvcNAQEL
|
3
|
+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
|
4
|
+
cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
|
5
|
+
VQQDEwJsczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFY71j9Proa
|
6
|
+
x95bWoBQOcc0ncqVvQO+Tk/Do4ynoe64pOJEf3txh1viHbnzFUGf+NF5WW6trlZ2
|
7
|
+
ErP81vy7Ds5J5ngXjjdzOOGsTs9+l7KkqPfUwXqGoldWFtr//9mkLvWpd8uPvVtO
|
8
|
+
dRnpcjQSlHHEB/HaqxkyBAvHLv1Fi1jTgIgn32NEM2mlCJ3M8OVfO9pqlO/6gjjs
|
9
|
+
Miow8zZqtczeuv0JPu7V5xPDrcX0xh0kZdpH4gSh9r314TwZXFCofNUbkZrPV+Q9
|
10
|
+
XJs64NlBjJZkd5qwKeXujZRV4eVvAOTlp+4Nh4eDqXE323s5yiPuov0StvNrbh3d
|
11
|
+
rcg+IM+RTdMCAwEAAaNiMGAwHQYDVR0OBBYEFGnXHJEJ+LGmQTqDNr50C8FE8pcF
|
12
|
+
MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBMGA1UdEQQMMAqCCGxv
|
13
|
+
Z3N0YXNoMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAI08C6IeweN3LrEq
|
14
|
+
ZauDVoiE2IdA1/nN3sxl+wL2xfauv1nctxej9TYR3mNoWiacgbbfJkPMCSIYk2Vc
|
15
|
+
G396yLiGC1V96FfonnKfr3tKd0BiijTu3u5pOTgNNf5n4TZaTHTYmuKPtWoXyuLR
|
16
|
+
QbH3jdgq9aq/9bwK0E5FOmuv6LGatnKzLf56aHjzerSZCnRw7V/1J/Yj3cy6TB1l
|
17
|
+
9Lc7IAk4dGyrgwfKCuZOSzAtCWpOA/FfqCqMSuW6lrZ1zAXnk6VI3RkmBCuLE6kj
|
18
|
+
aAjwORJHyiwBsMQbaYcQaXXjhguS+iHrnWdR0DFs9gHJSTuf6EoOeygdtMDutb2O
|
19
|
+
4xfHWG8=
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEAwVjvWP0+uhrH3ltagFA5xzSdypW9A75OT8OjjKeh7rik4kR/
|
3
|
+
e3GHW+IdufMVQZ/40XlZbq2uVnYSs/zW/LsOzknmeBeON3M44axOz36XsqSo99TB
|
4
|
+
eoaiV1YW2v//2aQu9al3y4+9W051GelyNBKUccQH8dqrGTIEC8cu/UWLWNOAiCff
|
5
|
+
Y0QzaaUInczw5V872mqU7/qCOOwyKjDzNmq1zN66/Qk+7tXnE8OtxfTGHSRl2kfi
|
6
|
+
BKH2vfXhPBlcUKh81RuRms9X5D1cmzrg2UGMlmR3mrAp5e6NlFXh5W8A5OWn7g2H
|
7
|
+
h4OpcTfbeznKI+6i/RK282tuHd2tyD4gz5FN0wIDAQABAoIBAGLHVvC14PgfeoEl
|
8
|
+
VuU7F2moffzj5z8kWMnzf3j6o4ZcmxBmQmMEq0zMBrfbcr6mRe5u+rvKy8isZf3C
|
9
|
+
bOuNfZDyvGYaUrQNj7/r0g+78zB3Y0PKVFaOth28g8y7ATFl6f/j5qn+85TUTotA
|
10
|
+
cvIbk+9TYWO0fblPjjWeO2l1wC1ObV0pFrXVzthFTQk0oxl3Gyq54P5rPp7QPOdM
|
11
|
+
jB0lSAhvkEEA7nIZ0dF1zm3RuByahSQC45kYEp5TCC8SDwO3WCJ32Q/dhPw0y9Go
|
12
|
+
gbIEY9QBFc8Rn3HDYGTSRPVVDM3HctDqzCihWOgFQlv718yCAZYq43fdOcy+6BY/
|
13
|
+
UT3xRhECgYEA5wWcYD8bY5x0fk2ubxKJTE4Fm2HvUrexvLX00yF3sX9XqrsiBBC4
|
14
|
+
14mB2yFEKQL+M/ZqLNV9IfJhfRmBffoRvf9lAuHhUrw4wGijERoO9xkmS3lGvzw+
|
15
|
+
hqLIMnd986wyWC8FdU+dStDg8PC97xK4bg0tKYo9jmKf3kb0Ov2UWQ0CgYEA1kCK
|
16
|
+
w30P3ZgYakXUjbwv3KoRXIVm6cIqgvm8iPh7B0GeTUCIgGBSNzJ8LVts/m6V7xtU
|
17
|
+
RJ8RKw2gqqUTiFqrRKefr0APFv0YeVgZ7zK2EGLrL2rFWNZZQqA97Mh/5CwFh+zs
|
18
|
+
1/IYuqRUVDaLq0sAPcZA5KEoO91eChBVK/RAyl8CgYAqgVPGOZY2e6DLZEuF0ClG
|
19
|
+
yswpTJmV5IplKC1Fc1DsbXuZxBh8Gv+HWJt1z+cUjKJsuRfL6/O7/TaGp9y1av88
|
20
|
+
r/LL1vd4G31tmVL3YI4EVLJBDK1Bnjn615RyBJ496R7SLsSYUu+jxk68xe6MQCuC
|
21
|
+
xBXdILw2qFq1sORavjE/OQKBgQCJlwNGDX9t2Cn9vYCF0Q+Pjyv9FbKEdevlFsor
|
22
|
+
0B76BvrJM6M1hiXmSqaSXj89mfjxh8RzGQ/mbSb7z20eyNNqEJes7N+D7N+Vta1Z
|
23
|
+
/mALX+sXFWNM7MJ/1fZOpGf1OQwIQW/MMi4NVlDNkAXb6BtskG/GI3R6FWw53ElG
|
24
|
+
I+Kj0wKBgQDUCfiYYSA9wYug53uvE0LirZwMQjWTbqxMO/S3H0Be8rf+BLo+YY5X
|
25
|
+
fF6L/NaKxNZzs2Uu6+xYLXhSMimiv8412t7qnjK5DLwTZfnj7EuNxd44cZ4cXDPx
|
26
|
+
JtD9GgPJ5V3js1gA2usPnKLYPw5Pp3ayZn1q4Tg9A5cextKnyOV/Fg==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDNjCCAh6gAwIBAgIUF9wE+oqGSbm4UVn1y9gEjzyaJFswDQYJKoZIhvcNAQEL
|
3
|
+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
|
4
|
+
cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
|
5
|
+
VQQDEwJlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2S2by0lgyu
|
6
|
+
1JfgGgZ41PNXbH2qMPMzowguVVdtZ16WM0CaEG7lnLxmMcC+2Q7NnGuFnPAVQo9T
|
7
|
+
Q3bh7j+1PkCJVHUKZfJIeWtGc9+qXBcO1MhedfwM1osSa4bfwM85G+XKWbRNtmSt
|
8
|
+
CoUuKArIyZkzdBAAQLBoQyPf3DIza1Au4j9Hb3zrswD6e7n2PN4ffIyil1GFduLJ
|
9
|
+
2275qqFiOhkEDUhv7BKNftVBh/89O/5lSqAQGuQ1aDRr8TdHwhO71u4ZIU/Pn6yX
|
10
|
+
LGBWrQG53+qpdCsxGvJTfbtIEYUDTN83CirIxDKJgc1QXOEldylztHf4xnQ7ZarJ
|
11
|
+
tqF6pUzHbRsCAwEAAaNnMGUwHQYDVR0OBBYEFFQUK+6Cg2kExRj1xSDzEi4kkgKX
|
12
|
+
MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBgGA1UdEQQRMA+CDWVs
|
13
|
+
YXN0aWNzZWFyY2gwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAinaknZIc
|
14
|
+
7xtQNwUwa+kdET+I4lMz+TJw9vTjGKPJqe082n81ycKU5b+a/OndG90z+dTwhShW
|
15
|
+
f0oZdIe/1rDCdiRU4ceCZA4ybKrFDIbW8gOKZOx9rsgEx9XNELj4ocZTBqxjQmNE
|
16
|
+
Ho91fli5aEm0EL2vJgejh4hcfDeElQ6go9gtvAHQ57XEADQSenvt69jOICOupnS+
|
17
|
+
LSjDVhv/VLi3CAip0B+lD5fX/DVQdrJ62eRGuQYxoouE3saCO58qUUrKB39yD9KA
|
18
|
+
qRA/sVxyLogxaU+5dLfc0NJdOqSzStxQ2vdMvAWo9tZZ2UBGFrk5SdwCQe7Yv5mX
|
19
|
+
qi02i4q6meHGcw==
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEowIBAAKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5VV21nXpYzQJoQ
|
3
|
+
buWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz36pcFw7UyF51
|
4
|
+
/AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/cMjNrUC7iP0dv
|
5
|
+
fOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH/z07/mVKoBAa
|
6
|
+
5DVoNGvxN0fCE7vW7hkhT8+frJcsYFatAbnf6ql0KzEa8lN9u0gRhQNM3zcKKsjE
|
7
|
+
MomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABAoIBAQCm/VBDz41ImG7p
|
8
|
+
yu3e6iMeFi7HW5SKdlRUS5dJbHT1uBWJAm/q8TbwvnUBVdsn9cKWY06QYDPQBjAy
|
9
|
+
0LxRSIKivjyl+aIJDZbbEUXrmk/M0zT9rHtgSc2isM8ITH6IHw5q7lmNMPLYOu6T
|
10
|
+
IMvfTDtADBOOTV/vF+/4NKf5GCUXVt1XTzLBFMK0p/ZoI7Fsw7fhH6FR12vk0xA4
|
11
|
+
BEC4pwRbGfHo7P31ii0by8epkve93tF4IZuFmN92A84bN1z7Kc4TYaSbua2rgguz
|
12
|
+
FzMyWpsTxr363HzCK1xOJb6JyJOiXbq4+j2oqtne3GIvyozJeiyKRgjLIMoe/LV7
|
13
|
+
fPPc5wlhAoGBAOD3z0JH2eyR/1RHILFsWInH2nDbKHHuCjhFIL2XloeXsJkiJZ95
|
14
|
+
BpdjExMZCqD44tPNRW/GgWKwoVwltm6zB0aq0aW/OfOzw6fhKt1W+go47L7Tpwap
|
15
|
+
VQgy6BFXSueUKfQDlZEWV4E2gakf8vOl0/VRQExae/CeKf1suEedQaErAoGBAMWE
|
16
|
+
LOmNDEU2NFqghfNBAFYyFJst3YnBmSmlL7W22+OsfSK/PhxnJbuNHxMgxpg9rieW
|
17
|
+
tVyjuZRo/i7WLVm3uG+dK1RJ9t8Y6kpYkCRKpi9G8DBOj3PSulOybBr+fdRfW9mf
|
18
|
+
8UmqOjOkrhxXPkchc9TY4EM7/1XeKvEidlIp0gvRAoGAAurz4zYvW2QhXaR2hhaT
|
19
|
+
p2XSLXiKM8AUndo3rH3U0/lhrvrEZicZsMj2LF88xg20U27sIaD/eJo13Y4XqaPk
|
20
|
+
ykPY6D9srv574SeIeMpx/8PxPiBcoDd+BNc0L1VkgVBoouORAwq5I9HjKKBjdEmI
|
21
|
+
UDw3i0X5KYvDm6fXVAZ0HXUCgYBWc4To8KiXPqNpq2sVzrSkBaWJSmj2G7u7Q6b/
|
22
|
+
RTs3is72v3gjHG6iiaE5URY7mnu4rjlRhAP9Vnsy6uHMrCJZEBTf/sPEYHZj9iGZ
|
23
|
+
EOduOAF3U1tsmaaebbDtm8hdhSOBvITy9kQlSIZAt1r17Ulytz5pj0AySFzJUIkz
|
24
|
+
a0SZkQKBgCWixtUxiK8PAdWhyS++90WJeJn8eqjuSAz+VMtFQFRRWDUbkiHvGMRu
|
25
|
+
o/Hhk6zS46gSF2Evb1d26uUEenXnJlIp6YWzb0DLPrfy5P53kPA6YEvYq5MSAg3l
|
26
|
+
DZOJUF+ko7cWXSZkeTIBH/jrGOdP4tTALZt6DNt+Gz7xwPO5tGgV
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -8,13 +8,11 @@ require "stud/temporary"
|
|
8
8
|
require "time"
|
9
9
|
require "date"
|
10
10
|
|
11
|
-
|
12
|
-
attr_reader :client
|
13
|
-
end
|
11
|
+
require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
|
14
12
|
|
15
|
-
describe LogStash::Inputs::
|
13
|
+
describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
|
16
14
|
|
17
|
-
let(:plugin) {
|
15
|
+
let(:plugin) { described_class.new(config) }
|
18
16
|
let(:queue) { Queue.new }
|
19
17
|
|
20
18
|
it_behaves_like "an interruptible input plugin" do
|
@@ -40,7 +38,13 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
43
|
-
|
41
|
+
|
42
|
+
ecs_compatibility_matrix(:disabled, :v1, :v8) do |ecs_select|
|
43
|
+
|
44
|
+
before(:each) do
|
45
|
+
allow_any_instance_of(described_class).to receive(:ecs_compatibility).and_return(ecs_compatibility)
|
46
|
+
end
|
47
|
+
|
44
48
|
let(:config) do
|
45
49
|
%q[
|
46
50
|
input {
|
@@ -97,7 +101,6 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
97
101
|
end
|
98
102
|
|
99
103
|
expect(event).to be_a(LogStash::Event)
|
100
|
-
puts event.to_hash_with_metadata
|
101
104
|
expect(event.get("message")).to eql [ "ohayo" ]
|
102
105
|
end
|
103
106
|
|
@@ -120,10 +123,10 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
120
123
|
end
|
121
124
|
|
122
125
|
expect(event).to be_a(LogStash::Event)
|
123
|
-
puts event.to_hash_with_metadata
|
124
126
|
expect(event.get("[@metadata][_source][message]")).to eql [ "ohayo" ]
|
125
127
|
end
|
126
128
|
end
|
129
|
+
|
127
130
|
end
|
128
131
|
|
129
132
|
# This spec is an adapter-spec, ensuring that we send the right sequence of messages to our Elasticsearch Client
|
@@ -135,6 +138,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
135
138
|
'query' => "#{LogStash::Json.dump(query)}",
|
136
139
|
'slices' => slices,
|
137
140
|
'docinfo' => true, # include ids
|
141
|
+
'docinfo_target' => '[@metadata]'
|
138
142
|
}
|
139
143
|
end
|
140
144
|
let(:query) do
|
@@ -166,7 +170,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
166
170
|
end
|
167
171
|
|
168
172
|
context 'without slices directive' do
|
169
|
-
let(:config) { super.tap { |h| h.delete('slices') } }
|
173
|
+
let(:config) { super().tap { |h| h.delete('slices') } }
|
170
174
|
it 'runs just one slice' do
|
171
175
|
expect(plugin).to receive(:do_run_slice).with(duck_type(:<<))
|
172
176
|
expect(Thread).to_not receive(:new)
|
@@ -405,127 +409,140 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
405
409
|
allow(client).to receive(:clear_scroll).and_return(nil)
|
406
410
|
end
|
407
411
|
|
408
|
-
|
409
|
-
let(:config_metadata) do
|
410
|
-
%q[
|
411
|
-
input {
|
412
|
-
elasticsearch {
|
413
|
-
hosts => ["localhost"]
|
414
|
-
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
415
|
-
docinfo => true
|
416
|
-
}
|
417
|
-
}
|
418
|
-
]
|
419
|
-
end
|
412
|
+
ecs_compatibility_matrix(:disabled, :v1, :v8) do |ecs_select|
|
420
413
|
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
414
|
+
before(:each) do
|
415
|
+
allow_any_instance_of(described_class).to receive(:ecs_compatibility).and_return(ecs_compatibility)
|
416
|
+
end
|
417
|
+
|
418
|
+
context 'with docinfo enabled' do
|
419
|
+
let(:config_metadata) do
|
420
|
+
%q[
|
421
|
+
input {
|
422
|
+
elasticsearch {
|
423
|
+
hosts => ["localhost"]
|
424
|
+
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
425
|
+
docinfo => true
|
426
|
+
}
|
429
427
|
}
|
430
|
-
|
431
|
-
]
|
432
|
-
|
433
|
-
event = input(config_metadata_with_hash) do |pipeline, queue|
|
434
|
-
queue.pop
|
428
|
+
]
|
435
429
|
end
|
436
430
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
"
|
446
|
-
|
447
|
-
"
|
448
|
-
"
|
449
|
-
|
450
|
-
|
451
|
-
expect(client).not_to receive(:clear_scroll)
|
452
|
-
plugin.register
|
453
|
-
expect { plugin.run([]) }.to raise_error(Exception, /incompatible event/)
|
431
|
+
it "provides document info under metadata" do
|
432
|
+
event = input(config_metadata) do |pipeline, queue|
|
433
|
+
queue.pop
|
434
|
+
end
|
435
|
+
|
436
|
+
if ecs_select.active_mode == :disabled
|
437
|
+
expect(event.get("[@metadata][_index]")).to eq('logstash-2014.10.12')
|
438
|
+
expect(event.get("[@metadata][_type]")).to eq('logs')
|
439
|
+
expect(event.get("[@metadata][_id]")).to eq('C5b2xLQwTZa76jBmHIbwHQ')
|
440
|
+
else
|
441
|
+
expect(event.get("[@metadata][input][elasticsearch][_index]")).to eq('logstash-2014.10.12')
|
442
|
+
expect(event.get("[@metadata][input][elasticsearch][_type]")).to eq('logs')
|
443
|
+
expect(event.get("[@metadata][input][elasticsearch][_id]")).to eq('C5b2xLQwTZa76jBmHIbwHQ')
|
444
|
+
end
|
454
445
|
end
|
455
|
-
end
|
456
446
|
|
457
|
-
|
458
|
-
|
459
|
-
|
447
|
+
it 'merges values if the `docinfo_target` already exist in the `_source` document' do
|
448
|
+
config_metadata_with_hash = %Q[
|
449
|
+
input {
|
450
|
+
elasticsearch {
|
451
|
+
hosts => ["localhost"]
|
452
|
+
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
453
|
+
docinfo => true
|
454
|
+
docinfo_target => 'metadata_with_hash'
|
455
|
+
}
|
456
|
+
}
|
457
|
+
]
|
458
|
+
|
459
|
+
event = input(config_metadata_with_hash) do |pipeline, queue|
|
460
|
+
queue.pop
|
461
|
+
end
|
462
|
+
|
463
|
+
expect(event.get("[metadata_with_hash][_index]")).to eq('logstash-2014.10.12')
|
464
|
+
expect(event.get("[metadata_with_hash][_type]")).to eq('logs')
|
465
|
+
expect(event.get("[metadata_with_hash][_id]")).to eq('C5b2xLQwTZa76jBmHIbwHQ')
|
466
|
+
expect(event.get("[metadata_with_hash][awesome]")).to eq("logstash")
|
460
467
|
end
|
461
468
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
469
|
+
context 'if the `docinfo_target` exist but is not of type hash' do
|
470
|
+
let (:config) { {
|
471
|
+
"hosts" => ["localhost"],
|
472
|
+
"query" => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }',
|
473
|
+
"docinfo" => true,
|
474
|
+
"docinfo_target" => 'metadata_with_string'
|
475
|
+
} }
|
476
|
+
it 'thows an exception if the `docinfo_target` exist but is not of type hash' do
|
477
|
+
expect(client).not_to receive(:clear_scroll)
|
478
|
+
plugin.register
|
479
|
+
expect { plugin.run([]) }.to raise_error(Exception, /incompatible event/)
|
480
|
+
end
|
481
|
+
end
|
466
482
|
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
483
|
+
it 'should move the document information to the specified field' do
|
484
|
+
config = %q[
|
485
|
+
input {
|
486
|
+
elasticsearch {
|
487
|
+
hosts => ["localhost"]
|
488
|
+
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
489
|
+
docinfo => true
|
490
|
+
docinfo_target => 'meta'
|
491
|
+
}
|
475
492
|
}
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
493
|
+
]
|
494
|
+
event = input(config) do |pipeline, queue|
|
495
|
+
queue.pop
|
496
|
+
end
|
497
|
+
|
498
|
+
expect(event.get("[meta][_index]")).to eq('logstash-2014.10.12')
|
499
|
+
expect(event.get("[meta][_type]")).to eq('logs')
|
500
|
+
expect(event.get("[meta][_id]")).to eq('C5b2xLQwTZa76jBmHIbwHQ')
|
480
501
|
end
|
481
502
|
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
503
|
+
it "allows to specify which fields from the document info to save to metadata" do
|
504
|
+
fields = ["_index"]
|
505
|
+
config = %Q[
|
506
|
+
input {
|
507
|
+
elasticsearch {
|
508
|
+
hosts => ["localhost"]
|
509
|
+
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
510
|
+
docinfo => true
|
511
|
+
docinfo_fields => #{fields}
|
512
|
+
}
|
513
|
+
}]
|
514
|
+
|
515
|
+
event = input(config) do |pipeline, queue|
|
516
|
+
queue.pop
|
517
|
+
end
|
518
|
+
|
519
|
+
meta_base = event.get(ecs_select.active_mode == :disabled ? "@metadata" : "[@metadata][input][elasticsearch]")
|
520
|
+
expect(meta_base.keys).to eq(fields)
|
521
|
+
end
|
486
522
|
|
487
|
-
|
488
|
-
|
489
|
-
config = %Q[
|
523
|
+
it 'should be able to reference metadata fields in `add_field` decorations' do
|
524
|
+
config = %q[
|
490
525
|
input {
|
491
526
|
elasticsearch {
|
492
527
|
hosts => ["localhost"]
|
493
528
|
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
494
529
|
docinfo => true
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
event = input(config) do |pipeline, queue|
|
500
|
-
queue.pop
|
501
|
-
end
|
502
|
-
|
503
|
-
expect(event.get("@metadata").keys).to eq(fields)
|
504
|
-
expect(event.get("[@metadata][_type]")).to eq(nil)
|
505
|
-
expect(event.get("[@metadata][_index]")).to eq('logstash-2014.10.12')
|
506
|
-
expect(event.get("[@metadata][_id]")).to eq(nil)
|
507
|
-
end
|
508
|
-
|
509
|
-
it 'should be able to reference metadata fields in `add_field` decorations' do
|
510
|
-
config = %q[
|
511
|
-
input {
|
512
|
-
elasticsearch {
|
513
|
-
hosts => ["localhost"]
|
514
|
-
query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
|
515
|
-
docinfo => true
|
516
|
-
add_field => {
|
517
|
-
'identifier' => "foo:%{[@metadata][_type]}:%{[@metadata][_id]}"
|
530
|
+
add_field => {
|
531
|
+
'identifier' => "foo:%{[@metadata][_type]}:%{[@metadata][_id]}"
|
532
|
+
}
|
518
533
|
}
|
519
534
|
}
|
520
|
-
|
521
|
-
]
|
535
|
+
]
|
522
536
|
|
523
|
-
|
524
|
-
|
525
|
-
|
537
|
+
event = input(config) do |pipeline, queue|
|
538
|
+
queue.pop
|
539
|
+
end
|
540
|
+
|
541
|
+
expect(event.get('identifier')).to eq('foo:logs:C5b2xLQwTZa76jBmHIbwHQ')
|
542
|
+
end if ecs_select.active_mode == :disabled
|
526
543
|
|
527
|
-
expect(event.get('identifier')).to eq('foo:logs:C5b2xLQwTZa76jBmHIbwHQ')
|
528
544
|
end
|
545
|
+
|
529
546
|
end
|
530
547
|
|
531
548
|
context "when not defining the docinfo" do
|
@@ -542,9 +559,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
542
559
|
queue.pop
|
543
560
|
end
|
544
561
|
|
545
|
-
expect(event.get("[@metadata]
|
546
|
-
expect(event.get("[@metadata][_type]")).to eq(nil)
|
547
|
-
expect(event.get("[@metadata][_id]")).to eq(nil)
|
562
|
+
expect(event.get("[@metadata]")).to be_empty
|
548
563
|
end
|
549
564
|
end
|
550
565
|
end
|
@@ -563,22 +578,22 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
563
578
|
'sample:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2OjkyNDMkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA=='
|
564
579
|
end
|
565
580
|
|
566
|
-
let(:config) { super.merge({ 'cloud_id' => valid_cloud_id }) }
|
581
|
+
let(:config) { super().merge({ 'cloud_id' => valid_cloud_id }) }
|
567
582
|
|
568
583
|
it "should set host(s)" do
|
569
584
|
plugin.register
|
570
585
|
client = plugin.send(:client)
|
571
|
-
expect( client.
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
586
|
+
expect( extract_transport(client).hosts ).to eql [{
|
587
|
+
:scheme => "https",
|
588
|
+
:host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
|
589
|
+
:port => 9243,
|
590
|
+
:path => "",
|
591
|
+
:protocol => "https"
|
592
|
+
}]
|
578
593
|
end
|
579
594
|
|
580
595
|
context 'invalid' do
|
581
|
-
let(:config) { super.merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
|
596
|
+
let(:config) { super().merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
|
582
597
|
|
583
598
|
it "should fail" do
|
584
599
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id.*? is invalid/
|
@@ -586,7 +601,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
586
601
|
end
|
587
602
|
|
588
603
|
context 'hosts also set' do
|
589
|
-
let(:config) { super.merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
|
604
|
+
let(:config) { super().merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
|
590
605
|
|
591
606
|
it "should fail" do
|
592
607
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id and hosts/
|
@@ -595,18 +610,18 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
595
610
|
end if LOGSTASH_VERSION > '6.0'
|
596
611
|
|
597
612
|
describe "cloud.auth" do
|
598
|
-
let(:config) { super.merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
|
613
|
+
let(:config) { super().merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
|
599
614
|
|
600
615
|
it "should set authorization" do
|
601
616
|
plugin.register
|
602
617
|
client = plugin.send(:client)
|
603
|
-
auth_header = client.
|
618
|
+
auth_header = extract_transport(client).options[:transport_options][:headers]['Authorization']
|
604
619
|
|
605
620
|
expect( auth_header ).to eql "Basic #{Base64.encode64('elastic:my-passwd-00').rstrip}"
|
606
621
|
end
|
607
622
|
|
608
623
|
context 'invalid' do
|
609
|
-
let(:config) { super.merge({ 'cloud_auth' => 'invalid-format' }) }
|
624
|
+
let(:config) { super().merge({ 'cloud_auth' => 'invalid-format' }) }
|
610
625
|
|
611
626
|
it "should fail" do
|
612
627
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_auth.*? format/
|
@@ -614,7 +629,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
614
629
|
end
|
615
630
|
|
616
631
|
context 'user also set' do
|
617
|
-
let(:config) { super.merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
|
632
|
+
let(:config) { super().merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
|
618
633
|
|
619
634
|
it "should fail" do
|
620
635
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
|
@@ -624,7 +639,7 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
624
639
|
|
625
640
|
describe "api_key" do
|
626
641
|
context "without ssl" do
|
627
|
-
let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
|
642
|
+
let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
|
628
643
|
|
629
644
|
it "should fail" do
|
630
645
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /api_key authentication requires SSL\/TLS/
|
@@ -632,18 +647,18 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
632
647
|
end
|
633
648
|
|
634
649
|
context "with ssl" do
|
635
|
-
let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
|
650
|
+
let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
|
636
651
|
|
637
652
|
it "should set authorization" do
|
638
653
|
plugin.register
|
639
654
|
client = plugin.send(:client)
|
640
|
-
auth_header = client.
|
655
|
+
auth_header = extract_transport(client).options[:transport_options][:headers]['Authorization']
|
641
656
|
|
642
657
|
expect( auth_header ).to eql "ApiKey #{Base64.strict_encode64('foo:bar')}"
|
643
658
|
end
|
644
659
|
|
645
660
|
context 'user also set' do
|
646
|
-
let(:config) { super.merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
|
661
|
+
let(:config) { super().merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
|
647
662
|
|
648
663
|
it "should fail" do
|
649
664
|
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
|
@@ -653,24 +668,24 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
653
668
|
end if LOGSTASH_VERSION > '6.0'
|
654
669
|
|
655
670
|
describe "proxy" do
|
656
|
-
let(:config) { super.merge({ 'proxy' => 'http://localhost:1234' }) }
|
671
|
+
let(:config) { super().merge({ 'proxy' => 'http://localhost:1234' }) }
|
657
672
|
|
658
673
|
it "should set proxy" do
|
659
674
|
plugin.register
|
660
675
|
client = plugin.send(:client)
|
661
|
-
proxy = client.
|
676
|
+
proxy = extract_transport(client).options[:transport_options][:proxy]
|
662
677
|
|
663
678
|
expect( proxy ).to eql "http://localhost:1234"
|
664
679
|
end
|
665
680
|
|
666
681
|
context 'invalid' do
|
667
|
-
let(:config) { super.merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
|
682
|
+
let(:config) { super().merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
|
668
683
|
|
669
684
|
it "should not set proxy" do
|
670
685
|
plugin.register
|
671
686
|
client = plugin.send(:client)
|
672
687
|
|
673
|
-
expect( client.
|
688
|
+
expect( extract_transport(client).options[:transport_options] ).to_not include(:proxy)
|
674
689
|
end
|
675
690
|
end
|
676
691
|
end
|
@@ -756,4 +771,10 @@ describe LogStash::Inputs::TestableElasticsearch do
|
|
756
771
|
end
|
757
772
|
|
758
773
|
end
|
774
|
+
|
775
|
+
# @note can be removed once we depends on elasticsearch gem >= 6.x
|
776
|
+
def extract_transport(client) # on 7.x client.transport is a ES::Transport::Client
|
777
|
+
client.transport.respond_to?(:transport) ? client.transport.transport : client.transport
|
778
|
+
end
|
779
|
+
|
759
780
|
end
|