fluent-plugin-light-core 0.1.6 → 0.2.1

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: 84773035328d3e9f94b3a41242a24038c9f00bf84ff4e4c282ac67d44fa75350
4
- data.tar.gz: 393720c2ce0fc4d55fabf7e9206ab57bf8085c0df9c5e043356cc87f356328c4
3
+ metadata.gz: af0f4865440862be4488030659ec9798b8eb9261bc2f9b95ee093a0b5de28387
4
+ data.tar.gz: 5a46ab336bb472b47f6572d5836e6fbbfeea8075e19dfa6a6781d4e938ceddb7
5
5
  SHA512:
6
- metadata.gz: eca26afd55eb797b228c2cf65653882d31718c66630041ab05243c5be3d1b85f995a8dca5c8e6cd79971cb4db5735cd2d49ccb8f0e4c9357117e90252fae81ea
7
- data.tar.gz: 8faa457619809fe3b26db9658fdf5dc66a960477541bc9ac7342b21612eb649743ec99be49ba1584e01fb8e615cd97f94dc9be9303d01fe222ed5ac654665226
6
+ metadata.gz: 045f2e53eba3fcf2ac10aa1a625e539bff38f6221c4a776d4c7a8b5250868e8bda1b0c1c59b07da1458c86787f07e6f9d568e4cb73562b7a4d261aaa0a42be1b
7
+ data.tar.gz: 7272c0c901fd28c3aec6b9241060f8dab6e64f3cc91f40ab7a044f866b951e4b3aa4cc4ac9428029914e7104ca43840abceee5b88cae3e0d0a95928ed337311c
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.6"
6
+ spec.version = "0.2.1"
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,35 @@ 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
40
39
 
41
40
  # MongoDB 异常 settings
42
41
  config_param :mongo_severity, :array, default: ['F', 'E'], value_type: :string
43
42
  config_param :mongo_querytime, :float, default: 100
44
43
 
45
- # 初始化UDP实例
44
+ # 初始化 Sentry
46
45
  def start
47
46
  super
48
47
 
49
- if @notice
50
- log.info('init udp connection')
51
- @udp = UDPSocket.open()
52
- @udp.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
48
+ if @sentry
49
+ log.info('init sentry')
50
+ Sentry.init do |config|
51
+ config.dsn = @sentry_dsn
52
+
53
+ # To activate performance monitoring, set one of these options.
54
+ # We recommend adjusting the value in production:
55
+ config.traces_sample_rate = 1
56
+
57
+ # config.background_worker_threads = 2
58
+ config.transport.timeout = 10
59
+ config.transport.open_timeout = 10
60
+ end
53
61
  end
54
62
  end
55
63
 
56
- # 清理UDP连接
64
+ # 清理
57
65
  def shutdown
58
-
59
- if @notice
60
- log.info('close udp connection')
61
- @udp.close if @udp
62
- end
63
-
64
66
  super
65
67
  end
66
68
 
@@ -88,11 +90,12 @@ module Fluent
88
90
 
89
91
  # Parse the application log
90
92
  def filter_app(tag, time, record)
91
- file = record['file'].split('/').last.split('_') # Parse log file name
92
- log = record['log'] # Get detailed log content
93
+ file = record['file'].split('/').last.split('_') # Parse log file name
94
+ log = record['log'] # Get detailed log content
93
95
 
94
96
  # Set common items
95
- record['environment'] = Socket.gethostname.split('-')[0] # dev | prd
97
+ # record['environment'] = Socket.gethostname.split('-')[0] # dev | prd
98
+ record['environment'] = ENV['FLUENTD_ENV'] # dev | prd
96
99
  record['cid'] = file[0] # container id
97
100
  record['cname'] = file[0].split('-')[1] # container name
98
101
  record['ctime'] = record['time'] # container time
@@ -146,7 +149,7 @@ module Fluent
146
149
  file = record['file'].split('/').last.split('_')
147
150
  log = record['log']
148
151
 
149
- record['environment'] = Socket.gethostname.split('-')[0]
152
+ record['environment'] = ENV['FLUENTD_ENV']
150
153
  record['cid'] = file[0]
151
154
  record['cname'] = tag
152
155
  record['ctime'] = record['time']
@@ -157,7 +160,7 @@ module Fluent
157
160
 
158
161
  # access log
159
162
  if /^[^ ]+ [^ ]+ [^ ]+ \[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}\]/.match(log)
160
- item = /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)" "(?<elapsed>[^\"]*)")?/.match(log)
163
+ item = /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<elapsed>[^\"]*)" "(?<requestid>[^\"]*)" "(?<sessionid>[^\"]*)")?/.match(log)
161
164
 
162
165
  record['remote'] = item[:remote]
163
166
  record['host'] = item[:host]
@@ -169,8 +172,9 @@ module Fluent
169
172
  record['size'] = format_str(item[:size])
170
173
  record['referer'] = item[:referer]
171
174
  record['agent'] = item[:agent]
172
- record['forwarder'] = item[:forwarder]
173
175
  record['elapsed'] = format_str(item[:elapsed])
176
+ record['requestid'] = item[:requestid]
177
+ record['sessionid'] = item[:sessionid]
174
178
 
175
179
  return record
176
180
  end
@@ -211,7 +215,7 @@ module Fluent
211
215
  file = record['file'].split('/').last.split('_')
212
216
  log = record['log']
213
217
 
214
- record['environment'] = Socket.gethostname.split('-')[0]
218
+ record['environment'] = ENV['FLUENTD_ENV']
215
219
  record['cid'] = file[0]
216
220
  record['cname'] = tag
217
221
  record['ctime'] = record['time']
@@ -220,6 +224,7 @@ module Fluent
220
224
  record.delete('file')
221
225
  record.delete('time')
222
226
 
227
+ # 旧版本日志格式解析
223
228
  if /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}\+\d{4} [A-Z]/.match(log)
224
229
 
225
230
  item = /^(?<time>[^ ]*) (?<severity>[A-Z])\s* (?<component>(-|([^ ]*)))\s* \[(?<context>[^\]]*)\]\s* ((?<query>.*) protocol:op_query (?<querytime>[\d\.]+(?=ms))|(?<message>.*))/.match(log)
@@ -247,6 +252,30 @@ module Fluent
247
252
  end
248
253
  end
249
254
 
255
+ return record
256
+ else
257
+
258
+ # 版本4.4开始,默认日志为json格式
259
+ item = JSON.parse(log)
260
+ record['time'] = item['t']['$date']
261
+ record['severity'] = item['s']
262
+ record['component'] = item['c']
263
+ record['context'] = item['ctx']
264
+ record['identifier'] = item['id']
265
+ record['message'] = item['msg']
266
+
267
+ attributes = item['attr']
268
+ if attributes
269
+ record['querytime'] = attributes['durationMillis']
270
+ record['collection'] = attributes['ns']
271
+ record['command'] = attributes['command']
272
+ record['attr'] = attributes
273
+ end
274
+
275
+ record['tags'] = item['tags']
276
+ record['truncated'] = item['truncated']
277
+ record['size'] = item['size']
278
+
250
279
  return record
251
280
  end
252
281
 
@@ -256,15 +285,18 @@ module Fluent
256
285
  # 确认是否发送通知
257
286
  def notice(tag, record)
258
287
 
259
- unless @notice
288
+ unless @sentry
260
289
  return record
261
290
  end
262
291
 
263
292
  if tag == 'app'
293
+
294
+ # 未使用
264
295
  if @app_stream && record['stream']
265
296
  send(record) if record['stream'] == @app_stream
266
297
  end
267
298
 
299
+ # 未使用
268
300
  if @app_message.length > 0 && record['message']
269
301
  @app_message.each do |pattern|
270
302
  if pattern.match(record['message'])
@@ -275,11 +307,13 @@ module Fluent
275
307
  end
276
308
 
277
309
  if @app_status.length > 0 && record['status']
278
- send(record) if @app_status.include?(record['status'])
310
+ message = 'Status code abnormal : ' + record['url']
311
+ send(tag, message, record) if @app_status.include?(record['status'])
279
312
  end
280
313
 
281
314
  if @app_elapsed > 0 && record['elapsed']
282
- send(record) if record['elapsed'].to_f > @app_elapsed
315
+ message = 'Slow process : ' + record['url']
316
+ send(tag, message, record) if record['elapsed'].to_f >= @app_elapsed
283
317
  end
284
318
 
285
319
  return record
@@ -287,15 +321,17 @@ module Fluent
287
321
 
288
322
  if tag == 'lb'
289
323
  if @lb_stream && record['stream']
290
- send(record) if record['stream'] == @lb_stream
324
+ send(tag, 'Stderror', record) if record['stream'] == @lb_stream
291
325
  end
292
326
 
293
327
  if @lb_code.length > 0 && record['code']
294
- send(record) if @lb_code.include?(record['code'])
328
+ message = 'Status code abnormal : ' + record['path']
329
+ send(tag, message, record) if @lb_code.include?(record['code'])
295
330
  end
296
331
 
297
332
  if @lb_elapsed > 0 && record['elapsed']
298
- send(record) if record['elapsed'].to_f > @lb_elapsed
333
+ message = 'Slow request : ' + record['path']
334
+ send(tag, message, record) if record['elapsed'].to_f >= @lb_elapsed
299
335
  end
300
336
 
301
337
  return record
@@ -303,11 +339,14 @@ module Fluent
303
339
 
304
340
  if tag == 'mongo'
305
341
  if @mongo_severity.length > 0 && record['severity']
306
- send(record) if @mongo_severity.include?(record['severity'])
342
+ message = 'Severity level abnormal : ' + record['severity']
343
+ send(tag, message, record) if @mongo_severity.include?(record['severity'])
307
344
  end
308
345
 
309
346
  if @mongo_querytime > 0 && record['querytime']
310
- send(record) if record['querytime'].to_f > @mongo_querytime
347
+ message = 'Slow query'
348
+ message = message + ' : ' + record['collection'] if record['collection']
349
+ send(tag, message, record) if record['querytime'].to_f >= @mongo_querytime
311
350
  end
312
351
 
313
352
  return record
@@ -318,17 +357,9 @@ module Fluent
318
357
  end
319
358
 
320
359
  # 发送UDP请求
321
- def send(record)
322
-
323
- log.info('send udp notice', record)
324
-
325
- data = {
326
- :query => '/api/log/notice',
327
- :params => {
328
- :data => record
329
- }
330
- }
331
- @udp.send(data.to_json, 0, Socket.pack_sockaddr_in(@port, @host))
360
+ def send(tag, message, record)
361
+ log.debug('send udp notice')
362
+ Sentry.capture_message(message, :extra => record, :tags => {'log' => tag})
332
363
  end
333
364
 
334
365
  # 转数字
@@ -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
@@ -14,8 +14,8 @@
14
14
 
15
15
  <source>
16
16
  @type tail
17
- path sample/lb*.log
18
- pos_file sample/source.lb.pos
17
+ path sample/ingress-nginx*.log
18
+ pos_file sample/source.ingress-nginx.pos
19
19
  tag lb
20
20
  format json
21
21
  read_from_head true
@@ -79,6 +79,15 @@
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
+ app_status 500
90
+ app_elapsed 5
82
91
  </filter>
83
92
 
84
93
  # <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.6
4
+ version: 0.2.1
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-20 00:00:00.000000000 Z
11
+ date: 2021-02-01 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
@@ -87,6 +107,7 @@ files:
87
107
  - Rakefile
88
108
  - fluent-plugin-light-core.gemspec
89
109
  - lib/fluent/plugin/filter_light_core.rb
110
+ - pkg/fluent-plugin-light-core-0.2.0.gem
90
111
  - sample/README.md
91
112
  - sample/source.conf
92
113
  - sample/udpsample.rb