fluent-plugin-logtail 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fluent-plugin-logtail.gemspec +1 -2
- data/lib/fluent/plugin/out_logtail.rb +51 -25
- data/spec/fluent/plugin/out_logtail_spec.rb +2 -2
- metadata +2 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6339c03a2fefcf1214248cb628ba8564a8a4bd7af09f791255a176432966da58
|
4
|
+
data.tar.gz: 1a42d046f7fa186b0fe42ea5eb85ca13ae84ba0e3e75997074aee19dc1b374ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a78ee4379f721fb0c5a689c9fb9de10c47bfae2bca4097f5e22a1a9eed2e3139c034c098a4bd22ad5f9e00c6d8eddac74c77c8403665a064dd4e237f5217e85
|
7
|
+
data.tar.gz: 4aef1ed3577e83b2c17b3e5dd23b5a54c52d105547c80eb493302134c49812154286a5dc56902beb00fb3184b0bf2df83441e999fede563f9d615e96edc864a3
|
@@ -3,7 +3,7 @@ require 'date'
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'fluent-plugin-logtail'
|
6
|
-
s.version = '0.1.
|
6
|
+
s.version = '0.1.1'
|
7
7
|
s.date = Date.today.to_s
|
8
8
|
s.summary = 'Logtail.com plugin for Fluentd'
|
9
9
|
s.description = 'Streams Fluentd logs to the Logtail.com logging service.'
|
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
|
21
21
|
|
22
22
|
s.add_runtime_dependency('fluentd', '> 1', '< 2')
|
23
|
-
s.add_runtime_dependency('http', '~> 2.0', '>= 2.0.3')
|
24
23
|
|
25
24
|
s.add_development_dependency('rspec', '~> 3.4')
|
26
25
|
s.add_development_dependency('test-unit', '~> 3.3.9')
|
@@ -1,44 +1,29 @@
|
|
1
1
|
require 'fluent/output'
|
2
|
+
require 'net/https'
|
2
3
|
|
3
4
|
module Fluent
|
4
5
|
class LogtailOutput < Fluent::BufferedOutput
|
5
6
|
Fluent::Plugin.register_output('logtail', self)
|
6
7
|
|
7
|
-
VERSION = "0.1.
|
8
|
+
VERSION = "0.1.1".freeze
|
8
9
|
CONTENT_TYPE = "application/msgpack".freeze
|
9
|
-
HOST = "
|
10
|
+
HOST = "in.logtail.com".freeze
|
11
|
+
PORT = 443
|
10
12
|
PATH = "/".freeze
|
11
13
|
MAX_ATTEMPTS = 3.freeze
|
12
14
|
RETRYABLE_CODES = [429, 500, 502, 503, 504].freeze
|
13
|
-
USER_AGENT = "Logtail
|
15
|
+
USER_AGENT = "Logtail Fluentd/#{VERSION}".freeze
|
14
16
|
|
15
17
|
config_param :source_token, :string, secret: true
|
16
18
|
config_param :ip, :string, default: nil
|
17
19
|
|
18
20
|
def configure(conf)
|
19
|
-
source_token = conf["source_token"]
|
20
|
-
@headers = {
|
21
|
-
"Authorization" => "Bearer #{source_token}",
|
22
|
-
"Content-Type" => CONTENT_TYPE,
|
23
|
-
"User-Agent" => USER_AGENT
|
24
|
-
}
|
25
|
-
super
|
26
|
-
end
|
27
|
-
|
28
|
-
def start
|
29
|
-
super
|
30
|
-
require 'http'
|
31
|
-
HTTP.default_options = {:keep_alive_timeout => 29}
|
32
|
-
@http_client = HTTP.persistent(HOST)
|
33
|
-
end
|
34
|
-
|
35
|
-
def shutdown
|
36
|
-
@http_client.close if @http_client
|
21
|
+
@source_token = conf["source_token"]
|
37
22
|
super
|
38
23
|
end
|
39
24
|
|
40
25
|
def format(tag, time, record)
|
41
|
-
record.merge("dt" => Time.at(time).utc.iso8601).to_msgpack
|
26
|
+
force_utf8_string_values(record.merge("dt" => Time.at(time).utc.iso8601)).to_msgpack
|
42
27
|
end
|
43
28
|
|
44
29
|
def write(chunk)
|
@@ -52,11 +37,19 @@ module Fluent
|
|
52
37
|
return false
|
53
38
|
end
|
54
39
|
|
40
|
+
http = build_http_client
|
55
41
|
body = chunk.read
|
56
|
-
response = @http_client.headers(@headers).post(PATH, body: body)
|
57
|
-
response.flush
|
58
|
-
code = response.code
|
59
42
|
|
43
|
+
begin
|
44
|
+
resp = http.start do |conn|
|
45
|
+
req = build_request(body)
|
46
|
+
conn.request(req)
|
47
|
+
end
|
48
|
+
ensure
|
49
|
+
http.finish if http.started?
|
50
|
+
end
|
51
|
+
|
52
|
+
code = resp.code.to_i
|
60
53
|
if code >= 200 && code <= 299
|
61
54
|
true
|
62
55
|
elsif RETRYABLE_CODES.include?(code)
|
@@ -76,5 +69,38 @@ module Fluent
|
|
76
69
|
sleep_for = sleep_for <= 60 ? sleep_for : 60
|
77
70
|
(sleep_for / 2) + (rand(0..sleep_for) / 2)
|
78
71
|
end
|
72
|
+
|
73
|
+
def force_utf8_string_values(data)
|
74
|
+
data.transform_values do |val|
|
75
|
+
if val.is_a?(Hash)
|
76
|
+
force_utf8_string_values(val)
|
77
|
+
elsif val.respond_to?(:force_encoding)
|
78
|
+
val.force_encoding('UTF-8')
|
79
|
+
else
|
80
|
+
val
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_http_client
|
86
|
+
http = Net::HTTP.new(HOST, PORT)
|
87
|
+
http.use_ssl = true
|
88
|
+
# Verification on Windows fails despite having a valid certificate.
|
89
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
90
|
+
http.read_timeout = 30
|
91
|
+
http.ssl_timeout = 10
|
92
|
+
http.open_timeout = 10
|
93
|
+
http
|
94
|
+
end
|
95
|
+
|
96
|
+
def build_request(body)
|
97
|
+
path = '/'
|
98
|
+
req = Net::HTTP::Post.new(path)
|
99
|
+
req["Authorization"] = "Bearer #{@source_token}"
|
100
|
+
req["Content-Type"] = CONTENT_TYPE
|
101
|
+
req["User-Agent"] = USER_AGENT
|
102
|
+
req.body = body
|
103
|
+
req
|
104
|
+
end
|
79
105
|
end
|
80
106
|
end
|
@@ -32,9 +32,9 @@ describe Fluent::LogtailOutput do
|
|
32
32
|
stub = stub_request(:post, "https://in.logtail.com/").
|
33
33
|
with(
|
34
34
|
:body => start_with("\x85\xA3age\x1A\xAArequest_id\xA242\xA9parent_id\xA6parent\xAArouting_id\xA7routing\xA2dt\xB4".force_encoding("ASCII-8BIT")),
|
35
|
-
:headers => {'
|
35
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer abcd1234', 'Content-Type'=>'application/msgpack', 'User-Agent'=>'Logtail Fluentd/0.1.1'}
|
36
36
|
).
|
37
|
-
to_return(:status =>
|
37
|
+
to_return(:status => 202, :body => "", :headers => {})
|
38
38
|
|
39
39
|
driver.emit(record)
|
40
40
|
driver.run
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-logtail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Logtail.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -30,26 +30,6 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '2'
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: http
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '2.0'
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 2.0.3
|
43
|
-
type: :runtime
|
44
|
-
prerelease: false
|
45
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '2.0'
|
50
|
-
- - ">="
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: 2.0.3
|
53
33
|
- !ruby/object:Gem::Dependency
|
54
34
|
name: rspec
|
55
35
|
requirement: !ruby/object:Gem::Requirement
|