fluent-plugin-proxysql-query-log 0.1.0 → 0.2.0

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: d4c903553f7ca67a822ef78e620e680c2cfbec12f9978f5a47699e7b15a7dcef
4
- data.tar.gz: 3215c368881952fa7cfb90cd86ef98638f24f91244d671363a5dcc398aa377ff
3
+ metadata.gz: 93568be0e3dbf36c2d55d5413d72a6583854043f8c3f0c9eab69a75891d04fdc
4
+ data.tar.gz: 33971a068177dc8532636d36ada3b4cc906ed512115970c32c715cf14d71911f
5
5
  SHA512:
6
- metadata.gz: 9fd09286e67b625845cbbd86e22476a8b05b06d22d4b7a617ede115d493838b6c2d1a062dd098debcdef3036c76155ff23b212f1d2d660ebfbbe5efe8b5665a9
7
- data.tar.gz: 552cc4c68d8bbe43baf3c9c0cdf2084ea3b469745e38f8a66e1558560523d092d41dbeadbbfc3d6686ae8f8e8fa7c6df43924ca594da2292599b10a84f5b2d36
6
+ metadata.gz: e856303f5d1c291e1c44ea303bb81f6cc74b8bc056419fbe088386df0ec18a0df92c6bff7a93f4f21a62c83adf701e89213b1a80d9d9e27c90a7aa280010fb0b
7
+ data.tar.gz: 41f8339b5a393c328c504db9c8c6548f23760d3be9f6d73ab9135e50cc39d7827528406495615659b880296f4383387bc9be002d8d0f9c30d044a1e64dbb33f4
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  vendor
2
2
  .bundle/config
3
+ test/tmp/proxysql_query_log/query_log*
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-proxysql-query-log (0.1.0)
4
+ fluent-plugin-proxysql-query-log (0.2.0)
5
5
  cool.io
6
6
  fluentd (= 0.14.16)
7
7
  proxysql_query_log-parser
@@ -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-proxysql-query-log"
6
- spec.version = "0.1.0"
6
+ spec.version = "0.2.0"
7
7
  spec.authors = ["r_takaishi"]
8
8
  spec.email = ["ryo.takaishi.0@gmail.com"]
9
9
 
@@ -25,7 +25,7 @@ module Fluent
25
25
  class ProxysqlQueryLogInput < Fluent::Plugin::Input
26
26
  Fluent::Plugin.register_input("proxysql_query_log", self)
27
27
 
28
- helpers :event_loop, :storage
28
+ helpers :event_loop, :storage, :timer
29
29
 
30
30
  DEFAULT_STORAGE_TYPE = 'local'
31
31
 
@@ -33,6 +33,7 @@ module Fluent
33
33
  config_param :read_from_head, :bool, default: false
34
34
  desc 'The paths to exclude the files from watcher list.'
35
35
  config_param :exclude_path, :array, default: []
36
+ config_param :refresh_interval, :time, default: 60
36
37
  config_param :tag, :string
37
38
 
38
39
  config_section :storage do
@@ -56,7 +57,13 @@ module Fluent
56
57
  def start
57
58
  super
58
59
 
60
+ refresh_watchers
61
+ timer_execute(:in_proxysql_query_log_refresh_watchers, @refresh_interval, &method(:refresh_watchers))
62
+ end
63
+
64
+ def refresh_watchers
59
65
  target_paths = expand_paths
66
+ stop_watchers(target_paths)
60
67
  start_watchers(target_paths)
61
68
  end
62
69
 
@@ -64,10 +71,14 @@ module Fluent
64
71
 
65
72
  paths.each do |path|
66
73
  log.debug("start watch: #{path}")
67
- w = Watcher.new(path, 0, @pos_storage, router, @tag, log)
68
- event_loop_attach(w)
74
+ @watchers[path] = Watcher.new(path, 0, @pos_storage, router, @tag, log)
75
+ end
76
+ end
69
77
 
70
- @watchers[path] = w
78
+ def stop_watchers(paths)
79
+ paths.each do |path|
80
+ w = @watchers.delete(path) if w
81
+ w.detach if w
71
82
  end
72
83
  end
73
84
 
@@ -10,6 +10,7 @@ module Fluent
10
10
  @router = router
11
11
  @tag = tag
12
12
  @log = log
13
+ @attached = false
13
14
  read
14
15
  end
15
16
 
@@ -60,6 +61,19 @@ module Fluent
60
61
  def convert_time(t)
61
62
  Time.at(t/1000/1000).utc.strftime('%Y-%m-%d %H:%M:%S')
62
63
  end
64
+
65
+ def attach(loop)
66
+ @attached = true
67
+ super
68
+ end
69
+
70
+ def detach
71
+ @attached = false
72
+ super
73
+ end
74
+ def attached?
75
+ @attached
76
+ end
63
77
  end
64
78
  end
65
79
  end
@@ -4,27 +4,62 @@ require "fluent/plugin/in_proxysql_query_log.rb"
4
4
  class ProxysqlQueryLogInputTest < Test::Unit::TestCase
5
5
  setup do
6
6
  Fluent::Test.setup
7
+ Pathname.glob("#{TMP_DIR}/*").each{|p| File.delete(p)}
7
8
  end
8
9
 
9
10
  TMP_DIR = File.dirname(__FILE__) + '/../tmp/proxysql_query_log'
10
11
  CONFIG = config_element('ROOT', '', {
11
- 'path' => "#{TMP_DIR}/query_log",
12
+ 'path' => "#{TMP_DIR}/query_log.00000001",
12
13
  'tag' => 't1',
14
+ 'refresh_interval' => 2
13
15
  })
14
16
 
17
+ MULTI_FILE_CONFIG = config_element('ROOT', '', {
18
+ 'path' => "#{TMP_DIR}/query_log*",
19
+ 'tag' => 't1',
20
+ 'refresh_interval' => 2
21
+ })
22
+
23
+ QUERY_1 = {
24
+ thread_id: 9,
25
+ username: 'root',
26
+ schema_name: 'alpaca',
27
+ client: '127.0.0.1:34612',
28
+ hid: 0,
29
+ server: '127.0.0.1:3306',
30
+ start_time: 1525944256367381,
31
+ end_time: 1525944256367837,
32
+ digest: '0xD69C6B36F32D2EAE',
33
+ query: 'SELECT * FROM test'
34
+ }
35
+
36
+ QUERY_2 = {
37
+ thread_id: 9,
38
+ username: 'root',
39
+ schema_name: 'alpaca',
40
+ client: '127.0.0.1:34612',
41
+ hid: 0,
42
+ server: '127.0.0.1:3306',
43
+ start_time: 1525944256367381,
44
+ end_time: 1525944256367837,
45
+ digest: '0xD69C6B36F32D2EAE',
46
+ query: 'show databases'
47
+ }
48
+
15
49
  test 'singlefile' do
16
- File.open("#{TMP_DIR}/query_log", 'wb') {|f|
17
- write_record(f)
50
+ File.open("#{TMP_DIR}/query_log.00000001", 'wb') {|f|
51
+ write_record(f, QUERY_1)
18
52
  }
19
53
  config = CONFIG
20
54
  d = create_driver(config)
21
55
  d.run(expect_emits: 1) do
22
- File.open("#{TMP_DIR}/query_log", "ab") {|f|
23
- write_record(f)
56
+ File.open("#{TMP_DIR}/query_log.00000001", "ab") {|f|
57
+ write_record(f, QUERY_1)
24
58
  }
25
59
  end
26
60
 
27
61
  events = d.events
62
+ assert_equal(1, d.instance.instance_variable_get('@watchers').size)
28
63
  assert_equal(true, events.length > 0)
29
64
  assert_equal(1, 1)
30
65
  assert_equal(9, events[0][2]['thread_id'])
@@ -39,20 +74,116 @@ class ProxysqlQueryLogInputTest < Test::Unit::TestCase
39
74
  assert_equal('SELECT * FROM test', events[0][2]['query'])
40
75
  end
41
76
 
77
+ test 'multifile' do
78
+ File.open("#{TMP_DIR}/query_log.00000001", 'wb') {|f|
79
+ write_record(f, QUERY_1)
80
+ }
81
+ File.open("#{TMP_DIR}/query_log.00000002", 'wb') {|f|
82
+ write_record(f, QUERY_2)
83
+ }
84
+
85
+ config = MULTI_FILE_CONFIG
86
+ d = create_driver(config)
87
+ d.run(expect_emits: 2) do
88
+ File.open("#{TMP_DIR}/query_log.00000001", "ab") {|f|
89
+ write_record(f, QUERY_1)
90
+ }
91
+ File.open("#{TMP_DIR}/query_log.00000002", "ab") {|f|
92
+ write_record(f, QUERY_2)
93
+ }
94
+ end
95
+
96
+ events = d.events
97
+ assert_equal(2, d.instance.instance_variable_get('@watchers').size)
98
+ assert_equal(true, events.length > 0)
99
+ assert_equal(1, 1)
100
+ assert_equal(9, events[0][2]['thread_id'])
101
+ assert_equal('root', events[0][2]['username'])
102
+ assert_equal('alpaca', events[0][2]['schema_name'])
103
+ assert_equal('127.0.0.1:34612', events[0][2]['client'])
104
+ assert_equal(0, events[0][2]['HID'])
105
+ assert_equal('127.0.0.1:3306', events[0][2]['server'])
106
+ assert_equal('2018-05-10 09:24:16', events[0][2]['start_time'])
107
+ assert_equal('2018-05-10 09:24:16', events[0][2]['end_time'])
108
+ assert_equal('0xD69C6B36F32D2EAE', events[0][2]['digest'])
109
+ assert_equal('SELECT * FROM test', events[0][2]['query'])
110
+
111
+ assert_equal(2, d.instance.instance_variable_get('@watchers').size)
112
+ assert_equal(true, events.length > 0)
113
+ assert_equal(1, 1)
114
+ assert_equal(9, events[1][2]['thread_id'])
115
+ assert_equal('root', events[1][2]['username'])
116
+ assert_equal('alpaca', events[1][2]['schema_name'])
117
+ assert_equal('127.0.0.1:34612', events[1][2]['client'])
118
+ assert_equal(0, events[1][2]['HID'])
119
+ assert_equal('127.0.0.1:3306', events[1][2]['server'])
120
+ assert_equal('2018-05-10 09:24:16', events[1][2]['start_time'])
121
+ assert_equal('2018-05-10 09:24:16', events[1][2]['end_time'])
122
+ assert_equal('0xD69C6B36F32D2EAE', events[1][2]['digest'])
123
+ assert_equal('show databases', events[1][2]['query'])
124
+ end
125
+
126
+ test 'rotate_file' do
127
+ File.open("#{TMP_DIR}/query_log.00000001", 'wb') {|f|
128
+ write_record(f, QUERY_1)
129
+ }
130
+
131
+ config = MULTI_FILE_CONFIG
132
+ d = create_driver(config)
133
+ d.run(expect_emits: 2) do
134
+ File.open("#{TMP_DIR}/query_log.00000002", "ab") {|f|
135
+ write_record(f, QUERY_2)
136
+ }
137
+ sleep 5
138
+
139
+ File.open("#{TMP_DIR}/query_log.00000002", "ab") {|f|
140
+ write_record(f, QUERY_2)
141
+ }
142
+ end
143
+
144
+ events = d.events
145
+
146
+ assert_equal(2, d.instance.instance_variable_get('@watchers').size)
147
+ assert_equal(true, events.length > 0)
148
+
149
+ assert_equal(9, events[0][2]['thread_id'])
150
+ assert_equal('root', events[0][2]['username'])
151
+ assert_equal('alpaca', events[0][2]['schema_name'])
152
+ assert_equal('127.0.0.1:34612', events[0][2]['client'])
153
+ assert_equal(0, events[0][2]['HID'])
154
+ assert_equal('127.0.0.1:3306', events[0][2]['server'])
155
+ assert_equal('2018-05-10 09:24:16', events[0][2]['start_time'])
156
+ assert_equal('2018-05-10 09:24:16', events[0][2]['end_time'])
157
+ assert_equal('0xD69C6B36F32D2EAE', events[0][2]['digest'])
158
+ assert_equal('SELECT * FROM test', events[0][2]['query'])
159
+
160
+ assert_equal(9, events[1][2]['thread_id'])
161
+ assert_equal('root', events[1][2]['username'])
162
+ assert_equal('alpaca', events[1][2]['schema_name'])
163
+ assert_equal('127.0.0.1:34612', events[1][2]['client'])
164
+ assert_equal(0, events[1][2]['HID'])
165
+ assert_equal('127.0.0.1:3306', events[1][2]['server'])
166
+ assert_equal('2018-05-10 09:24:16', events[1][2]['start_time'])
167
+ assert_equal('2018-05-10 09:24:16', events[1][2]['end_time'])
168
+ assert_equal('0xD69C6B36F32D2EAE', events[1][2]['digest'])
169
+ assert_equal('show databases', events[1][2]['query'])
170
+
171
+ end
172
+
42
173
  private
43
174
 
44
- def write_record(f)
175
+ def write_record(f, param)
45
176
  q = ProxysqlQueryLog::Query.new
46
- q.thread_id = 9
47
- q.username = 'root'
48
- q.schema_name = 'alpaca'
49
- q.client = '127.0.0.1:34612'
50
- q.hid = 0
51
- q.server = '127.0.0.1:3306'
52
- q.start_time = 1525944256367381
53
- q.end_time = 1525944256367837
54
- q.digest = '0xD69C6B36F32D2EAE'
55
- q.query = 'SELECT * FROM test'
177
+ q.thread_id = param[:thread_id]
178
+ q.username = param[:username]
179
+ q.schema_name = param[:schema_name]
180
+ q.client = param[:client]
181
+ q.hid = param[:hid]
182
+ q.server = param[:server]
183
+ q.start_time = param[:start_time]
184
+ q.end_time = param[:end_time]
185
+ q.digest = param[:digest]
186
+ q.query = param[:query]
56
187
 
57
188
  f.write([total_length(q), 0, 0, 0, 0, 0, 0, 0].pack('C*'))
58
189
  f.write(to_binary(q))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-proxysql-query-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - r_takaishi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-29 00:00:00.000000000 Z
11
+ date: 2018-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler