myslog 0.0.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.
- data/.gitignore +18 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +24 -0
- data/README.md +4 -0
- data/Rakefile +2 -0
- data/lib/myslog.rb +86 -0
- data/myslog.gemspec +17 -0
- data/spec/myslog.rb +182 -0
- data/spec/spec_helper.rb +4 -0
- metadata +67 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
myslog (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.3)
|
10
|
+
rspec (2.10.0)
|
11
|
+
rspec-core (~> 2.10.0)
|
12
|
+
rspec-expectations (~> 2.10.0)
|
13
|
+
rspec-mocks (~> 2.10.0)
|
14
|
+
rspec-core (2.10.1)
|
15
|
+
rspec-expectations (2.10.0)
|
16
|
+
diff-lcs (~> 1.1.3)
|
17
|
+
rspec-mocks (2.10.1)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
myslog!
|
24
|
+
rspec
|
data/README.md
ADDED
data/Rakefile
ADDED
data/lib/myslog.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
#
|
2
|
+
# MySlog
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012 Yuku TAKAHASHI
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
require "time"
|
19
|
+
|
20
|
+
class MySlog
|
21
|
+
def parse(lines)
|
22
|
+
divide(lines).map {|record| parse_record(record) }
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def divide(lines)
|
28
|
+
records = []
|
29
|
+
|
30
|
+
line = lines.shift
|
31
|
+
|
32
|
+
while line
|
33
|
+
record = []
|
34
|
+
|
35
|
+
if line.start_with? "# Time:"
|
36
|
+
record << line
|
37
|
+
record << lines.shift # user@host
|
38
|
+
record << lines.shift # query time
|
39
|
+
else
|
40
|
+
record << line # user@host
|
41
|
+
record << lines.shift # query time
|
42
|
+
end
|
43
|
+
|
44
|
+
record << lines.shift # user@host
|
45
|
+
record << lines.shift # query time
|
46
|
+
|
47
|
+
while (line = lines.shift) != nil && !line.start_with?("#")
|
48
|
+
record << line
|
49
|
+
end
|
50
|
+
|
51
|
+
records << record
|
52
|
+
end
|
53
|
+
|
54
|
+
records
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_record(lines)
|
58
|
+
response = {}
|
59
|
+
|
60
|
+
line = lines.shift
|
61
|
+
if line.start_with? "# Time:"
|
62
|
+
date = line[8..-1].strip
|
63
|
+
response[:date] = Time.parse(date)
|
64
|
+
|
65
|
+
line = lines.shift
|
66
|
+
else
|
67
|
+
response[:date] = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
elems = line.split(" ")
|
71
|
+
response[:user] = elems[2].strip
|
72
|
+
response[:host] = elems[4].strip
|
73
|
+
response[:host_ip] = elems[5].strip[1...-1]
|
74
|
+
|
75
|
+
line = lines.shift
|
76
|
+
elems = line.split(" ")
|
77
|
+
response[:query_time] = elems[2].to_f
|
78
|
+
response[:lock_time] = elems[4].to_f
|
79
|
+
response[:rows_sent] = elems[6].to_i
|
80
|
+
response[:rows_examined] = elems[8].to_i
|
81
|
+
|
82
|
+
response[:sql] = lines.map{|line| line.strip}.join("\n")
|
83
|
+
|
84
|
+
response
|
85
|
+
end
|
86
|
+
end
|
data/myslog.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding:utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["taka84u9"]
|
5
|
+
gem.email = ["taka84u9@gmail.com"]
|
6
|
+
gem.description = %q{MySQL slow query parser.}
|
7
|
+
gem.summary = %q{MySQL slow query parser.}
|
8
|
+
gem.homepage = "https://github.com/taka84u9/myslog"
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
+
gem.name = "myslog"
|
14
|
+
gem.require_paths = ["lib"]
|
15
|
+
gem.version = "0.0.1"
|
16
|
+
gem.add_development_dependency "rspec"
|
17
|
+
end
|
data/spec/myslog.rb
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe "MySlog" do
|
6
|
+
before :all do
|
7
|
+
@log = <<-EOF
|
8
|
+
# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]
|
9
|
+
# Time: 14 Lock_time: 0 Rows_sent: 127 Rows_examined: 87189
|
10
|
+
|
11
|
+
select retard_user.id, cname.first,cname.last
|
12
|
+
from retard_user,contact,cname,helmet
|
13
|
+
where cname.id = contact.name_id
|
14
|
+
and contact.id = retard_user.contact_id
|
15
|
+
and retard_user.helmet_id = helmet.id
|
16
|
+
and helmet.brand_id = 9
|
17
|
+
and helmet.id = 143
|
18
|
+
group by retard_user.id
|
19
|
+
order by cname.last;
|
20
|
+
# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]
|
21
|
+
# Time: 0 Lock_time: 0 Rows_sent: 2 Rows_examined: 1
|
22
|
+
|
23
|
+
select workbook_code from workbook_defs where brand_id=9;
|
24
|
+
# Time: 010626 10:44:50
|
25
|
+
# User@Host: staff[staff] @ algernon.retards.org [10.10.10.7]
|
26
|
+
# Time: 0 Lock_time: 0 Rows_sent: 3 Rows_examined: 1
|
27
|
+
use lead_generator;
|
28
|
+
|
29
|
+
SELECT answer_id, answer_text
|
30
|
+
FROM pl_answers
|
31
|
+
WHERE poll_id = 4
|
32
|
+
;
|
33
|
+
# Time: 010626 10:44:51
|
34
|
+
# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]
|
35
|
+
# Time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 1
|
36
|
+
use webtie;
|
37
|
+
|
38
|
+
select count(tm.id)
|
39
|
+
from text_message tm, tm_status tms
|
40
|
+
where tm.tm_status_id = tms.id and
|
41
|
+
tm.to_id = 21259 and
|
42
|
+
tm.to_group = 'retard_user' and
|
43
|
+
tms.description = 'new';
|
44
|
+
EOF
|
45
|
+
end
|
46
|
+
|
47
|
+
before :each do
|
48
|
+
@myslog = MySlog.new
|
49
|
+
@lines = @log.split("\n").map {|line| line.chomp}
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#parse" do
|
53
|
+
it "should return Array of Hash" do
|
54
|
+
results = @myslog.parse(@lines)
|
55
|
+
results.should be_an_instance_of Array
|
56
|
+
results.each do |result|
|
57
|
+
results.should be_an_instance_of Array
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#divide" do
|
63
|
+
|
64
|
+
it "should return Array of Array" do
|
65
|
+
results = @myslog.send(:divide, @lines)
|
66
|
+
results.should be_an_instance_of Array
|
67
|
+
results.each do |result|
|
68
|
+
results.should be_an_instance_of Array
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should devide lines in set of records" do
|
73
|
+
results = @myslog.send(:divide, @lines)
|
74
|
+
|
75
|
+
record = results[0]
|
76
|
+
record.size.should == 12
|
77
|
+
record[0].should ==
|
78
|
+
"# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]"
|
79
|
+
|
80
|
+
record = results[1]
|
81
|
+
record.size.should == 4
|
82
|
+
record[0].should ==
|
83
|
+
"# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]"
|
84
|
+
|
85
|
+
record = results[2]
|
86
|
+
record.size.should == 9
|
87
|
+
record[0].should ==
|
88
|
+
"# Time: 010626 10:44:50"
|
89
|
+
|
90
|
+
record = results[3]
|
91
|
+
record.size.should == 11
|
92
|
+
record[0].should ==
|
93
|
+
"# Time: 010626 10:44:51"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#parse_record" do
|
98
|
+
it "should return an instance of Hash having specific keys" do
|
99
|
+
lines = [
|
100
|
+
"# Time: 010626 10:44:51",
|
101
|
+
"# User@Host: gimp[drool] @ algernon.retards.org [10.10.10.7]",
|
102
|
+
"# Time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 1",
|
103
|
+
"use webtie;"
|
104
|
+
]
|
105
|
+
response = @myslog.send(:parse_record, lines)
|
106
|
+
|
107
|
+
response.should be_an_instance_of Hash
|
108
|
+
%w[
|
109
|
+
date user host host_ip query_time lock_time rows_sent rows_examined sql
|
110
|
+
].each { |k| response.should have_key k.to_sym}
|
111
|
+
end
|
112
|
+
|
113
|
+
context "given full log" do
|
114
|
+
describe "response" do
|
115
|
+
before :each do
|
116
|
+
@date = Time.now
|
117
|
+
@user = "root[root]"
|
118
|
+
@host = "localhost"
|
119
|
+
@host_ip = ""
|
120
|
+
@query_time = 0.000270
|
121
|
+
@lock_time = 0.000097
|
122
|
+
@rows_sent = 1
|
123
|
+
@rows_examined = 0
|
124
|
+
@sql = "SET timestamp=1317619058;\nSELECT * FROM life;"
|
125
|
+
@lines = [
|
126
|
+
"# Time: #{@date.strftime("%y%m%d %H:%M:%S")}",
|
127
|
+
"# User@Host: #{@user} @ #{@host} [#{@host_ip}]",
|
128
|
+
"# Query_time: #{@query_time} Lock_time: #{@lock_time} Rows_sent: #{@rows_sent} Rows_examined: #{@rows_examined}",
|
129
|
+
@sql
|
130
|
+
]
|
131
|
+
@response = @myslog.send(:parse_record, @lines)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should have expected values" do
|
135
|
+
@response[:date].to_i.should == @date.to_i
|
136
|
+
@response[:user].should == @user
|
137
|
+
@response[:host].should == @host
|
138
|
+
@response[:host_ip].should == @host_ip
|
139
|
+
@response[:query_time].should == @query_time
|
140
|
+
@response[:lock_time].should == @lock_time
|
141
|
+
@response[:rows_sent].should == @rows_sent
|
142
|
+
@response[:rows_examined].should == @rows_examined
|
143
|
+
@response[:sql].should == @sql.strip
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context "given partial log" do
|
149
|
+
describe "response" do
|
150
|
+
before :each do
|
151
|
+
@user = "root[root]"
|
152
|
+
@host = "localhost"
|
153
|
+
@host_ip = ""
|
154
|
+
@query_time = 0.000270
|
155
|
+
@lock_time = 0.000097
|
156
|
+
@rows_sent = 1
|
157
|
+
@rows_examined = 0
|
158
|
+
@sql = "SET timestamp=1317619058; SELECT * FROM life;"
|
159
|
+
@lines = [
|
160
|
+
"# User@Host: #{@user} @ #{@host} [#{@host_ip}]",
|
161
|
+
"# Query_time: #{@query_time} Lock_time: #{@lock_time} Rows_sent: #{@rows_sent} Rows_examined: #{@rows_examined}",
|
162
|
+
@sql
|
163
|
+
]
|
164
|
+
@response = @myslog.send(:parse_record, @lines)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should have expected values" do
|
168
|
+
@response[:date].should == nil
|
169
|
+
@response[:user].should == @user
|
170
|
+
@response[:host].should == @host
|
171
|
+
@response[:host_ip].should == @host_ip
|
172
|
+
@response[:query_time].should == @query_time
|
173
|
+
@response[:lock_time].should == @lock_time
|
174
|
+
@response[:rows_sent].should == @rows_sent
|
175
|
+
@response[:rows_examined].should == @rows_examined
|
176
|
+
@response[:sql].should == @sql.strip
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: myslog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- taka84u9
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-07 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70118056303180 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70118056303180
|
25
|
+
description: MySQL slow query parser.
|
26
|
+
email:
|
27
|
+
- taka84u9@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Gemfile.lock
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- lib/myslog.rb
|
38
|
+
- myslog.gemspec
|
39
|
+
- spec/myslog.rb
|
40
|
+
- spec/spec_helper.rb
|
41
|
+
homepage: https://github.com/taka84u9/myslog
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
requirements: []
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 1.8.10
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: MySQL slow query parser.
|
65
|
+
test_files:
|
66
|
+
- spec/myslog.rb
|
67
|
+
- spec/spec_helper.rb
|