fluent-plugin-grafana-loki 1.2.18 → 1.2.19
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 +9 -0
- data/lib/fluent/plugin/out_loki.rb +28 -26
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1ebd917165346591d6426c54b36d736fedd78febe444ba9d8bc8e1ceb9d168d
|
4
|
+
data.tar.gz: 631078fe62f397592b9fdc0db07d895c9e74aefd3c2dc06c13949eb05b7229ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4464b1422ca11a5f172b77bdb136e5c26c86a6dc7b1fe7072fcf72bbf613249fd0611864efafd6c87252491836a161670a7ecdb38bd4d83a7a0618027730c764
|
7
|
+
data.tar.gz: 1eff1349f98f245444b29bbaba14122f836d8689caa1b9788c2bfe634ae12f2096475518e0766ced2c3581cbdcbb70a94337789e174ccffd96a11466f4b638eb
|
data/README.md
CHANGED
@@ -82,6 +82,15 @@ The expected output is:
|
|
82
82
|
]
|
83
83
|
```
|
84
84
|
|
85
|
+
## Build and publish gem
|
86
|
+
|
87
|
+
To build and publish a gem to
|
88
|
+
[rubygems](https://rubygems.org/gems/fluent-plugin-grafana-loki) you first need
|
89
|
+
to update the version in the `fluent-plugin-grafana-loki.gemspec` file.
|
90
|
+
Then update the `VERSION` variable in the `Makefile` to match the new version number.
|
91
|
+
Create a PR with the changes against the `main` branch und run `make
|
92
|
+
fluentd-plugin-push` from the root of the project once the PR has been merged.
|
93
|
+
|
85
94
|
## Copyright
|
86
95
|
|
87
96
|
* Copyright(c) 2018- Grafana Labs
|
@@ -73,15 +73,19 @@ module Fluent
|
|
73
73
|
desc 'if a record only has 1 key, then just set the log line to the value and discard the key.'
|
74
74
|
config_param :drop_single_key, :bool, default: false
|
75
75
|
|
76
|
+
desc 'whether or not to include the fluentd_thread label when multiple threads are used for flushing'
|
77
|
+
config_param :include_thread_label, :bool, default: true
|
78
|
+
|
76
79
|
config_section :buffer do
|
77
80
|
config_set_default :@type, DEFAULT_BUFFER_TYPE
|
78
81
|
config_set_default :chunk_keys, []
|
79
82
|
end
|
80
83
|
|
81
|
-
|
84
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
85
|
+
def configure(conf)
|
82
86
|
compat_parameters_convert(conf, :buffer)
|
83
87
|
super
|
84
|
-
@uri = URI.parse(@url
|
88
|
+
@uri = URI.parse("#{@url}/loki/api/v1/push")
|
85
89
|
unless @uri.is_a?(URI::HTTP) || @uri.is_a?(URI::HTTPS)
|
86
90
|
raise Fluent::ConfigError, 'URL parameter must have HTTP/HTTPS scheme'
|
87
91
|
end
|
@@ -105,25 +109,24 @@ module Fluent
|
|
105
109
|
validate_client_cert_key
|
106
110
|
end
|
107
111
|
|
108
|
-
|
112
|
+
if !@bearer_token_file.nil? && !File.exist?(@bearer_token_file)
|
113
|
+
raise "bearer_token_file #{@bearer_token_file} not found"
|
114
|
+
end
|
109
115
|
|
110
116
|
@auth_token_bearer = nil
|
111
|
-
|
112
|
-
|
113
|
-
raise "bearer_token_file #{@bearer_token_file} not found"
|
114
|
-
end
|
117
|
+
unless @bearer_token_file.nil?
|
118
|
+
raise "bearer_token_file #{@bearer_token_file} not found" unless File.exist?(@bearer_token_file)
|
115
119
|
|
116
120
|
# Read the file once, assume long-lived authentication token.
|
117
121
|
@auth_token_bearer = File.read(@bearer_token_file)
|
118
|
-
if @auth_token_bearer.empty?
|
119
|
-
|
120
|
-
end
|
122
|
+
raise "bearer_token_file #{@bearer_token_file} is empty" if @auth_token_bearer.empty?
|
123
|
+
|
121
124
|
log.info "will use Bearer token from bearer_token_file #{@bearer_token_file} in Authorization header"
|
122
125
|
end
|
123
126
|
|
124
|
-
|
125
127
|
raise "CA certificate file #{@ca_cert} not found" if !@ca_cert.nil? && !File.exist?(@ca_cert)
|
126
128
|
end
|
129
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
127
130
|
|
128
131
|
def client_cert_configured?
|
129
132
|
!@key.nil? && !@cert.nil?
|
@@ -201,8 +204,7 @@ module Fluent
|
|
201
204
|
def generic_to_loki(chunk)
|
202
205
|
# log.debug("GenericToLoki: converting #{chunk}")
|
203
206
|
streams = chunk_to_loki(chunk)
|
204
|
-
|
205
|
-
payload
|
207
|
+
payload_builder(streams)
|
206
208
|
end
|
207
209
|
|
208
210
|
private
|
@@ -212,7 +214,7 @@ module Fluent
|
|
212
214
|
@uri.request_uri
|
213
215
|
)
|
214
216
|
req.add_field('Content-Type', 'application/json')
|
215
|
-
req.add_field('Authorization', "Bearer #{@auth_token_bearer}")
|
217
|
+
req.add_field('Authorization', "Bearer #{@auth_token_bearer}") unless @auth_token_bearer.nil?
|
216
218
|
req.add_field('X-Scope-OrgID', tenant) if tenant
|
217
219
|
req.body = Yajl.dump(body)
|
218
220
|
req.basic_auth(@username, @password) if @username
|
@@ -238,7 +240,7 @@ module Fluent
|
|
238
240
|
data_labels = {} if data_labels.nil?
|
239
241
|
data_labels = data_labels.merge(@extra_labels)
|
240
242
|
# sanitize label values
|
241
|
-
data_labels.each { |k, v| formatted_labels[k] = v.gsub('"', '\\"') if v
|
243
|
+
data_labels.each { |k, v| formatted_labels[k] = v.gsub('"', '\\"') if v.is_a?(String) }
|
242
244
|
formatted_labels
|
243
245
|
end
|
244
246
|
|
@@ -267,6 +269,7 @@ module Fluent
|
|
267
269
|
end
|
268
270
|
end
|
269
271
|
|
272
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
270
273
|
def record_to_line(record)
|
271
274
|
line = ''
|
272
275
|
if @drop_single_key && record.keys.length == 1
|
@@ -279,11 +282,9 @@ module Fluent
|
|
279
282
|
formatted_labels = []
|
280
283
|
record.each do |k, v|
|
281
284
|
# Remove non UTF-8 characters by force-encoding the string
|
282
|
-
if v.is_a?(String)
|
283
|
-
v = v.encode('utf-8', invalid: :replace)
|
284
|
-
end
|
285
|
+
v = v.encode('utf-8', invalid: :replace, undef: :replace, replace: '?') if v.is_a?(String)
|
285
286
|
# Escape double quotes and backslashes by prefixing them with a backslash
|
286
|
-
v = v.to_s.gsub(
|
287
|
+
v = v.to_s.gsub(/(["\\])/, '\\\\\1')
|
287
288
|
if v.include?(' ') || v.include?('=')
|
288
289
|
formatted_labels.push(%(#{k}="#{v}"))
|
289
290
|
else
|
@@ -295,25 +296,25 @@ module Fluent
|
|
295
296
|
end
|
296
297
|
line
|
297
298
|
end
|
299
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
298
300
|
|
299
301
|
# convert a line to loki line with labels
|
302
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
300
303
|
def line_to_loki(record)
|
301
304
|
chunk_labels = {}
|
302
305
|
line = ''
|
303
306
|
if record.is_a?(Hash)
|
304
307
|
@record_accessors&.each do |name, accessor|
|
305
|
-
new_key = name.gsub(%r{[
|
308
|
+
new_key = name.gsub(%r{[.\-/]}, '_')
|
306
309
|
chunk_labels[new_key] = accessor.call(record)
|
307
310
|
accessor.delete(record)
|
308
311
|
end
|
309
312
|
|
310
313
|
if @extract_kubernetes_labels && record.key?('kubernetes')
|
311
314
|
kubernetes_labels = record['kubernetes']['labels']
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
chunk_labels[new_key] = kubernetes_labels[l]
|
316
|
-
end
|
315
|
+
kubernetes_labels&.each_key do |l|
|
316
|
+
new_key = l.gsub(%r{[.\-/]}, '_')
|
317
|
+
chunk_labels[new_key] = kubernetes_labels[l]
|
317
318
|
end
|
318
319
|
end
|
319
320
|
|
@@ -332,7 +333,7 @@ module Fluent
|
|
332
333
|
# unique per flush thread
|
333
334
|
# note that flush thread != fluentd worker. if you use multiple workers you still need to
|
334
335
|
# add the worker id as a label
|
335
|
-
if @buffer_config.flush_thread_count > 1
|
336
|
+
if @include_thread_label && @buffer_config.flush_thread_count > 1
|
336
337
|
chunk_labels['fluentd_thread'] = Thread.current[:_fluentd_plugin_helper_thread_title].to_s
|
337
338
|
end
|
338
339
|
|
@@ -342,6 +343,7 @@ module Fluent
|
|
342
343
|
labels: chunk_labels
|
343
344
|
}
|
344
345
|
end
|
346
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
345
347
|
|
346
348
|
# iterate through each chunk and create a loki stream entry
|
347
349
|
def chunk_to_loki(chunk)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-grafana-loki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- woodsaj
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-11-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fluentd
|
@@ -141,16 +141,16 @@ require_paths:
|
|
141
141
|
- lib
|
142
142
|
required_ruby_version: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
|
-
- - "
|
144
|
+
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
146
|
+
version: '2.7'
|
147
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - ">="
|
150
150
|
- !ruby/object:Gem::Version
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
|
-
rubygems_version: 3.
|
153
|
+
rubygems_version: 3.1.6
|
154
154
|
signing_key:
|
155
155
|
specification_version: 4
|
156
156
|
summary: Output plugin to ship logs to a Grafana Loki server
|