fluent-plugin-light-core 0.1.9 → 0.2.3

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: 2433cbe7616d4740d7722d4438d18c91aa599db380962943e368af9277b3cd2c
4
- data.tar.gz: f8cb6f8a1f512b55b4d6340101363ad88c536f8983c9cbe7a644ab1cbc25f325
3
+ metadata.gz: a553d56fc47ba8c7ae49428e3d60a5180bb90a9d3b355ebec22b6983265249a9
4
+ data.tar.gz: b27775457e6b5cea4f80a6d83095460ef2d59087648ef683331615a90e4a2fce
5
5
  SHA512:
6
- metadata.gz: '08df5f1170b4f9f23e24c05883154af18d74146afaa8f3eca8e96b5d462d241a2115c6ea3fd424cf4da070d86e4bf4ff64d0bf1c637c3d4f20a691c81793fbe1'
7
- data.tar.gz: 69bbf8f5dc12be010404a76214576324febb1ae1cba9781279641f0b29e9362e7f3abc0a19daeb2876c30d84bb86f76305a7f3b0a983765831c3e386de6b7791
6
+ metadata.gz: 69e2cf2089fb5be1cc62fcdbe86498b1711c0e5bea39767044d9b3e2e853026ec9a0f122609c05b79e57e58f6d74f7fc924563e56526d9ecdde61ec4631dde27
7
+ data.tar.gz: e384dadbc0567ac19f7013209aa43441981c0aedb85bfa9381b86118422956b839d218b6a2b8083dc5ae9af93ed503d8ecc181afae6de952e148fff1d640bf4c
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ gem "sentry-ruby"
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "fluent-plugin-light-core"
6
- spec.version = "0.1.9"
6
+ spec.version = "0.2.3"
7
7
  spec.authors = ["LIN LI"]
8
8
  spec.email = ["l.li@alphabets.cn"]
9
9
 
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake", "~> 12.0"
25
25
  spec.add_development_dependency "test-unit", "~> 3.0"
26
26
  spec.add_runtime_dependency "fluentd", [">= 0.14.10", "< 2"]
27
+ spec.add_runtime_dependency "sentry-ruby", [">= 4.1.5", "< 5"]
27
28
  end
@@ -14,8 +14,8 @@
14
14
  # limitations under the License.
15
15
 
16
16
  require 'fluent/plugin/filter'
17
- require 'socket'
18
17
  require 'json'
18
+ require 'sentry-ruby'
19
19
 
20
20
  module Fluent
21
21
  module Plugin
@@ -23,9 +23,8 @@ module Fluent
23
23
  Fluent::Plugin.register_filter('light_core', self)
24
24
 
25
25
  # 通知相关配置
26
- config_param :notice, :bool, default: false
27
- config_param :port, :integer, default: 7000
28
- config_param :host, :string, default: '255.255.255.255'
26
+ config_param :sentry, :bool, default: false
27
+ config_param :sentry_dsn, :string, default: ''
29
28
 
30
29
  # Application 异常 settings
31
30
  config_param :app_stream, :string, default: 'stderr'
@@ -35,32 +34,36 @@ module Fluent
35
34
 
36
35
  # Nginx 异常 settings
37
36
  config_param :lb_stream, :string, default: 'stderr'
38
- config_param :lb_code, :array, default: ['500'], value_type: :string
39
- config_param :lb_elapsed, :float, default: 3000
37
+ config_param :lb_code, :array, default: ['400', '500'], value_type: :string
38
+ config_param :lb_elapsed, :float, default: 3
39
+ config_param :lb_ignore, :array, default: [], value_type: :string
40
40
 
41
41
  # MongoDB 异常 settings
42
42
  config_param :mongo_severity, :array, default: ['F', 'E'], value_type: :string
43
43
  config_param :mongo_querytime, :float, default: 100
44
44
 
45
- # 初始化UDP实例
45
+ # 初始化 Sentry
46
46
  def start
47
47
  super
48
48
 
49
- if @notice
50
- log.info('init udp connection')
51
- @udp = UDPSocket.open()
52
- @udp.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
49
+ if @sentry
50
+ log.info('init sentry')
51
+ Sentry.init do |config|
52
+ config.dsn = @sentry_dsn
53
+
54
+ # To activate performance monitoring, set one of these options.
55
+ # We recommend adjusting the value in production:
56
+ config.traces_sample_rate = 1
57
+
58
+ # config.background_worker_threads = 2
59
+ config.transport.timeout = 10
60
+ config.transport.open_timeout = 10
61
+ end
53
62
  end
54
63
  end
55
64
 
56
- # 清理UDP连接
65
+ # 清理
57
66
  def shutdown
58
-
59
- if @notice
60
- log.info('close udp connection')
61
- @udp.close if @udp
62
- end
63
-
64
67
  super
65
68
  end
66
69
 
@@ -128,9 +131,9 @@ module Fluent
128
131
  record['method'] = item[:method]
129
132
  record['url'] = item[:url]
130
133
  record['status'] = item[:status]
131
- record['size'] = format_str(item[:size])
134
+ record['size'] = str_to_num(item[:size])
132
135
  record['uid'] = item[:uid]
133
- record['elapsed'] = format_str(item[:elapsed])
136
+ record['elapsed'] = str_to_num(item[:elapsed])
134
137
  record['addr'] = item[:addr].gsub(/\n$/, '')
135
138
 
136
139
  return record
@@ -167,10 +170,10 @@ module Fluent
167
170
  record['method'] = item[:method]
168
171
  record['path'] = item[:path]
169
172
  record['code'] = item[:code]
170
- record['size'] = format_str(item[:size])
173
+ record['size'] = str_to_num(item[:size])
171
174
  record['referer'] = item[:referer]
172
175
  record['agent'] = item[:agent]
173
- record['elapsed'] = format_str(item[:elapsed])
176
+ record['elapsed'] = str_to_num(item[:elapsed])
174
177
  record['requestid'] = item[:requestid]
175
178
  record['sessionid'] = item[:sessionid]
176
179
 
@@ -181,7 +184,7 @@ module Fluent
181
184
  if /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} \[error\]/.match(log)
182
185
  item = /^(?<time>[^ ]+ [^ ]+) \[(?<level>.*)\] (?<pid>\d*)#(?<tid>[^:]*): \*(?<cid>\d*) (?<message>.*)$/.match(log)
183
186
 
184
- record['time'] = item[:time]
187
+ record['time'] = record['ctime']
185
188
  record['level'] = item[:level]
186
189
  record['message'] = item[:message]
187
190
  record['process'] = item[:pid] # process id
@@ -222,107 +225,82 @@ module Fluent
222
225
  record.delete('file')
223
226
  record.delete('time')
224
227
 
225
- # 旧版本日志格式解析
226
- if /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}\+\d{4} [A-Z]/.match(log)
227
-
228
- item = /^(?<time>[^ ]*) (?<severity>[A-Z])\s* (?<component>(-|([^ ]*)))\s* \[(?<context>[^\]]*)\]\s* ((?<query>.*) protocol:op_query (?<querytime>[\d\.]+(?=ms))|(?<message>.*))/.match(log)
229
-
230
- record['time'] = item[:time]
231
- record['severity'] = item[:severity]
232
- record['component'] = item[:component]
233
- record['context'] = item[:context]
234
-
235
- if item[:message]
236
- record['message'] = item[:message]
237
- return record
238
- end
239
-
240
- if item[:querytime]
241
- record['querytime'] = format_str(item[:querytime])
242
- end
243
-
244
- if item[:query]
245
- record['command'] = item[:query]
246
- query = /^command\s* (?<collection>[^ ]*) (?<command>.*)$/.match(item[:query])
247
- unless query.nil?
248
- record['collection'] = query[:collection]
249
- record['command'] = query[:command]
250
- end
251
- end
252
-
253
- return record
254
- else
255
-
256
- # 版本4.4开始,默认日志为json格式
257
- item = JSON.parse(log)
258
- record['time'] = item['t']['$date']
259
- record['severity'] = item['s']
260
- record['component'] = item['c']
261
- record['context'] = item['ctx']
262
- record['identifier'] = item['id']
263
- record['message'] = item['msg']
264
-
265
- attributes = item['attr']
266
- if attributes
267
- record['querytime'] = attributes['durationMillis']
268
- record['collection'] = attributes['ns']
269
- record['command'] = attributes['command']
270
- record['attr'] = attributes
271
- end
272
-
273
- record['tags'] = item['tags']
274
- record['truncated'] = item['truncated']
275
- record['size'] = item['size']
276
-
277
- return record
228
+ # 版本4.4开始,默认日志为json格式
229
+ item = JSON.parse(log)
230
+ record['time'] = item['t']['$date']
231
+ record['severity'] = item['s']
232
+ record['component'] = item['c']
233
+ record['context'] = item['ctx']
234
+ record['identifier'] = item['id']
235
+ record['message'] = item['msg']
236
+
237
+ attributes = item['attr']
238
+ if attributes
239
+ record['querytime'] = attributes['durationMillis']
240
+ record['collection'] = attributes['ns']
241
+ record['command'] = attributes['command']
242
+ record['attr'] = attributes
278
243
  end
279
244
 
245
+ record['tags'] = item['tags']
246
+ record['truncated'] = item['truncated']
247
+ record['size'] = item['size']
280
248
  record
281
249
  end
282
250
 
283
251
  # 确认是否发送通知
284
252
  def notice(tag, record)
285
253
 
286
- unless @notice
254
+ unless @sentry
287
255
  return record
288
256
  end
289
257
 
290
258
  if tag == 'app'
259
+
291
260
  if @app_stream && record['stream']
292
- send(record) if record['stream'] == @app_stream
261
+ send(tag, record['message'], record) if record['stream'] == @app_stream
293
262
  end
294
263
 
295
264
  if @app_message.length > 0 && record['message']
296
265
  @app_message.each do |pattern|
297
266
  if pattern.match(record['message'])
298
- send(record)
267
+ send(tag, record['message'], record)
299
268
  break
300
269
  end
301
270
  end
302
271
  end
303
272
 
304
273
  if @app_status.length > 0 && record['status']
305
- send(record) if @app_status.include?(record['status'])
274
+ message = 'Status code abnormal : ' + record['url']
275
+ send(tag, message, record) if @app_status.include?(record['status'])
306
276
  end
307
277
 
308
278
  if @app_elapsed > 0 && record['elapsed']
309
- send(record) if record['elapsed'].to_f > @app_elapsed
279
+ message = 'Slow process : ' + record['url']
280
+ send(tag, message, record) if record['elapsed'].to_f >= @app_elapsed
310
281
  end
311
282
 
312
283
  return record
313
284
  end
314
285
 
315
286
  if tag == 'lb'
287
+
288
+ if @lb_ignore && record['path'] && @lb_ignore.include?(record['path'])
289
+ return record
290
+ end
291
+
316
292
  if @lb_stream && record['stream']
317
- send(record) if record['stream'] == @lb_stream
293
+ send(tag, 'Stderror', record) if record['stream'] == @lb_stream
318
294
  end
319
295
 
320
296
  if @lb_code.length > 0 && record['code']
321
- send(record) if @lb_code.include?(record['code'])
297
+ message = 'Status code abnormal : ' + record['path']
298
+ send(tag, message, record) if @lb_code.include?(record['code'])
322
299
  end
323
300
 
324
301
  if @lb_elapsed > 0 && record['elapsed']
325
- send(record) if record['elapsed'].to_f > @lb_elapsed
302
+ message = 'Slow request : ' + record['path']
303
+ send(tag, message, record) if record['elapsed'].to_f >= @lb_elapsed
326
304
  end
327
305
 
328
306
  return record
@@ -330,11 +308,14 @@ module Fluent
330
308
 
331
309
  if tag == 'mongo'
332
310
  if @mongo_severity.length > 0 && record['severity']
333
- send(record) if @mongo_severity.include?(record['severity'])
311
+ message = 'Severity level abnormal : ' + record['severity']
312
+ send(tag, message, record) if @mongo_severity.include?(record['severity'])
334
313
  end
335
314
 
336
315
  if @mongo_querytime > 0 && record['querytime']
337
- send(record) if record['querytime'].to_f > @mongo_querytime
316
+ message = 'Slow query'
317
+ message = message + ' : ' + record['collection'] if record['collection']
318
+ send(tag, message, record) if record['querytime'].to_f >= @mongo_querytime
338
319
  end
339
320
 
340
321
  return record
@@ -345,21 +326,14 @@ module Fluent
345
326
  end
346
327
 
347
328
  # 发送UDP请求
348
- def send(record)
349
-
350
- log.info('send udp notice', record)
351
-
352
- data = {
353
- :query => '/api/log/notice',
354
- :params => {
355
- :data => record
356
- }
357
- }
358
- @udp.send(data.to_json, 0, Socket.pack_sockaddr_in(@port, @host))
329
+ def send(tag, message, record)
330
+ log.debug('send udp notice')
331
+ Sentry.capture_message(message, :extra => record, :tags => {'log' => tag})
359
332
  end
360
333
 
361
334
  # 转数字
362
- def format_str(str)
335
+ def str_to_num(str)
336
+ return 0 if (str == '-')
363
337
  return str.to_i if (str =~ /^\d+$/)
364
338
  return str.to_f if (str =~ /^\d+\.\d+$/)
365
339
  str
data/sample/README.md CHANGED
@@ -32,3 +32,13 @@ Initialized empty Git repository in /Users/lilin/developer/light/fluent-plugin-l
32
32
 
33
33
  % rm -f sample/*.pos
34
34
  % fluentd -c sample/source.conf -p lib/fluent/plugin
35
+
36
+ ## 添加 sentry 依赖
37
+
38
+ - 编辑Gemfile
39
+
40
+ gem "sentry-ruby"
41
+
42
+ - 安装依赖
43
+
44
+ gem install sentry-ruby
data/sample/source.conf CHANGED
@@ -79,6 +79,16 @@
79
79
 
80
80
  <filter **>
81
81
  @type light_core
82
+ sentry true
83
+ sentry_dsn https://4447403a2a86437491d307ceb72898e5@sentry.zf.link/4
84
+ mongo_querytime 300
85
+ mongo_severity F,E
86
+ lb_stream stderr
87
+ lb_code 400,500
88
+ lb_elapsed 5
89
+ lb_ignore /api/environment/list,/api/certificate/list?condition%5Bkind%5D=SSL
90
+ app_status 500
91
+ app_elapsed 5
82
92
  </filter>
83
93
 
84
94
  # <match app>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-light-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - LIN LI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-28 00:00:00.000000000 Z
11
+ date: 2021-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,26 @@ dependencies:
72
72
  - - "<"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '2'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sentry-ruby
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 4.1.5
82
+ - - "<"
83
+ - !ruby/object:Gem::Version
84
+ version: '5'
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: 4.1.5
92
+ - - "<"
93
+ - !ruby/object:Gem::Version
94
+ version: '5'
75
95
  description: light core fluent plugin. support mongodb, nginx and application
76
96
  email:
77
97
  - l.li@alphabets.cn