fluent-plugin-logentries_ssl 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44d985f1ae77d78cb91e6494f04300fa62374923
4
- data.tar.gz: 5bf25f2d7e7f3b68e34a58da88d83a27241b0a87
3
+ metadata.gz: c447ff5f9abb188ea46d1a4e0dc80263e555791b
4
+ data.tar.gz: 82657485f8ec359ae29b6cecffdae7339a2fcbaa
5
5
  SHA512:
6
- metadata.gz: 81dd42379c529831072d1ff4036c2ea88e0ad23505aae82204b82bb52eaafe679401df5ea014c97d8c48cc64e532549307b56fcc7b01df8df62580e28921d3e7
7
- data.tar.gz: df1a8fec907124ac82d6c255cbd202eb296868f53eb2aff482bd8b305fb7431dd4b7f53a70a69009d065c22bf8c45d72836a75f68c311809500486a10c57fa4f
6
+ metadata.gz: 1daba351d5d12445afae24f6c0d377240e2eddd5e9fb86ac67ab3078405bcb22870f385850731a1a046b86976363d50b1fd2947060b0ce4523d304421a1e041c
7
+ data.tar.gz: 3656af5f5ab6d40fd344ce6f9ebfb632821d6c35b0fa8dc0e7e49aa6ae9589f8ec1f46b991939bf9de93a200fbeb6e1a9626a62237dc7a6004afdb373737e912
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  pkg/*
2
+ Gemfile.lock
data/README.md CHANGED
@@ -19,6 +19,14 @@ gem install fluent-plugin-logentries_ssl
19
19
 
20
20
  ## Configuration
21
21
 
22
+ One of parameters *token\_path* or *default\_token* must be given. if token path is not defined, the Logentries token *default\_token* is used for all fluent events. When using *default\_token* with tokens from *token\_path*, it will be used as a fallback after trying to match a tag to a token in *token\_path*.
23
+
24
+ | *parameter* | *description | *default value* |
25
+ |---|---|---|
26
+ | *token_path* | Path to YAML formatted file containing 'tag: logentries-token' pairs | nil |
27
+ | *default_token* | A token string to be used either for all tags, or as fallback after token_path| nil |
28
+
29
+
22
30
  ```
23
31
  <match pattern>
24
32
  @type logentries_ssl
@@ -26,6 +34,16 @@ gem install fluent-plugin-logentries_ssl
26
34
  </match>
27
35
  ```
28
36
 
37
+ or with *default\_token*:
38
+
39
+ ```
40
+ <match pattern>
41
+ @type logentries_ssl
42
+ token_path /path/to/tokens.yml
43
+ default_token 'aaa-bbb-ccc'
44
+ </match>
45
+ ```
46
+
29
47
  ```
30
48
  <match pattern>
31
49
  @type logentries_ssl
@@ -38,16 +56,19 @@ gem install fluent-plugin-logentries_ssl
38
56
  </buffer>
39
57
  </match>
40
58
 
59
+ ````
41
60
  with tokens.yml
61
+
42
62
  ```
43
63
  tag-to-send: [logentries tcp token]
44
64
  other-tag: [other token]
45
65
  ```
66
+
46
67
  Event tag must match key in tokens file.
47
68
 
48
69
  other configuration keys:
49
70
 
50
- | *parameter* | *descrtiption | *default value* |
71
+ | *parameter* | *description | *default value* |
51
72
  |---|---|---|
52
73
  | *le_host* | Logentries hostname to use | data.logentries.com |
53
74
  | *le_port* | Logentries port to use | 443 |
@@ -55,6 +76,12 @@ other configuration keys:
55
76
  | *json* | Send record as json | true |
56
77
  | *verify_fqdn* | Verify FQDN for SSL | true |
57
78
 
79
+
80
+ ## Alternatives
81
+
82
+ * [fluent-plugin-logentries](https://github.com/Woorank/fluent-plugin-logentries)
83
+ * [fluent-plugin-simple-logentries](https://github.com/sowawa/fluent-plugin-simple-logentries)
84
+
58
85
  ## Copyright
59
86
 
60
87
  * Copyright(c) 2017- larte
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "fluent-plugin-logentries_ssl"
6
- spec.version = "0.1.0"
6
+ spec.version = "0.2.0"
7
7
  spec.authors = ["larte"]
8
8
  spec.email = ["larte@foodie.fm"]
9
9
 
@@ -17,100 +17,111 @@ require 'fluent/plugin/output'
17
17
  require 'yaml'
18
18
  require_relative 'logentries_ssl/message_helper.rb'
19
19
 
20
- module Fluent::Plugin
21
- module LogentriesSSL
22
- class Output < Fluent::Plugin::Output
23
- include Fluent::PluginHelper::Socket
24
-
25
- Fluent::Plugin.register_output('logentries_ssl', self)
26
-
27
- config_param :max_retries, :integer, default: 3
28
- config_param :le_host, :string, default: 'data.logentries.com'
29
- config_param :le_port, :integer, default: 443
30
- config_param :token_path, :string
31
- config_param :json, :bool, default: true
32
- config_param :verify_fqdn, :bool, default: true
33
-
34
- def configure(conf)
35
- super
36
- begin
37
- @apptokens = YAML.load_file(@token_path)
38
- rescue StandardError => e
39
- raise Fluent::ConfigError, "Could not load #{@token_path}: #{e.message}"
20
+ module Fluent
21
+ module Plugin
22
+ module LogentriesSSL
23
+ ##
24
+ # The plugin implementation.
25
+ class Output < Fluent::Plugin::Output
26
+ include Fluent::PluginHelper::Socket
27
+
28
+ Fluent::Plugin.register_output('logentries_ssl', self)
29
+
30
+ config_param :max_retries, :integer, default: 3
31
+ config_param :le_host, :string, default: 'data.logentries.com'
32
+ config_param :le_port, :integer, default: 443
33
+ config_param :token_path, :string, default: nil
34
+ config_param :default_token, :string, default: nil
35
+ config_param :json, :bool, default: true
36
+ config_param :verify_fqdn, :bool, default: true
37
+
38
+ def configure(conf)
39
+ super
40
+ if @default_token.nil? && @token_path.nil?
41
+ raise Fluent::ConfigError, 'Define :token_path or :default_token'
42
+ end
43
+ @apptokens = @token_path.nil? ? {} : load_tokens
40
44
  end
41
- end
42
45
 
43
- def start
44
- super
45
- log.trace "Creating connection to #{@le_host}"
46
- @_client = create_client
47
- end
46
+ def start
47
+ super
48
+ log.trace "Creating connection to #{@le_host}"
49
+ @_client = create_client
50
+ end
48
51
 
49
- # apparently needed for msgpack_each in :write fluent Issue-1342
50
- def formatted_to_msgpack_binary
51
- true
52
- end
52
+ # apparently needed for msgpack_each in :write fluent Issue-1342
53
+ def formatted_to_msgpack_binary
54
+ true
55
+ end
53
56
 
54
- def format(tag, _time, record)
55
- [tag, record].to_msgpack
56
- end
57
+ def load_tokens
58
+ begin
59
+ tokens = YAML.load_file(@token_path)
60
+ rescue StandardError => e
61
+ raise Fluent::ConfigError,
62
+ "Could not load #{@token_path}: #{e.message}"
63
+ end
64
+ tokens
65
+ end
57
66
 
58
- def tag_token(tag)
59
- @apptokens.each do |name, token|
60
- return token if tag.casecmp(name).zero?
67
+ def format(tag, _time, record)
68
+ [tag, record].to_msgpack
61
69
  end
62
- nil
63
- end
64
70
 
65
- def write(chunk)
66
- log.debug 'Writing records to logentries'
67
- chunk.msgpack_each do |tag, record|
68
- token = tag_token(tag)
69
- next unless token
70
- log.trace "Got token #{token} for tag #{tag}"
71
- data = @json ? record.to_json : record
72
- payloads = MessageHelper.split_record(token, "#{token} #{data} \n")
73
- payloads.each do |payload|
74
- with_retries do
75
- client.write(payload)
71
+ def tag_token(tag)
72
+ @apptokens.each do |name, token|
73
+ return token if tag.casecmp(name).zero?
74
+ end
75
+ @default_token.nil? ? nil : @default_token
76
+ end
77
+
78
+ def write(chunk)
79
+ chunk.msgpack_each do |tag, record|
80
+ token = tag_token(tag)
81
+ next unless token
82
+ data = @json ? record.to_json : record
83
+ MessageHelper.split_record(token, "#{token} #{data} \n")
84
+ .each do |payload|
85
+ with_retries { client.write(payload) }
76
86
  end
77
87
  end
78
88
  end
79
- end
80
89
 
81
- private
90
+ private
82
91
 
83
- def create_client
84
- socket_create(:tls, @le_host, @le_port, verify_fqdn: @verify_fqdn)
85
- end
92
+ def create_client
93
+ socket_create(:tls, @le_host, @le_port, verify_fqdn: @verify_fqdn)
94
+ end
86
95
 
87
- def close_client
88
- @_client.close if @_client
89
- @_client = nil
90
- end
96
+ def close_client
97
+ @_client.close if @_client
98
+ @_client = nil
99
+ end
91
100
 
92
- def client
93
- @_client ||= create_client
94
- end
101
+ def client
102
+ @_client ||= create_client
103
+ end
95
104
 
96
- def retry?(n)
97
- n < @max_retries
98
- end
105
+ def retry?(n)
106
+ n < @max_retries
107
+ end
99
108
 
100
- def with_retries
101
- tries = 0
102
- begin
103
- yield
104
- rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ECONNABORTED,
105
- Errno::ENETUNREACH, Errno::ETIMEDOUT, Errno::EPIPE => e
106
- if retry?(tries += 1)
107
- log.warn 'Clould not push to logentries, reset and retry'\
108
- "in #{2**tries} seconds. #{e.message}"
109
- sleep(2**tries)
110
- close_client
111
- retry
109
+ # rubocop:disable Metrics/MethodLength
110
+ def with_retries
111
+ tries = 0
112
+ begin
113
+ yield
114
+ rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ECONNABORTED,
115
+ Errno::ENETUNREACH, Errno::ETIMEDOUT, Errno::EPIPE => e
116
+ if retry?(tries += 1)
117
+ log.warn 'Clould not push to logentries, reset and retry'\
118
+ "in #{2**tries} seconds. #{e.message}"
119
+ sleep(2**tries)
120
+ close_client
121
+ retry
122
+ end
123
+ raise 'Could not push logs to Logentries'
112
124
  end
113
- raise 'Could not push logs to Logentries'
114
125
  end
115
126
  end
116
127
  end
@@ -1,7 +1,7 @@
1
- require "helper"
2
- require "fluent/plugin/out_logentries_ssl.rb"
3
-
1
+ require 'helper'
2
+ require 'fluent/plugin/out_logentries_ssl.rb'
4
3
 
4
+ # rubocop:disable Metrics/ClassLength
5
5
  class LogentriesSSLOutTest < Test::Unit::TestCase
6
6
  setup do
7
7
  Fluent::Test.setup
@@ -12,20 +12,20 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
12
12
  end
13
13
 
14
14
  def teardown
15
- Dir.glob('test/tmp/*').each {|f| File.unlink(f) }
15
+ Dir.glob('test/tmp/*').each { |f| File.unlink(f) }
16
16
  Dir.rmdir('test/tmp')
17
17
  end
18
18
 
19
- CONF = %[
19
+ CONF = %(
20
20
  token_path test/tmp/tokens.yml
21
21
  max_retries 2
22
22
  verify_fqdn false
23
- ]
23
+ ).freeze
24
24
 
25
- TOKENS = {"app" => "token", "app2" => "token2"}
25
+ TOKENS = { 'app' => 'token', 'app2' => 'token2' }.freeze
26
26
 
27
27
  def write_tokens
28
- File.open("test/tmp/tokens.yml","w") do |f|
28
+ File.open('test/tmp/tokens.yml', 'w') do |f|
29
29
  f.write TOKENS.to_yaml.to_s
30
30
  end
31
31
  end
@@ -35,12 +35,12 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
35
35
  socket.stubs(:connect).returns(socket)
36
36
  socket.stubs(:sync_close=)
37
37
  socket.stubs(:close)
38
- OpenSSL::SSL::SSLSocket.expects(:new).at_least_once.with(any_parameters).returns(socket)
39
- return socket
38
+ OpenSSL::SSL::SSLSocket.expects(:new).at_least_once.with(any_parameters)
39
+ .returns(socket)
40
+ socket
40
41
  end
41
42
 
42
-
43
- test "configuration" do
43
+ test 'configuration' do
44
44
  write_tokens
45
45
  d = create_driver(CONF)
46
46
  assert_equal 'test/tmp/tokens.yml', d.instance.token_path
@@ -49,7 +49,7 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
49
49
  assert_equal 'data.logentries.com', d.instance.le_host
50
50
  end
51
51
 
52
- test "tags-tokens" do
52
+ test 'tags-tokens' do
53
53
  write_tokens
54
54
  d = create_driver(CONF)
55
55
  assert_equal 'token', d.instance.tag_token('app')
@@ -57,17 +57,49 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
57
57
  assert_equal nil, d.instance.tag_token('app3')
58
58
  end
59
59
 
60
- test "unreadable tokens" do
60
+ test 'using default token' do
61
+ conf = %(
62
+ default_token aaa-bbb-ccc
63
+ max_retries 2
64
+ verify_fqdn false
65
+ )
66
+ d = create_driver(conf)
67
+ assert_equal 'aaa-bbb-ccc', d.instance.tag_token('app1')
68
+ assert_equal 'aaa-bbb-ccc', d.instance.tag_token('app2')
69
+ end
70
+
71
+ test 'using default token with token file' do
72
+ write_tokens
73
+ conf = %(
74
+ token_path test/tmp/tokens.yml
75
+ default_token aaa-bbb-ccc
76
+ max_retries 2
77
+ verify_fqdn false
78
+ )
79
+ d = create_driver(conf)
80
+ assert_equal 'token', d.instance.tag_token('app')
81
+ assert_equal 'token2', d.instance.tag_token('app2')
82
+ assert_equal 'aaa-bbb-ccc', d.instance.tag_token('app3')
83
+ end
84
+
85
+ test 'no token info' do
86
+ assert_raise Fluent::ConfigError do
87
+ create_driver('max_retries 2')
88
+ end
89
+ end
90
+
91
+ test 'unreadable tokens' do
61
92
  assert_raise Fluent::ConfigError do
62
93
  create_driver(CONF)
63
94
  end
64
95
  end
65
96
 
66
- test "sending to logentries" do
97
+ test 'sending to logentries' do
67
98
  write_tokens
68
99
  socket = stub_socket
69
- message = {"message" => "Hello"}
70
- socket.expects(:write).with(regexp_matches(/^token {.*message.*Hello.*}\s+/i))
100
+ message = { 'message' => 'Hello' }
101
+ socket.expects(:write)
102
+ .with(regexp_matches(/^token {.*message.*Hello.*}\s+/i))
71
103
  d = create_driver(CONF)
72
104
  time = event_time('2017-01-01 13:37:00 UTC')
73
105
  d.run(default_tag: 'app') do
@@ -75,11 +107,12 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
75
107
  end
76
108
  end
77
109
 
78
- test "retries on errors" do
110
+ test 'retries on errors' do
79
111
  write_tokens
80
112
  socket = stub_socket
81
- message = {"message" => "Hello"}
82
- socket.expects(:write).with(anything).twice.raises(Errno::ECONNRESET).then.returns("ok")
113
+ message = { 'message' => 'Hello' }
114
+ socket.expects(:write).with(anything).twice.raises(Errno::ECONNRESET)
115
+ .then.returns('ok')
83
116
  d = create_driver(CONF)
84
117
  time = event_time('2017-01-01 13:37:00 UTC')
85
118
  d.run(default_tag: 'app') do
@@ -87,11 +120,12 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
87
120
  end
88
121
  end
89
122
 
90
- test "sending too large events to LE" do
123
+ test 'sending too large events to LE' do
91
124
  write_tokens
92
125
  socket = stub_socket
93
- message = {"hello" =>
94
- "a"*(Fluent::Plugin::LogentriesSSL::MessageHelper::MAX_SIZE + 100)}
126
+ message = { 'hello' =>
127
+ 'a' *
128
+ (Fluent::Plugin::LogentriesSSL::MessageHelper::MAX_SIZE + 100) }
95
129
  socket.expects(:write).with(anything).twice
96
130
  d = create_driver(CONF)
97
131
  time = event_time('2017-01-01 13:37:00 UTC')
@@ -103,6 +137,7 @@ class LogentriesSSLOutTest < Test::Unit::TestCase
103
137
  private
104
138
 
105
139
  def create_driver(conf)
106
- Fluent::Test::Driver::Output.new(Fluent::Plugin::LogentriesSSL::Output).configure(conf)
140
+ Fluent::Test::Driver::Output
141
+ .new(Fluent::Plugin::LogentriesSSL::Output).configure(conf)
107
142
  end
108
143
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-logentries_ssl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - larte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-20 00:00:00.000000000 Z
11
+ date: 2017-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -95,7 +95,6 @@ extra_rdoc_files: []
95
95
  files:
96
96
  - ".gitignore"
97
97
  - Gemfile
98
- - Gemfile.lock
99
98
  - LICENSE
100
99
  - README.md
101
100
  - Rakefile
@@ -125,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
124
  version: '0'
126
125
  requirements: []
127
126
  rubyforge_project:
128
- rubygems_version: 2.6.10
127
+ rubygems_version: 2.6.8
129
128
  signing_key:
130
129
  specification_version: 4
131
130
  summary: Plugin to send records to logentries
@@ -1,52 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- fluent-plugin-logentries_ssl (0.1.0)
5
- fluentd (>= 0.14.10, < 2)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- cool.io (1.4.6)
11
- fluentd (0.14.13)
12
- cool.io (~> 1.4.5)
13
- http_parser.rb (>= 0.5.1, < 0.7.0)
14
- msgpack (>= 0.7.0, < 2.0.0)
15
- serverengine (>= 2.0.4, < 3.0.0)
16
- sigdump (~> 0.2.2)
17
- strptime (~> 0.1.7)
18
- tzinfo (~> 1.0)
19
- tzinfo-data (~> 1.0)
20
- yajl-ruby (~> 1.0)
21
- http_parser.rb (0.6.0)
22
- metaclass (0.0.4)
23
- mocha (1.2.1)
24
- metaclass (~> 0.0.1)
25
- msgpack (1.1.0)
26
- power_assert (1.0.1)
27
- rake (12.0.0)
28
- serverengine (2.0.5)
29
- sigdump (~> 0.2.2)
30
- sigdump (0.2.4)
31
- strptime (0.1.9)
32
- test-unit (3.2.3)
33
- power_assert
34
- thread_safe (0.3.6)
35
- tzinfo (1.2.2)
36
- thread_safe (~> 0.1)
37
- tzinfo-data (1.2017.1)
38
- tzinfo (>= 1.0.0)
39
- yajl-ruby (1.3.0)
40
-
41
- PLATFORMS
42
- ruby
43
-
44
- DEPENDENCIES
45
- bundler (~> 1.14)
46
- fluent-plugin-logentries_ssl!
47
- mocha
48
- rake (~> 12.0)
49
- test-unit (~> 3.0)
50
-
51
- BUNDLED WITH
52
- 1.14.6