logstash-output-loki 1.0.1 → 1.0.3

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
  SHA256:
3
- metadata.gz: 5d3ae7289992fc6a6b98db3f5f1d929041656f2cd1e7e53915d48df9a8bf216b
4
- data.tar.gz: 21e0b37676d7f6d0bca071bd2644a8ce96370e1c62efbf26becb3bce1de63f53
3
+ metadata.gz: a76f3826de04d39e57f06c522125adfc150e1b9c44dee915cb5a220e829b5ae6
4
+ data.tar.gz: d4f881165097a6c04dcef15eca32f3570f0d35453a16713e5da1a50e022876d0
5
5
  SHA512:
6
- metadata.gz: 74e562693367ffcae0a7c639185ca75a984a156a7b7d8c7c61626b17ea01e20470901a2847230aff5f89d7b800f14cdc35ed82be93dd865af91d54548332dbf2
7
- data.tar.gz: 9caf43738978ad056df2661460452c7059bd8a4c646f6e9949b3c7ee492b57ec1d0fa9320df02748f928fe4b002404ec2cfa75c0e9f4d78465606d38088dc8d7
6
+ metadata.gz: 706a86a1852e2b2e97bbd340904b1a0a72751beca4ca4257bfbd66683e0c3a7fe5a54d273666c2da98947b84270b4e9544fe36b6e1742877ccffcbf67fe090bc
7
+ data.tar.gz: 5710b40ac392fa8e82c29343f22b444ce12284023497da3d0cb9c28049b81811ece3bcf431e5b948b7c60dd29c941dcd3c508289fc9a2d49faf5331eda893f69
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Contributing to Loki Logstash Output Plugin
2
2
 
3
- For information about hwo to use this plugin see this [documentation](../../docs/clients/logstash/README.md).
3
+ For information about how to use this plugin see this [documentation](../../docs/sources/clients/logstash/_index.md).
4
4
 
5
5
  ## Install dependencies
6
6
 
7
- First you need to setup JRuby environment to build this plugin. Refer https://github.com/rbenv/rbenv for setting up your rbenv environment.
7
+ First, make sure you have JDK version `8` or `11` installed and you have set the `JAVA_HOME` environment variable.
8
+
9
+ You need to setup JRuby environment to build this plugin. Refer https://github.com/rbenv/rbenv for setting up your rbenv environment.
8
10
 
9
11
  After setting up `rbenv`. Install JRuby
10
12
 
@@ -20,7 +22,7 @@ ruby --version
20
22
  jruby 9.2.10
21
23
  ```
22
24
 
23
- You should use make sure you are running jruby and not ruby. If the command below still shows ruby and not jruby, check that PATH contains `$HOME/.rbenv/shims` and `$HOME/.rbenv/bin`. Also verify that you have this in your bash profile:
25
+ You should make sure you are running `jruby` and not `ruby`. If the command `ruby --version` still shows `ruby` and not `jruby`, check that PATH contains `$HOME/.rbenv/shims` and `$HOME/.rbenv/bin`. Also verify that you have this in your bash profile:
24
26
 
25
27
  ```bash
26
28
  export PATH="$HOME/.rbenv/bin:$PATH"
@@ -32,7 +34,7 @@ Then install bundler
32
34
 
33
35
  Follow those instructions to [install logstash](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html) before moving to the next section.
34
36
 
35
- ## Install dependencies and Build plugin
37
+ ## Build and test the plugin
36
38
 
37
39
  ### Install required packages
38
40
 
@@ -4,7 +4,6 @@ require "logstash/outputs/loki/entry"
4
4
  require "logstash/outputs/loki/batch"
5
5
  require "logstash/namespace"
6
6
  require 'net/http'
7
- require 'concurrent-edge'
8
7
  require 'time'
9
8
  require 'uri'
10
9
  require 'json'
@@ -30,6 +29,9 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
30
29
  ## 'TLS'
31
30
  config :ca_cert, :validate => :path, :required => false
32
31
 
32
+ ## 'Disable server certificate verification'
33
+ config :insecure_skip_verify, :validate => :boolean, :default => false, :required => false
34
+
33
35
  ## 'Loki Tenant ID'
34
36
  config :tenant_id, :validate => :string, :required => false
35
37
 
@@ -45,8 +47,8 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
45
47
  ## 'Backoff configuration. Initial backoff time between retries. Default 1s'
46
48
  config :min_delay, :validate => :number, :default => 1, :required => false
47
49
 
48
- ## 'Backoff configuration. Maximum backoff time between retries. Default 300s'
49
- config :max_delay, :validate => :number, :default => 300, :required => false
50
+ ## 'Backoff configuration. Maximum backoff time between retries. Default 300s'
51
+ config :max_delay, :validate => :number, :default => 300, :required => false
50
52
 
51
53
  ## 'Backoff configuration. Maximum number of retries to do'
52
54
  config :retries, :validate => :number, :default => 10, :required => false
@@ -65,10 +67,10 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
65
67
 
66
68
  @logger.info("Loki output plugin", :class => self.class.name)
67
69
 
68
- # initialize channels
69
- @Channel = Concurrent::Channel
70
- @entries = @Channel.new
71
- @stop = @Channel.new
70
+ # initialize Queue and Mutex
71
+ @entries = Queue.new
72
+ @mutex = Mutex.new
73
+ @stop = false
72
74
 
73
75
  # create nil batch object.
74
76
  @batch = nil
@@ -79,7 +81,52 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
79
81
  validate_ssl_key
80
82
  end
81
83
 
82
- @Channel.go{run()}
84
+ # start batch_max_wait and batch_max_size threads
85
+ @batch_wait_thread = Thread.new{max_batch_wait()}
86
+ @batch_size_thread = Thread.new{max_batch_size()}
87
+ end
88
+
89
+ def max_batch_size
90
+ loop do
91
+ @mutex.synchronize do
92
+ return if @stop
93
+ end
94
+
95
+ e = @entries.deq
96
+ return if e.nil?
97
+
98
+ @mutex.synchronize do
99
+ if !add_entry_to_batch(e)
100
+ @logger.debug("Max batch_size is reached. Sending batch to loki")
101
+ send(@batch)
102
+ @batch = Batch.new(e)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def max_batch_wait
109
+ # minimum wait frequency is 10 milliseconds
110
+ min_wait_checkfrequency = 1/100
111
+ max_wait_checkfrequency = @batch_wait
112
+ if max_wait_checkfrequency < min_wait_checkfrequency
113
+ max_wait_checkfrequency = min_wait_checkfrequency
114
+ end
115
+
116
+ loop do
117
+ @mutex.synchronize do
118
+ return if @stop
119
+ end
120
+
121
+ sleep(max_wait_checkfrequency)
122
+ if is_batch_expired
123
+ @mutex.synchronize do
124
+ @logger.debug("Max batch_wait time is reached. Sending batch to loki")
125
+ send(@batch)
126
+ @batch = nil
127
+ end
128
+ end
129
+ end
83
130
  end
84
131
 
85
132
  def ssl_cert?
@@ -102,6 +149,13 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
102
149
  use_ssl: uri.scheme == 'https'
103
150
  }
104
151
 
152
+ # disable server certificate verification
153
+ if @insecure_skip_verify
154
+ opts = opts.merge(
155
+ verify_mode: OpenSSL::SSL::VERIFY_NONE
156
+ )
157
+ end
158
+
105
159
  if !@cert.nil? && !@key.nil?
106
160
  opts = opts.merge(
107
161
  verify_mode: OpenSSL::SSL::VERIFY_PEER,
@@ -118,39 +172,7 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
118
172
  opts
119
173
  end
120
174
 
121
- def run()
122
- min_wait_checkfrequency = 1/100 #1 millisecond
123
- max_wait_checkfrequency = @batch_wait / 10
124
- if max_wait_checkfrequency < min_wait_checkfrequency
125
- max_wait_checkfrequency = min_wait_checkfrequency
126
- end
127
-
128
- @max_wait_check = Concurrent::Channel.tick(max_wait_checkfrequency)
129
- loop do
130
- Concurrent::Channel.select do |s|
131
- s.take(@stop) {
132
- return
133
- }
134
- s.take(@entries) { |e|
135
- if !add_entry_to_batch(e)
136
- @logger.debug("Max batch_size is reached. Sending batch to loki")
137
- send(@batch)
138
- @batch = Batch.new(e)
139
- end
140
- }
141
- s.take(@max_wait_check) {
142
- # Send batch if max wait time has been reached
143
- if is_batch_expired
144
- @logger.debug("Max batch_wait time is reached. Sending batch to loki")
145
- send(@batch)
146
- @batch = nil
147
- end
148
- }
149
- end
150
- end
151
- end
152
-
153
- # add an entry to the current batch return false if the batch is full
175
+ # Add an entry to the current batch returns false if the batch is full
154
176
  # and the entry can't be added.
155
177
  def add_entry_to_batch(e)
156
178
  line = e.entry['line']
@@ -181,8 +203,11 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
181
203
 
182
204
  def close
183
205
  @entries.close
184
- @max_wait_check.close if !@max_wait_check.nil?
185
- @stop << true # stop will block until it's accepted by the worker.
206
+ @mutex.synchronize do
207
+ @stop = true
208
+ end
209
+ @batch_wait_thread.join
210
+ @batch_size_thread.join
186
211
 
187
212
  # if by any chance we still have a forming batch, we need to send it.
188
213
  send(@batch) if !@batch.nil?
@@ -222,13 +247,13 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
222
247
  raise StandardError.new res
223
248
  rescue StandardError => e
224
249
  retry_count += 1
225
- @logger.warn("Failed to send batch attempt: #{retry_count}/#{@retries}", :error_inspect => e.inspect, :error => e)
250
+ @logger.warn("Failed to send batch, attempt: #{retry_count}/#{@retries}", :error_inspect => e.inspect, :error => e)
226
251
  if retry_count < @retries
227
252
  sleep delay
228
- if (delay * 2 - delay) > @max_delay
229
- delay = delay
230
- else
253
+ if delay * 2 <= @max_delay
231
254
  delay = delay * 2
255
+ else
256
+ delay = @max_delay
232
257
  end
233
258
  retry
234
259
  else
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
- s.name = 'logstash-output-loki'
3
- s.version = '1.0.1'
2
+ s.name = 'logstash-output-loki'
3
+ s.version = '1.0.3'
4
4
  s.authors = ['Aditya C S','Cyril Tovena']
5
5
  s.email = ['aditya.gnu@gmail.com','cyril.tovena@grafana.com']
6
6
 
@@ -22,6 +22,5 @@ Gem::Specification.new do |s|
22
22
  #
23
23
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
24
24
  s.add_runtime_dependency "logstash-codec-plain", "3.0.6"
25
- s.add_runtime_dependency "concurrent-ruby-edge", "0.6.0"
26
25
  s.add_development_dependency 'logstash-devutils', "2.0.2"
27
26
  end
@@ -95,7 +95,7 @@ describe LogStash::Outputs::Loki do
95
95
  it 'should send entry if batch size reached with no tenant' do
96
96
  loki = LogStash::Outputs::Loki.new(simple_loki_config.merge!({'batch_wait'=>0.5,'batch_size'=>10}))
97
97
  loki.register
98
- sent = Concurrent::Channel.new(capacity: 3)
98
+ sent = Queue.new
99
99
  allow(loki).to receive(:send) do |batch|
100
100
  Thread.new do
101
101
  sent << batch
@@ -103,14 +103,14 @@ describe LogStash::Outputs::Loki do
103
103
  end
104
104
  loki.receive(event)
105
105
  loki.receive(event)
106
+ sent.deq
107
+ sent.deq
106
108
  loki.close
107
- ~sent
108
- ~sent
109
109
  end
110
110
  it 'should send entry while closing' do
111
111
  loki = LogStash::Outputs::Loki.new(simple_loki_config.merge!({'batch_wait'=>10,'batch_size'=>10}))
112
112
  loki.register
113
- sent = Concurrent::Channel.new(capacity: 3)
113
+ sent = Queue.new
114
114
  allow(loki).to receive(:send) do | batch|
115
115
  Thread.new do
116
116
  sent << batch
@@ -118,20 +118,21 @@ describe LogStash::Outputs::Loki do
118
118
  end
119
119
  loki.receive(event)
120
120
  loki.close
121
- ~sent
121
+ sent.deq
122
122
  end
123
123
  it 'should send entry when batch is expiring' do
124
124
  loki = LogStash::Outputs::Loki.new(simple_loki_config.merge!({'batch_wait'=>0.5,'batch_size'=>10}))
125
125
  loki.register
126
- sent = Concurrent::Channel.new(capacity: 3)
126
+ sent = Queue.new
127
127
  allow(loki).to receive(:send) do | batch|
128
128
  Thread.new do
129
129
  sent << batch
130
130
  end
131
131
  end
132
132
  loki.receive(event)
133
- ~sent
134
- expect(loki.batch).to be_nil
133
+ sent.deq
134
+ sleep(0.01) # Adding a minimal sleep. In few cases @batch=nil might happen after evaluating for nil
135
+ expect(loki.batch).to be_nil
135
136
  loki.close
136
137
  end
137
138
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-loki
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aditya C S
8
8
  - Cyril Tovena
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-16 00:00:00.000000000 Z
12
+ date: 2020-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
+ name: logstash-core-plugin-api
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - ">="
@@ -20,7 +21,6 @@ dependencies:
20
21
  - - "<="
21
22
  - !ruby/object:Gem::Version
22
23
  version: '2.99'
23
- name: logstash-core-plugin-api
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -32,12 +32,12 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2.99'
34
34
  - !ruby/object:Gem::Dependency
35
+ name: logstash-codec-plain
35
36
  requirement: !ruby/object:Gem::Requirement
36
37
  requirements:
37
38
  - - '='
38
39
  - !ruby/object:Gem::Version
39
40
  version: 3.0.6
40
- name: logstash-codec-plain
41
41
  type: :runtime
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
@@ -46,26 +46,12 @@ dependencies:
46
46
  - !ruby/object:Gem::Version
47
47
  version: 3.0.6
48
48
  - !ruby/object:Gem::Dependency
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - '='
52
- - !ruby/object:Gem::Version
53
- version: 0.6.0
54
- name: concurrent-ruby-edge
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 0.6.0
62
- - !ruby/object:Gem::Dependency
49
+ name: logstash-devutils
63
50
  requirement: !ruby/object:Gem::Requirement
64
51
  requirements:
65
52
  - - '='
66
53
  - !ruby/object:Gem::Version
67
54
  version: 2.0.2
68
- name: logstash-devutils
69
55
  type: :development
70
56
  prerelease: false
71
57
  version_requirements: !ruby/object:Gem::Requirement
@@ -95,7 +81,7 @@ licenses:
95
81
  metadata:
96
82
  logstash_plugin: 'true'
97
83
  logstash_group: output
98
- post_install_message:
84
+ post_install_message:
99
85
  rdoc_options: []
100
86
  require_paths:
101
87
  - lib
@@ -110,8 +96,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
96
  - !ruby/object:Gem::Version
111
97
  version: '0'
112
98
  requirements: []
113
- rubygems_version: 3.0.6
114
- signing_key:
99
+ rubygems_version: 3.0.3
100
+ signing_key:
115
101
  specification_version: 4
116
102
  summary: Output plugin to ship logs to a Grafana Loki server
117
103
  test_files: