fluent-plugin-light-core 0.1.9 → 0.2.3

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: 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