logstash-output-loki-tenants 1.0.3 → 1.0.4
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/README.md +18 -1
- data/lib/logstash/outputs/loki.rb +14 -14
- data/logstash-output-loki.gemspec +1 -1
- data/spec/outputs/loki_spec.rb +49 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f63ff2d7beb2921dd555f62616813a045cca6dff4d0ca44ab290f38b4ff593f
|
4
|
+
data.tar.gz: 3d5864cb9c48e62b563c609c55d4b59e75976b5ce9542d17cc9d6ca7ac3c29ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c37c14272d5241ee466626eced3e9fe22ed85a8b38dd25e67e000c39e70cea5c49aefb354465cb8068b2b504afd73d8c2ce4bcf60086ecb4b03961aa4a671c23
|
7
|
+
data.tar.gz: 8eccc504913b8d3e62edeb2fc5cd57034511e50b523af3ec820646214d474e2a19f57e6ef03c3693d237d96022b750e9e84caa8737c0894cffcef8f09e39b385
|
data/README.md
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# Fork of Loki Logstash Output Plugin
|
2
|
+
|
3
|
+
Added features:
|
4
|
+
|
5
|
+
* split batches by the tenant attribute. Use ‘default’ if attribute not set.
|
6
|
+
* add X-Scope-OrgID header based on ‘tenant' message field.
|
7
|
+
* DO not set header if 'tenant’ attribute is empty.
|
8
|
+
|
9
|
+
Available from <https://rubygems.org/gems/logstash-output-loki-tenants>
|
10
|
+
|
11
|
+
## Building and pushing gem
|
12
|
+
1. `gem build logstash-output-loki.gemspec`
|
13
|
+
2. Push desired build version `gem push logstash-output-loki-tenants-{VERSION}.gem`
|
14
|
+
- In case of massage 'Repushing of gem versions is not allowed.' Raise the plugin version in logstash-output-loki.gemspec
|
15
|
+
- Rebuild the plugin
|
16
|
+
- Push proper version
|
17
|
+
|
18
|
+
## Contributing to Loki Logstash Output Plugin
|
2
19
|
|
3
20
|
For information about how to use this plugin see this [documentation](../../docs/sources/clients/logstash/_index.md).
|
4
21
|
|
@@ -69,7 +69,7 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
69
69
|
@logger.info("Loki output plugin", :class => self.class.name)
|
70
70
|
|
71
71
|
# initialize Queue and Mutex
|
72
|
-
@entries = Queue.new
|
72
|
+
@entries = Queue.new
|
73
73
|
@mutex = Mutex.new
|
74
74
|
@stop = false
|
75
75
|
|
@@ -88,10 +88,10 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
88
88
|
|
89
89
|
end
|
90
90
|
|
91
|
-
def batch(tenant = '
|
91
|
+
def batch(tenant = 'default')
|
92
92
|
return nil if @batches.nil?
|
93
93
|
return @batches[tenant] if !tenant.nil? && !tenant.empty? && @batches.key?(tenant)
|
94
|
-
return @batches['
|
94
|
+
return @batches['default'] if @batches.key?('default')
|
95
95
|
return nil
|
96
96
|
end
|
97
97
|
|
@@ -100,13 +100,13 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
100
100
|
@mutex.synchronize do
|
101
101
|
return if @stop
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
e = @entries.deq
|
105
105
|
return if e.nil?
|
106
106
|
|
107
107
|
tenant = nil
|
108
108
|
tenant = e.labels['tenant'] if !e.labels.nil? && e.labels.key?('tenant')
|
109
|
-
tenant = '
|
109
|
+
tenant = 'default' if tenant.nil? or tenant.empty?
|
110
110
|
|
111
111
|
@mutex.synchronize do
|
112
112
|
if !add_entry_to_batch(e, tenant)
|
@@ -190,12 +190,12 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
190
190
|
|
191
191
|
# Add an entry to the current batch returns false if the batch is full
|
192
192
|
# and the entry can't be added.
|
193
|
-
def add_entry_to_batch(e, tenant = '
|
193
|
+
def add_entry_to_batch(e, tenant = 'default')
|
194
194
|
line = e.entry['line']
|
195
195
|
# we don't want to send empty lines.
|
196
196
|
return true if line.to_s.strip.empty?
|
197
197
|
|
198
|
-
tenant = '
|
198
|
+
tenant = 'default' if tenant.nil? or tenant.empty?
|
199
199
|
|
200
200
|
if @batches.nil?
|
201
201
|
@batches = Hash.new
|
@@ -214,8 +214,8 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
214
214
|
return true
|
215
215
|
end
|
216
216
|
|
217
|
-
def is_batch_expired(tenant = '
|
218
|
-
tenant = '
|
217
|
+
def is_batch_expired(tenant = 'default')
|
218
|
+
tenant = 'default' if tenant.nil? or tenant.empty?
|
219
219
|
return !@batches.nil? && @batches.key?(tenant) && @batches[tenant].age() >= @batch_wait
|
220
220
|
end
|
221
221
|
|
@@ -231,8 +231,8 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
231
231
|
|
232
232
|
def close
|
233
233
|
@entries.close
|
234
|
-
@mutex.synchronize do
|
235
|
-
@stop = true
|
234
|
+
@mutex.synchronize do
|
235
|
+
@stop = true
|
236
236
|
end
|
237
237
|
@batch_wait_thread.join
|
238
238
|
@batch_size_thread.join
|
@@ -245,7 +245,7 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
245
245
|
@batches = nil
|
246
246
|
end
|
247
247
|
|
248
|
-
def send(batch, tenant = '
|
248
|
+
def send(batch, tenant = 'default')
|
249
249
|
payload = batch.to_json
|
250
250
|
res = loki_http_request(payload, tenant)
|
251
251
|
if res.is_a?(Net::HTTPSuccess)
|
@@ -255,12 +255,12 @@ class LogStash::Outputs::Loki < LogStash::Outputs::Base
|
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
-
def loki_http_request(payload, tenant = '
|
258
|
+
def loki_http_request(payload, tenant = 'default')
|
259
259
|
req = Net::HTTP::Post.new(
|
260
260
|
@uri.request_uri
|
261
261
|
)
|
262
262
|
req.add_field('Content-Type', 'application/json')
|
263
|
-
if !tenant.nil? && !tenant.empty? && !tenant.eql?('
|
263
|
+
if !tenant.nil? && !tenant.empty? && !tenant.eql?('default')
|
264
264
|
req.add_field('X-Scope-OrgID', tenant)
|
265
265
|
elsif !@tenant_id.nil? && !@tenant_id.empty?
|
266
266
|
req.add_field('X-Scope-OrgID', @tenant_id)
|
data/spec/outputs/loki_spec.rb
CHANGED
@@ -35,9 +35,10 @@ describe LogStash::Outputs::Loki do
|
|
35
35
|
plugin = LogStash::Plugin.lookup("output", "loki").new(simple_loki_config)
|
36
36
|
expect(plugin.batch).to eql nil
|
37
37
|
expect(plugin.add_entry_to_batch(entry, "a")).to eql true
|
38
|
-
expect(plugin.add_entry_to_batch(entry, "
|
38
|
+
expect(plugin.add_entry_to_batch(entry, "fake")).to eql true
|
39
39
|
expect(plugin.add_entry_to_batch(entry, nil)).to eql true
|
40
40
|
expect(plugin.add_entry_to_batch(entry, "")).to eql true
|
41
|
+
expect(plugin.add_entry_to_batch(entry, "default")).to eql true
|
41
42
|
expect(plugin.batches.keys.length).to eq 3
|
42
43
|
end
|
43
44
|
|
@@ -58,6 +59,20 @@ describe LogStash::Outputs::Loki do
|
|
58
59
|
expect(plugin.batch.streams[lbs.to_s]['entries'].length).to eq 2
|
59
60
|
expect(plugin.batch.streams[lbs.to_s]['labels']).to eq lbs
|
60
61
|
expect(plugin.batch.size_bytes).to eq 14
|
62
|
+
expect(plugin.batch("default").size_bytes).to eq 14
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should add entry to tenant fake' do
|
66
|
+
plugin = LogStash::Plugin.lookup("output", "loki").new(simple_loki_config)
|
67
|
+
expect(plugin.batch("fake")).to eql nil
|
68
|
+
expect(plugin.add_entry_to_batch(entry, "fake")).to eql true
|
69
|
+
expect(plugin.add_entry_to_batch(entry, "fake")).to eql true
|
70
|
+
expect(plugin.batch("fake")).not_to be_nil
|
71
|
+
expect(plugin.batch).to be_nil
|
72
|
+
expect(plugin.batch("fake").streams.length).to eq 1
|
73
|
+
expect(plugin.batch("fake").streams[lbs.to_s]['entries'].length).to eq 2
|
74
|
+
expect(plugin.batch("fake").streams[lbs.to_s]['labels']).to eq lbs
|
75
|
+
expect(plugin.batch("fake").size_bytes).to eq 14
|
61
76
|
end
|
62
77
|
|
63
78
|
it 'should not add if full' do
|
@@ -97,6 +112,15 @@ describe LogStash::Outputs::Loki do
|
|
97
112
|
sleep(1)
|
98
113
|
expect(loki.is_batch_expired).to be true
|
99
114
|
end
|
115
|
+
it 'should expire if old different tenants' do
|
116
|
+
loki = LogStash::Outputs::Loki.new(simple_loki_config.merge!({'batch_wait'=>0.5}))
|
117
|
+
expect(loki.add_entry_to_batch(entry, "fake")).to eql true
|
118
|
+
sleep(1)
|
119
|
+
expect(loki.add_entry_to_batch(entry, "custom")).to eql true
|
120
|
+
expect(loki.is_batch_expired("fake")).to be true
|
121
|
+
expect(loki.is_batch_expired("custom")).to be false
|
122
|
+
expect(loki.is_batch_expired).to be false
|
123
|
+
end
|
100
124
|
end
|
101
125
|
|
102
126
|
context 'channel' do
|
@@ -174,6 +198,30 @@ describe LogStash::Outputs::Loki do
|
|
174
198
|
loki.send(b, "custom")
|
175
199
|
expect(post).to have_been_requested.times(1)
|
176
200
|
end
|
201
|
+
it 'should send message tenant fake' do
|
202
|
+
conf = {
|
203
|
+
'url'=>'http://localhost:3100/loki/api/v1/push',
|
204
|
+
'username' => 'foo',
|
205
|
+
'password' => 'bar',
|
206
|
+
'tenant_id' => 'custom'
|
207
|
+
}
|
208
|
+
loki = LogStash::Outputs::Loki.new(conf)
|
209
|
+
loki.register
|
210
|
+
b = Batch.new(entry)
|
211
|
+
post = stub_request(:post, "http://localhost:3100/loki/api/v1/push").with(
|
212
|
+
basic_auth: ['foo', 'bar'],
|
213
|
+
body: b.to_json,
|
214
|
+
headers:{
|
215
|
+
'Content-Type' => 'application/json' ,
|
216
|
+
'User-Agent' => 'loki-logstash',
|
217
|
+
'X-Scope-OrgID'=>'fake',
|
218
|
+
'Accept'=>'*/*',
|
219
|
+
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
220
|
+
}
|
221
|
+
)
|
222
|
+
loki.send(b, "fake")
|
223
|
+
expect(post).to have_been_requested.times(1)
|
224
|
+
end
|
177
225
|
it 'should send credentials' do
|
178
226
|
conf = {
|
179
227
|
'url'=>'http://localhost:3100/loki/api/v1/push',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-loki-tenants
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Co.brick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|