fluent-plugin-light-core 0.1.1 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fluent-plugin-light-core.gemspec +1 -1
- data/lib/fluent/plugin/filter_light_core.rb +200 -63
- data/sample/README.md +6 -4
- data/sample/udpsample.rb +20 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84773035328d3e9f94b3a41242a24038c9f00bf84ff4e4c282ac67d44fa75350
|
4
|
+
data.tar.gz: 393720c2ce0fc4d55fabf7e9206ab57bf8085c0df9c5e043356cc87f356328c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eca26afd55eb797b228c2cf65653882d31718c66630041ab05243c5be3d1b85f995a8dca5c8e6cd79971cb4db5735cd2d49ccb8f0e4c9357117e90252fae81ea
|
7
|
+
data.tar.gz: 8faa457619809fe3b26db9658fdf5dc66a960477541bc9ac7342b21612eb649743ec99be49ba1584e01fb8e615cd97f94dc9be9303d01fe222ed5ac654665226
|
@@ -13,25 +13,73 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
require
|
16
|
+
require 'fluent/plugin/filter'
|
17
|
+
require 'socket'
|
18
|
+
require 'json'
|
17
19
|
|
18
20
|
module Fluent
|
19
21
|
module Plugin
|
20
22
|
class LightCoreFilter < Fluent::Plugin::Filter
|
21
|
-
Fluent::Plugin.register_filter(
|
23
|
+
Fluent::Plugin.register_filter('light_core', self)
|
24
|
+
|
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'
|
29
|
+
|
30
|
+
# Application 异常 settings
|
31
|
+
config_param :app_stream, :string, default: 'stderr'
|
32
|
+
config_param :app_message, :array, default: [], value_type: :regexp
|
33
|
+
config_param :app_status, :array, default: ['500'], value_type: :string
|
34
|
+
config_param :app_elapsed, :float, default: 2000
|
35
|
+
|
36
|
+
# Nginx 异常 settings
|
37
|
+
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
|
40
|
+
|
41
|
+
# MongoDB 异常 settings
|
42
|
+
config_param :mongo_severity, :array, default: ['F', 'E'], value_type: :string
|
43
|
+
config_param :mongo_querytime, :float, default: 100
|
44
|
+
|
45
|
+
# 初始化UDP实例
|
46
|
+
def start
|
47
|
+
super
|
48
|
+
|
49
|
+
if @notice
|
50
|
+
log.info('init udp connection')
|
51
|
+
@udp = UDPSocket.open()
|
52
|
+
@udp.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# 清理UDP连接
|
57
|
+
def shutdown
|
58
|
+
|
59
|
+
if @notice
|
60
|
+
log.info('close udp connection')
|
61
|
+
@udp.close if @udp
|
62
|
+
end
|
63
|
+
|
64
|
+
super
|
65
|
+
end
|
22
66
|
|
67
|
+
# 主处理
|
23
68
|
def filter(tag, time, record)
|
24
69
|
|
25
|
-
if
|
26
|
-
|
70
|
+
if ['app', 'service'].include? tag
|
71
|
+
record = filter_app(tag, time, record)
|
72
|
+
return notice('app', record)
|
27
73
|
end
|
28
74
|
|
29
75
|
if ['lb', 'hub'].include? tag
|
30
|
-
|
76
|
+
record = filter_lb(tag, time, record)
|
77
|
+
return notice('lb', record)
|
31
78
|
end
|
32
79
|
|
33
80
|
if ['mongo', 'secondary', 'arbiter'].include? tag
|
34
|
-
|
81
|
+
record = filter_mongo(tag, time, record)
|
82
|
+
return notice('mongo', record)
|
35
83
|
end
|
36
84
|
|
37
85
|
record
|
@@ -45,9 +93,9 @@ module Fluent
|
|
45
93
|
|
46
94
|
# Set common items
|
47
95
|
record['environment'] = Socket.gethostname.split('-')[0] # dev | prd
|
48
|
-
record[
|
49
|
-
record[
|
50
|
-
record[
|
96
|
+
record['cid'] = file[0] # container id
|
97
|
+
record['cname'] = file[0].split('-')[1] # container name
|
98
|
+
record['ctime'] = record['time'] # container time
|
51
99
|
|
52
100
|
# Delete useless content
|
53
101
|
record.delete('log')
|
@@ -59,12 +107,12 @@ module Fluent
|
|
59
107
|
|
60
108
|
item = /^\[(?<time>[^\]]*)\] \[(?<component>[^\]]*)\] \[(?<levle>[^\]]*)\] (?<line>[^\ ]*) - - (?<uid>[^\ ]*) - (?<message>.*)$/.match(log)
|
61
109
|
|
62
|
-
record[
|
63
|
-
record[
|
64
|
-
record[
|
65
|
-
record[
|
66
|
-
record[
|
67
|
-
record[
|
110
|
+
record['time'] = item[:time]
|
111
|
+
record['component'] = item[:component]
|
112
|
+
record['levle'] = item[:levle]
|
113
|
+
record['line'] = item[:line]
|
114
|
+
record['uid'] = item[:uid]
|
115
|
+
record['message'] = item[:message]
|
68
116
|
|
69
117
|
return record
|
70
118
|
end
|
@@ -74,21 +122,21 @@ module Fluent
|
|
74
122
|
|
75
123
|
item = /^\[(?<time>[^\]]*)\] \[(?<component>[^\]]*)\] \[(?<method>[^\]]*)\] (?<url>[^\ ]*) (?<status>[^\ ]*) (?<size>[^\ ]*) (?<uid>[^\ ]*) (?<elapsed>[^\ ]*) (?<addr>[^\ ]*)$/.match(log)
|
76
124
|
|
77
|
-
record[
|
78
|
-
record[
|
79
|
-
record[
|
80
|
-
record[
|
81
|
-
record[
|
82
|
-
record[
|
83
|
-
record[
|
84
|
-
record[
|
85
|
-
record[
|
125
|
+
record['time'] = item[:time]
|
126
|
+
record['component'] = item[:component]
|
127
|
+
record['method'] = item[:method]
|
128
|
+
record['url'] = item[:url]
|
129
|
+
record['status'] = item[:status]
|
130
|
+
record['size'] = format_str(item[:size])
|
131
|
+
record['uid'] = item[:uid]
|
132
|
+
record['elapsed'] = format_str(item[:elapsed])
|
133
|
+
record['addr'] = item[:addr].gsub(/\n$/, '')
|
86
134
|
|
87
135
|
return record
|
88
136
|
end
|
89
137
|
|
90
138
|
# Console log
|
91
|
-
record[
|
139
|
+
record['message'] = log.gsub(/\n$/, '')
|
92
140
|
record
|
93
141
|
end
|
94
142
|
|
@@ -99,9 +147,9 @@ module Fluent
|
|
99
147
|
log = record['log']
|
100
148
|
|
101
149
|
record['environment'] = Socket.gethostname.split('-')[0]
|
102
|
-
record[
|
103
|
-
record[
|
104
|
-
record[
|
150
|
+
record['cid'] = file[0]
|
151
|
+
record['cname'] = tag
|
152
|
+
record['ctime'] = record['time']
|
105
153
|
|
106
154
|
record.delete('log')
|
107
155
|
record.delete('file')
|
@@ -109,19 +157,20 @@ module Fluent
|
|
109
157
|
|
110
158
|
# access log
|
111
159
|
if /^[^ ]+ [^ ]+ [^ ]+ \[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}\]/.match(log)
|
112
|
-
item = /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/.match(log)
|
113
|
-
|
114
|
-
record[
|
115
|
-
record[
|
116
|
-
record[
|
117
|
-
record[
|
118
|
-
record[
|
119
|
-
record[
|
120
|
-
record[
|
121
|
-
record[
|
122
|
-
record[
|
123
|
-
record[
|
124
|
-
record[
|
160
|
+
item = /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)" "(?<elapsed>[^\"]*)")?/.match(log)
|
161
|
+
|
162
|
+
record['remote'] = item[:remote]
|
163
|
+
record['host'] = item[:host]
|
164
|
+
record['user'] = item[:user]
|
165
|
+
record['time'] = item[:time]
|
166
|
+
record['method'] = item[:method]
|
167
|
+
record['path'] = item[:path]
|
168
|
+
record['code'] = item[:code]
|
169
|
+
record['size'] = format_str(item[:size])
|
170
|
+
record['referer'] = item[:referer]
|
171
|
+
record['agent'] = item[:agent]
|
172
|
+
record['forwarder'] = item[:forwarder]
|
173
|
+
record['elapsed'] = format_str(item[:elapsed])
|
125
174
|
|
126
175
|
return record
|
127
176
|
end
|
@@ -130,29 +179,29 @@ module Fluent
|
|
130
179
|
if /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} \[error\]/.match(log)
|
131
180
|
item = /^(?<time>[^ ]+ [^ ]+) \[(?<level>.*)\] (?<pid>\d*)#(?<tid>[^:]*): \*(?<cid>\d*) (?<message>.*)$/.match(log)
|
132
181
|
|
133
|
-
record[
|
134
|
-
record[
|
135
|
-
record[
|
136
|
-
record[
|
137
|
-
record[
|
138
|
-
record[
|
182
|
+
record['time'] = item[:time]
|
183
|
+
record['level'] = item[:level]
|
184
|
+
record['message'] = item[:message]
|
185
|
+
record['process'] = item[:pid] # process id
|
186
|
+
record['thread'] = item[:tid] # thread id
|
187
|
+
record['counter'] = item[:cid] # counter
|
139
188
|
|
140
189
|
detail = /request: "(?<method>[^ ]*) (?<path>[^"]*)"/.match(item[:message])
|
141
190
|
unless detail.nil?
|
142
|
-
record[
|
143
|
-
record[
|
191
|
+
record['method'] = detail[:method]
|
192
|
+
record['path'] = detail[:path]
|
144
193
|
end
|
145
194
|
|
146
195
|
detail = /referrer: "(?<referrer>[^"]*)"/.match(item[:message])
|
147
196
|
unless detail.nil?
|
148
|
-
record[
|
197
|
+
record['referrer'] = detail[:referrer]
|
149
198
|
end
|
150
199
|
|
151
200
|
return record
|
152
201
|
end
|
153
202
|
|
154
203
|
# other log
|
155
|
-
record[
|
204
|
+
record['message'] = log.gsub(/\n$/, '')
|
156
205
|
record
|
157
206
|
end
|
158
207
|
|
@@ -163,9 +212,9 @@ module Fluent
|
|
163
212
|
log = record['log']
|
164
213
|
|
165
214
|
record['environment'] = Socket.gethostname.split('-')[0]
|
166
|
-
record[
|
167
|
-
record[
|
168
|
-
record[
|
215
|
+
record['cid'] = file[0]
|
216
|
+
record['cname'] = tag
|
217
|
+
record['ctime'] = record['time']
|
169
218
|
|
170
219
|
record.delete('log')
|
171
220
|
record.delete('file')
|
@@ -173,26 +222,29 @@ module Fluent
|
|
173
222
|
|
174
223
|
if /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}\+\d{4} [A-Z]/.match(log)
|
175
224
|
|
176
|
-
item = /^(?<time>[^ ]*) (?<severity>[A-Z])\s* (?<component>(-|([^ ]*)))\s* \[(?<context>[^\]]*)\]\s* ((?<query>.*) (?<querytime>[\d\.]+(?=ms))|(?<message>.*))/.match(log)
|
225
|
+
item = /^(?<time>[^ ]*) (?<severity>[A-Z])\s* (?<component>(-|([^ ]*)))\s* \[(?<context>[^\]]*)\]\s* ((?<query>.*) protocol:op_query (?<querytime>[\d\.]+(?=ms))|(?<message>.*))/.match(log)
|
177
226
|
|
178
|
-
record[
|
179
|
-
record[
|
180
|
-
record[
|
181
|
-
record[
|
227
|
+
record['time'] = item[:time]
|
228
|
+
record['severity'] = item[:severity]
|
229
|
+
record['component'] = item[:component]
|
230
|
+
record['context'] = item[:context]
|
182
231
|
|
183
232
|
if item[:message]
|
184
|
-
record[
|
233
|
+
record['message'] = item[:message]
|
185
234
|
return record
|
186
235
|
end
|
187
236
|
|
188
237
|
if item[:querytime]
|
189
|
-
record[
|
238
|
+
record['querytime'] = format_str(item[:querytime])
|
190
239
|
end
|
191
240
|
|
192
241
|
if item[:query]
|
242
|
+
record['command'] = item[:query]
|
193
243
|
query = /^command\s* (?<collection>[^ ]*) (?<command>.*)$/.match(item[:query])
|
194
|
-
|
195
|
-
|
244
|
+
unless query.nil?
|
245
|
+
record['collection'] = query[:collection]
|
246
|
+
record['command'] = query[:command]
|
247
|
+
end
|
196
248
|
end
|
197
249
|
|
198
250
|
return record
|
@@ -201,6 +253,91 @@ module Fluent
|
|
201
253
|
record
|
202
254
|
end
|
203
255
|
|
256
|
+
# 确认是否发送通知
|
257
|
+
def notice(tag, record)
|
258
|
+
|
259
|
+
unless @notice
|
260
|
+
return record
|
261
|
+
end
|
262
|
+
|
263
|
+
if tag == 'app'
|
264
|
+
if @app_stream && record['stream']
|
265
|
+
send(record) if record['stream'] == @app_stream
|
266
|
+
end
|
267
|
+
|
268
|
+
if @app_message.length > 0 && record['message']
|
269
|
+
@app_message.each do |pattern|
|
270
|
+
if pattern.match(record['message'])
|
271
|
+
send(record)
|
272
|
+
break
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
if @app_status.length > 0 && record['status']
|
278
|
+
send(record) if @app_status.include?(record['status'])
|
279
|
+
end
|
280
|
+
|
281
|
+
if @app_elapsed > 0 && record['elapsed']
|
282
|
+
send(record) if record['elapsed'].to_f > @app_elapsed
|
283
|
+
end
|
284
|
+
|
285
|
+
return record
|
286
|
+
end
|
287
|
+
|
288
|
+
if tag == 'lb'
|
289
|
+
if @lb_stream && record['stream']
|
290
|
+
send(record) if record['stream'] == @lb_stream
|
291
|
+
end
|
292
|
+
|
293
|
+
if @lb_code.length > 0 && record['code']
|
294
|
+
send(record) if @lb_code.include?(record['code'])
|
295
|
+
end
|
296
|
+
|
297
|
+
if @lb_elapsed > 0 && record['elapsed']
|
298
|
+
send(record) if record['elapsed'].to_f > @lb_elapsed
|
299
|
+
end
|
300
|
+
|
301
|
+
return record
|
302
|
+
end
|
303
|
+
|
304
|
+
if tag == 'mongo'
|
305
|
+
if @mongo_severity.length > 0 && record['severity']
|
306
|
+
send(record) if @mongo_severity.include?(record['severity'])
|
307
|
+
end
|
308
|
+
|
309
|
+
if @mongo_querytime > 0 && record['querytime']
|
310
|
+
send(record) if record['querytime'].to_f > @mongo_querytime
|
311
|
+
end
|
312
|
+
|
313
|
+
return record
|
314
|
+
end
|
315
|
+
|
316
|
+
record
|
317
|
+
|
318
|
+
end
|
319
|
+
|
320
|
+
# 发送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))
|
332
|
+
end
|
333
|
+
|
334
|
+
# 转数字
|
335
|
+
def format_str(str)
|
336
|
+
return str.to_i if (str =~ /^\d+$/)
|
337
|
+
return str.to_f if (str =~ /^\d+\.\d+$/)
|
338
|
+
str
|
339
|
+
end
|
340
|
+
|
204
341
|
end
|
205
342
|
end
|
206
343
|
end
|
data/sample/README.md
CHANGED
@@ -21,12 +21,14 @@ Initialized empty Git repository in /Users/lilin/developer/light/fluent-plugin-l
|
|
21
21
|
% gem signin
|
22
22
|
|
23
23
|
- 发布
|
24
|
-
|
24
|
+
1. 删除pkg目录下的所有内容
|
25
|
+
2. 修改 fluent-plugin-light-core.gemspec 中的 spec.version
|
26
|
+
3. 提交所有的修改
|
27
|
+
4. 执行打包发布 $ rake release
|
25
28
|
|
26
29
|
|
27
30
|
## 调试
|
28
31
|
- 执行fluentd
|
29
32
|
|
30
|
-
%
|
31
|
-
% fluentd -c source.conf -p
|
32
|
-
|
33
|
+
% rm -f sample/*.pos
|
34
|
+
% fluentd -c sample/source.conf -p lib/fluent/plugin
|
data/sample/udpsample.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
require 'socket'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
udp = UDPSocket.open()
|
6
|
+
udp.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
7
|
+
udp_addr = Socket.pack_sockaddr_in(7000, '255.255.255.255')
|
8
|
+
|
9
|
+
data = {
|
10
|
+
:query => '/api/log/notice',
|
11
|
+
:params => {
|
12
|
+
:data => {:A => 'A'}
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
params = data.to_json
|
17
|
+
params = "{\"query\":\"/api/log/notice\",\"params\":{\"data\":{\"stream\":\"stdout\",\"environment\":\"Mac\",\"cid\":\"app-0c1b728705d8-f5fc78bc8-8rjfl\",\"cname\":\"0c1b728705d8\",\"ctime\":\"2020-09-20T06:00:53.516987008Z\",\"time\":\"2020-09-20T06:00:53.516\",\"component\":\"I\",\"method\":\"GET\",\"url\":\"/api/app/last?id=xundianxb&os=android\",\"status\":\"200\",\"size\":\"349\",\"uid\":\"-\",\"elapsed\":\"76.078\",\"addr\":\"::ffff:10.244.4.86\"}}}"
|
18
|
+
udp.send(params, 0, udp_addr)
|
19
|
+
|
20
|
+
udp.close
|
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.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LIN LI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/fluent/plugin/filter_light_core.rb
|
90
90
|
- sample/README.md
|
91
91
|
- sample/source.conf
|
92
|
+
- sample/udpsample.rb
|
92
93
|
- test/helper.rb
|
93
94
|
- test/plugin/test_filter_light_core.rb
|
94
95
|
homepage: https://git.alphabets.cn/light/fluent-plugin-light-core
|