logstash-output-sensors_analytics 0.1.2 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04a13a5a7e38d72dba2dc7064a3c567789c7109dc06cc2a7fc5b4fb9d0d0a1eb
4
- data.tar.gz: 46c542e7c46e32f22d30e5d503b3163b29bea49b18ee5161d1d4a28d027e5357
3
+ metadata.gz: bbcf496f3c8862f0febbb3fbb018ee6a4275493437f9d7dd4137794a6e9cd214
4
+ data.tar.gz: fe931cc0014ae67b9bf6e11f0de3a4a8ed6dd2b06c24567f84edc09c11ad8ab3
5
5
  SHA512:
6
- metadata.gz: 6c0bdcb072ceb310f92b25e5da47d89d563c56e5d84fcb99229a6e0136a8d3f76cde19062187c1d965ba61d866ab7518273252e33d98547585eb8529c1998c4e
7
- data.tar.gz: d97909fd5156adc44cdfd2eb35be5479934a9019311095bdcc10378aa7435f39477e51e2d28cea8a10891dc9edd90ed97461d952eff426a559d1d635ce47403a
6
+ metadata.gz: cc258f6d684517793e9fd76f10000ee6c3cf74f6c89dcbe72974eff67e0a4b3956e55906aab5435fab87e1ec02ad10ab432199c7915e50883ddc00d056acb2b6
7
+ data.tar.gz: e86c0cc001ed9c7dba6820b81d99036e672daf2add49ef8dcfc04905931ba212c86b91067110beca6556537e91d4d28815860e4621df6c288533a9b0bc9f3a64
@@ -32,7 +32,7 @@ class LogStash::Outputs::SensorsAnalytics < LogStash::Outputs::Base
32
32
  # 开启 filebeat 状态记录
33
33
  config :enable_filebeat_status_report, :validate => :boolean, :default => true
34
34
 
35
- PLUGIN_VERSION = "0.1.2"
35
+ PLUGIN_VERSION = "0.1.4"
36
36
 
37
37
  public
38
38
 
@@ -116,8 +116,17 @@ class LogStash::Outputs::SensorsAnalytics < LogStash::Outputs::Base
116
116
 
117
117
  buffer_item = @buffer_items[buffer_index(tag)]
118
118
  buffer_item.buffer_receive(record)
119
- rescue
120
- @logger.error("Could not process record", :record => e.to_s)
119
+ rescue => ex
120
+
121
+ @logger.error("Could not process record",
122
+ :exception => ex,
123
+ :exceptionClassName => ex.class.name,
124
+ :exceptionMessage => ex.message,
125
+ :exceptionBacktrace => ex.backtrace,
126
+ :exceptionCause => ex.cause,
127
+ :exceptionInspect => ex.inspect,
128
+ :record => e.to_s)
129
+
121
130
  @parse_error_count += 1
122
131
  end
123
132
  end
@@ -196,11 +205,15 @@ class LogStash::Outputs::SensorsAnalytics < LogStash::Outputs::Base
196
205
  url_send_count_sum[url] = 0
197
206
  end
198
207
 
208
+ flush_error_count_sum = 0
209
+
199
210
  @buffer_items.each do |buffer_item|
200
211
  buffer_url_send_count = buffer_item.url_send_count
201
212
  buffer_url_send_count.each do |url, count|
202
213
  url_send_count_sum[url] += count
203
214
  end
215
+
216
+ flush_error_count_sum += buffer_item.flush_error_count
204
217
  end
205
218
 
206
219
  total_send_count = 0
@@ -216,6 +229,7 @@ class LogStash::Outputs::SensorsAnalytics < LogStash::Outputs::Base
216
229
  :receive_count => @receive_count,
217
230
  :send_count => total_send_count,
218
231
  :parse_error_count => @parse_error_count,
232
+ :flush_error_count => flush_error_count_sum,
219
233
  :url_send_count => url_send_count_sum)
220
234
  @logger.info("Filebeat status Report: #{format_filebeat_report_and_clean}") if @enable_filebeat_status_report
221
235
  end
@@ -228,6 +242,7 @@ class BufferItem
228
242
 
229
243
  attr_accessor :buffer_state
230
244
  attr_accessor :url_send_count
245
+ attr_accessor :flush_error_count
231
246
 
232
247
  def initialize(option = {})
233
248
  @client = option[:client]
@@ -236,6 +251,7 @@ class BufferItem
236
251
  url_list.each do |url|
237
252
  @url_send_count[url] = 0
238
253
  end
254
+ @flush_error_count = 0
239
255
  init_url_list(url_list, option[:index])
240
256
  @logger = option[:logger]
241
257
 
@@ -254,8 +270,16 @@ class BufferItem
254
270
  @logger.warn("Send failed, code: #{response.code}, body: #{response.body}")
255
271
  return false
256
272
  end
257
- rescue => e
258
- @logger.warn("Send failed", :exception => e.class.name, :backtrace => e.backtrace)
273
+ rescue => ex
274
+
275
+ @logger.error("Send failed",
276
+ :exception => ex,
277
+ :exceptionClassName => ex.class.name,
278
+ :exceptionMessage => ex.message,
279
+ :exceptionBacktrace => ex.backtrace,
280
+ :exceptionCause => ex.cause,
281
+ :exceptionInspect => ex.inspect)
282
+
259
283
  return false
260
284
  end
261
285
  true
@@ -267,23 +291,51 @@ class BufferItem
267
291
  # 如果当前 url 发送失败, 会尝试获取列表中下一个地址进行发送, 发送失败的 url 在 3 秒内不会再尝试发送
268
292
  # 如果所有的 url 都被标记为发送失败, sleep 5 秒后重新获取
269
293
  def flush(events, final)
270
- wio = StringIO.new("w")
271
- gzip_io = Zlib::GzipWriter.new(wio)
272
- gzip_io.write(events.to_json)
273
- gzip_io.close
274
- data = Base64.strict_encode64(wio.string)
275
- form_data = {"data_list" => data, "gzip" => 1}
276
-
277
- url_item = obtain_url
278
-
279
- until do_send(form_data, url_item[:url])
280
- last_url = url_item[:url]
281
- # 将发送失败的 url 标记为不可用
282
- disable_url(url_item)
294
+ begin
295
+ wio = StringIO.new("w")
296
+ gzip_io = Zlib::GzipWriter.new(wio)
297
+ gzip_io.write(events.to_json)
298
+ gzip_io.close
299
+ data = Base64.strict_encode64(wio.string)
300
+ form_data = {"data_list" => data, "gzip" => 1}
301
+
283
302
  url_item = obtain_url
284
- @logger.warn("Send failed, retry send data to another url", :last_url => last_url, :retry_url => url_item[:url])
303
+
304
+ until do_send(form_data, url_item[:url])
305
+ last_url = url_item[:url]
306
+ # 将发送失败的 url 标记为不可用
307
+ disable_url(url_item)
308
+ url_item = obtain_url
309
+ @logger.warn("Send failed, retry send data to another url", :last_url => last_url, :retry_url => url_item[:url])
310
+ end
311
+ @url_send_count[url_item[:url]] += events.length
312
+ rescue => ex
313
+
314
+ if events.length == 1
315
+ # 打印异常现场
316
+ @logger.error("Flush failed",
317
+ :exception => ex,
318
+ :exceptionClassName => ex.class.name,
319
+ :exceptionMessage => ex.message,
320
+ :exceptionBacktrace => ex.backtrace,
321
+ :exceptionCause => ex.cause,
322
+ :exceptionInspect => ex.inspect,
323
+ :events_data => events.to_s)
324
+
325
+ @flush_error_count += 1
326
+
327
+ elsif events.length > 1
328
+ # 降级处理: 将events 的批量发送,降级为指数级后退重试
329
+ pivot = events.length / 2
330
+ left = events.slice(0, pivot)
331
+ right = events.slice(pivot, events.length)
332
+ flush(left, final)
333
+ flush(right, final)
334
+
335
+ @logger.warn("Flush retry in exponential backoff!", :left_length => left.length, :right_length => right.length)
336
+ end
337
+
285
338
  end
286
- @url_send_count[url_item[:url]] += events.length
287
339
  end
288
340
 
289
341
  private
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-sensors_analytics'
3
- s.version = '0.1.2'
3
+ s.version = '0.1.4'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = 'Output plugin for Sensors Analytics'
6
6
  s.description = 'This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program.'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-sensors_analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Feng Jiajie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-07 00:00:00.000000000 Z
11
+ date: 2021-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -20,8 +20,8 @@ dependencies:
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
22
  name: logstash-core-plugin-api
23
- prerelease: false
24
23
  type: :runtime
24
+ prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
@@ -37,8 +37,8 @@ dependencies:
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  name: logstash-codec-plain
40
- prerelease: false
41
40
  type: :runtime
41
+ prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -54,8 +54,8 @@ dependencies:
54
54
  - !ruby/object:Gem::Version
55
55
  version: 8.0.0
56
56
  name: logstash-mixin-http_client
57
- prerelease: false
58
57
  type: :runtime
58
+ prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
@@ -71,8 +71,8 @@ dependencies:
71
71
  - !ruby/object:Gem::Version
72
72
  version: 0.0.23
73
73
  name: stud
74
- prerelease: false
75
74
  type: :runtime
75
+ prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
@@ -85,8 +85,8 @@ dependencies:
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  name: logstash-devutils
88
- prerelease: false
89
88
  type: :development
89
+ prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
@@ -99,8 +99,8 @@ dependencies:
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
101
  name: sinatra
102
- prerelease: false
103
102
  type: :development
103
+ prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
@@ -113,8 +113,8 @@ dependencies:
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0'
115
115
  name: webrick
116
- prerelease: false
117
116
  type: :development
117
+ prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - ">="
@@ -158,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  requirements: []
161
- rubyforge_project:
162
- rubygems_version: 2.7.6
161
+ rubygems_version: 3.0.6
163
162
  signing_key:
164
163
  specification_version: 4
165
164
  summary: Output plugin for Sensors Analytics