fluent-plugin-logzio 0.1.0 → 0.2.0.pre.test1

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: de65dcc352aca420ba2469b1c31c0c3f135309b7728d501ca1eb27e09259e322
4
- data.tar.gz: b92016ff7b59405e6e9d45b24ae87fb0d60d396b06bc6ae81b681991d45a56ea
3
+ metadata.gz: 8ff307f46dc9f34f4f4cdd60374c340c81ab328c6e1485d8cf77d7c833709b9e
4
+ data.tar.gz: 286c954bb9c4a1e1ead99edf25e96a77556254b58afdb74dcccba4773e1a0a10
5
5
  SHA512:
6
- metadata.gz: f167bd4d0d6c60612dff909d2490d734808eb07894c7396af321351ae741c8fc9b60193209ff92819a50f74089c4d72f91bf24393e27f74a2da3246fef22d5a3
7
- data.tar.gz: ccb0be4ca90d64ac4626adc6efbc05f46fde74bad6b505535c298f6b824a6e4e8d349a21128cddd211c212f730f9501c75b76c5f9c02efed096ea05e44a967de
6
+ metadata.gz: 85ff70985c0fda5b6220c8cf6e0fa1306525940828c03c75d097bebe9cda65e6e6097f020454c06e4b17137d02a7b77c1bf492c5e0261f2dad45336357e554ab
7
+ data.tar.gz: dafe99b38c2d4f9e33efa7c71334d21c6493318b9d407a90cb13a5d9b0877df36af0bc047f166697ec0b816be3b79018298a6a4742a78191c5836dfd275b0515
data/README.md CHANGED
@@ -70,11 +70,21 @@ This is an **example** only. Your needs in production may vary!
70
70
  * **bulk_limit** Limit to the size of the Logz.io upload bulk. Defaults to 1000000 bytes leaving about 24kB for overhead.
71
71
  * **bulk_limit_warning_limit** Limit to the size of the Logz.io warning message when a record exceeds bulk_limit to prevent a recursion when Fluent warnings are sent to the Logz.io output. Defaults to nil (no truncation).
72
72
  * **proxy_uri** Your proxy uri. Default is nil. For example: "`my.ip:12345`".
73
- * **proxy_cert** Your proxy cert. Default is nil
74
- * **gzip** should the plugin ship the logs in gzip compression. Default is false
73
+ * **proxy_cert** Your proxy cert. Default is nil.
74
+ * **gzip** should the plugin ship the logs in gzip compression. Default is false.
75
+
76
+
77
+ ## Plugin metrics:
78
+
79
+ | Metric Name | Description | Type | Example |
80
+ | --- | --- | --- | --- |
81
+ | `logzio_status_codes` | Status codes received from Logz.io | Gauge | `logzio_status_codes{type="logzio_buffered",plugin_id="out_logzio",status_code="500"}` |
75
82
 
76
83
 
77
84
  ## Release Notes
85
+ - **0.2.0**:
86
+ - Do not retry on 400 and 401. For 400 - try to fix log and resend.
87
+ - Generate a metric (`logzio_status_codes`) for response codes from Logz.io.
78
88
  - **0.1.0**:
79
89
  - Use fluentd's retry instead of retry in code (raise exception on non-2xx response).
80
90
  - 0.0.22: Update gem `net-http-persistent` to 4.x.
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'fluent-plugin-logzio'
7
- s.version = '0.1.0'
7
+ s.version = '0.2.0-test1'
8
8
  s.authors = ['Yury Kotov', 'Roi Rav-Hon', 'Arcadiy Ivanov', 'Miri Bar']
9
9
  s.email = ['bairkan@gmail.com', 'roi@logz.io', 'arcadiy@ivanov.biz', 'miri.ignatiev@logz.io']
10
10
  s.homepage = 'https://github.com/logzio/fluent-plugin-logzio'
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_dependency 'net-http-persistent', '~> 4.0'
23
23
  s.add_runtime_dependency 'fluentd', ['>= 0.14.0', '< 2']
24
+ s.add_runtime_dependency 'prometheus-client', '>= 2.1.0'
24
25
  s.add_development_dependency 'rake', '~> 12.3'
25
26
  s.add_development_dependency 'bundler', '~> 1.16'
26
27
  s.add_development_dependency 'rspec', '~> 3.7'
@@ -6,6 +6,7 @@ require 'stringio'
6
6
  module Fluent::Plugin
7
7
  class LogzioOutputBuffered < Output
8
8
  Fluent::Plugin.register_output('logzio_buffered', self)
9
+ class RetryableResponse < StandardError; end
9
10
 
10
11
  helpers :compat_parameters
11
12
 
@@ -37,9 +38,23 @@ module Fluent::Plugin
37
38
  log.debug "Proxy #{@proxy_cert}"
38
39
  ENV['SSL_CERT_FILE'] = @proxy_cert
39
40
  end
41
+ @metric_labels = {
42
+ type: 'logzio_buffered',
43
+ plugin_id: 'out_logzio',
44
+ }
45
+ @metrics = {
46
+ status_codes: get_gauge(
47
+ :logzio_status_codes,
48
+ 'Status codes received from Logz.io', {"status_code":""}),
49
+ }
40
50
 
41
51
  end
42
52
 
53
+ def initialize
54
+ super
55
+ @registry = ::Prometheus::Client.registry
56
+ end
57
+
43
58
  def start
44
59
  super
45
60
  require 'net/http/persistent'
@@ -121,6 +136,27 @@ module Fluent::Plugin
121
136
  end
122
137
 
123
138
  def send_bulk(bulk_records, bulk_size)
139
+ response = do_post(bulk_records, bulk_size)
140
+
141
+ @metrics[:status_codes].increment(labels: merge_labels({'status_code': response.code.to_s}))
142
+ log.info "Status code from logzio: #{response.code}"
143
+
144
+ if not response.code.start_with?('2')
145
+ log.info "here here here"
146
+ if response.code == '400'
147
+ log.warn "Received #{response.code} from Logzio. Some logs may be malformed or too long. Valid logs were succesfully sent into the system. Will try to proccess and send oversized logs. Response body: #{response.body}"
148
+ process_code_400(bulk_records, Yajl.load(response.body))
149
+ elsif response.code == '401'
150
+ log.error "Received #{response.code} from Logzio. Unauthorized, please check your logs shipping token. Will not retry sending. Response body: #{response.body}"
151
+ else
152
+ log.debug "Failed request body: #{post.body}"
153
+ log.error "Error while sending POST to #{@uri}: #{response.body}"
154
+ raise RetryableResponse, "Logzio listener returned (#{response.code}) for #{@uri}: #{response.body}", []
155
+ end
156
+ end
157
+ end
158
+
159
+ def do_post(bulk_records, bulk_size)
124
160
  log.debug "Sending a bulk of #{bulk_records.size} records, size #{bulk_size}B to Logz.io"
125
161
 
126
162
  # Setting our request
@@ -136,16 +172,39 @@ module Fluent::Plugin
136
172
  response = @http.request @uri, post
137
173
  rescue Net::HTTP::Persistent::Error => e
138
174
  raise e.cause
175
+ return response
139
176
  end
177
+ end
140
178
 
141
- resp_err = response.code.to_s.start_with?('4') || response.code.to_s.start_with?('5')
142
-
143
- if not response.code.start_with?('2')
144
- log.debug "Failed request body: #{post.body}"
145
- log.error "Error while sending POST to #{@uri}: #{response.body}"
179
+ def process_code_400(bulk_records, response_body)
180
+ max_log_field_size_bytes = 32000
181
+ oversized_logs_counter = response_body['oversizedLines'].to_i
182
+ new_bulk = []
183
+ for log_record in bulk_records
184
+ log.info "Oversized lines: #{oversized_logs_counter}" # todo
185
+ if oversized_logs_counter == 0
186
+ log.debug "No malformed lines, breaking"
187
+ break
188
+ end
189
+ new_log = Yajl.load(log_record)
190
+ msg_size = new_log['message'].size
191
+ # Handle oversized log:
192
+ if msg_size >= max_log_field_size_bytes
193
+ new_log['message'] = new_log['message'][0, max_log_field_size_bytes - 1]
194
+ log.debug "new log: #{new_log}"
195
+ new_bulk.append(Yajl.dump(new_log))
196
+ oversized_logs_counter -= 1
197
+ end
198
+ end
199
+ if new_bulk.size > 0
200
+ log.debug "Number of fixed bad logs to send: #{new_bulk.size}"
201
+ response = do_post(new_bulk, new_bulk.size)
202
+ if response.code.start_with?('2')
203
+ log.info "Succesfully sent bad logs"
204
+ else
205
+ log.warn "While trying to send fixed bad logs, got #{response.code} from Logz.io, will not try to re-send"
206
+ end
146
207
  end
147
-
148
- raise "Logzio listener returned (#{response.code}) for #{@uri}: #{response.body}" if resp_err
149
208
  end
150
209
 
151
210
  def compress(string)
@@ -155,5 +214,17 @@ module Fluent::Plugin
155
214
  w_gz.close
156
215
  wio.string
157
216
  end
217
+
218
+ def merge_labels(extra_labels= {})
219
+ @metric_labels.merge extra_labels
220
+ end
221
+
222
+ def get_gauge(name, docstring, extra_labels = {})
223
+ if @registry.exist?(name)
224
+ @registry.get(name)
225
+ else
226
+ @registry.gauge(name, docstring: docstring, labels: @metric_labels.keys + extra_labels.keys)
227
+ end
228
+ end
158
229
  end
159
230
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-logzio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0.pre.test1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Kotov
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-05-01 00:00:00.000000000 Z
14
+ date: 2023-07-12 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: net-http-persistent
@@ -47,6 +47,20 @@ dependencies:
47
47
  - - "<"
48
48
  - !ruby/object:Gem::Version
49
49
  version: '2'
50
+ - !ruby/object:Gem::Dependency
51
+ name: prometheus-client
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 2.1.0
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 2.1.0
50
64
  - !ruby/object:Gem::Dependency
51
65
  name: rake
52
66
  requirement: !ruby/object:Gem::Requirement
@@ -142,9 +156,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
156
  version: 2.1.0
143
157
  required_rubygems_version: !ruby/object:Gem::Requirement
144
158
  requirements:
145
- - - ">="
159
+ - - ">"
146
160
  - !ruby/object:Gem::Version
147
- version: '0'
161
+ version: 1.3.1
148
162
  requirements: []
149
163
  rubygems_version: 3.0.3.1
150
164
  signing_key: