mmtop 0.9.4 → 0.9.5
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/lib/mmtop/filters/map_topology.rb +22 -5
- data/lib/mmtop/host.rb +45 -17
- data/lib/mmtop/mmconfig.rb +1 -6
- data/lib/mmtop/qps.rb +46 -0
- data/lib/mmtop/term_printer.rb +4 -2
- metadata +5 -4
@@ -1,3 +1,6 @@
|
|
1
|
+
# I'd like to say that I no longer understand this code.
|
2
|
+
# Also, I'd like to say that it's unlikely to work for you, the general public. patches welcome!
|
3
|
+
|
1
4
|
module MMTop
|
2
5
|
class Topology
|
3
6
|
def initialize(config)
|
@@ -10,9 +13,10 @@ module MMTop
|
|
10
13
|
|
11
14
|
new_top = create_sort_array(topology)
|
12
15
|
|
13
|
-
hosts = @config.hosts.sort_by { |h| new_top.find_index { |t| t[:hostname] == h.name } }
|
16
|
+
hosts = @config.hosts.sort_by { |h| new_top.find_index { |t| t[:hostname] == h.name } || 1_000_000 }
|
14
17
|
hosts.each { |h|
|
15
18
|
top = new_top.find { |t| t[:hostname] == h.name }
|
19
|
+
next unless top
|
16
20
|
if top[:levels] > 0
|
17
21
|
h.display_name = (" " * top[:levels]) + '\_' + h.name
|
18
22
|
end
|
@@ -70,7 +74,11 @@ module MMTop
|
|
70
74
|
|
71
75
|
def find_master_slave
|
72
76
|
topology = @config.hosts.inject({}) { |accum, h|
|
73
|
-
|
77
|
+
rows = h.query("show global variables where Variable_name='hostname'")
|
78
|
+
next accum if rows.empty?
|
79
|
+
|
80
|
+
hostname = rows.first[:Value]
|
81
|
+
|
74
82
|
hostname = hostname.split('.')[0]
|
75
83
|
status = h.slave_status
|
76
84
|
|
@@ -107,9 +115,18 @@ module MMTop
|
|
107
115
|
end
|
108
116
|
|
109
117
|
Filter.add_filter("discover_topology") do |queries, hostinfo, config|
|
110
|
-
if !config.options['discovered']
|
111
|
-
config.options['discovered'] = true
|
118
|
+
if config.options['discover_topology'] && !config.options['topology.discovered']
|
119
|
+
config.options['topology.discovered'] = true
|
112
120
|
config.hosts = MMTop::Topology.new(config).new_hostlist
|
113
|
-
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
MMTop::Command.register do |c|
|
125
|
+
c.regexp /map_topology/
|
126
|
+
c.usage "map_topology"
|
127
|
+
c.explain "Re-Map the slave-chain topology"
|
128
|
+
c.command do |cmd, config|
|
129
|
+
config.options['discovered'] = false
|
130
|
+
end
|
114
131
|
end
|
115
132
|
end
|
data/lib/mmtop/host.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mmtop/qps'
|
2
|
+
|
1
3
|
module MMTop
|
2
4
|
class Host
|
3
5
|
def initialize(hostname, user, password, options)
|
@@ -8,20 +10,43 @@ module MMTop
|
|
8
10
|
m2opts[:socket] = options['socket'] if options['socket']
|
9
11
|
m2opts[:port] = options['port'] if options['port']
|
10
12
|
m2opts[:reconnect] = true
|
11
|
-
@mysql = Mysql2::Client.new(m2opts)
|
12
|
-
# rescue connection errors or sumpin
|
13
13
|
@options = options
|
14
14
|
@name = hostname
|
15
15
|
@display_name = @name
|
16
16
|
@comment = options['comment']
|
17
17
|
@last_queries = nil
|
18
|
+
|
19
|
+
begin
|
20
|
+
@mysql = Mysql2::Client.new(m2opts)
|
21
|
+
rescue Mysql2::Error => e
|
22
|
+
if e.error_number == 2003
|
23
|
+
mark_dead!
|
24
|
+
else
|
25
|
+
raise e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# rescue connection errors or sumpin
|
18
30
|
end
|
19
31
|
|
20
32
|
attr_accessor :display_name, :name, :comment, :options
|
21
33
|
|
22
34
|
def query(q)
|
35
|
+
return [] if dead?
|
36
|
+
|
23
37
|
res = []
|
24
|
-
|
38
|
+
begin
|
39
|
+
ret = @mysql.query(q)
|
40
|
+
rescue Mysql2::Error => e
|
41
|
+
if [2007, 2013, 2003].include?(e.error_number)
|
42
|
+
mark_dead!
|
43
|
+
return []
|
44
|
+
else
|
45
|
+
puts "Got error number " + e.error_number.to_s
|
46
|
+
raise e
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
25
50
|
return nil unless ret
|
26
51
|
ret.each(:symbolize_keys => true) do |r|
|
27
52
|
res << r
|
@@ -29,6 +54,14 @@ module MMTop
|
|
29
54
|
res
|
30
55
|
end
|
31
56
|
|
57
|
+
def mark_dead!
|
58
|
+
@dead = true
|
59
|
+
end
|
60
|
+
|
61
|
+
def dead?
|
62
|
+
@dead
|
63
|
+
end
|
64
|
+
|
32
65
|
def slave_status
|
33
66
|
return nil if @options['expect_slave'] == false
|
34
67
|
res = query("show slave status")[0]
|
@@ -42,20 +75,15 @@ module MMTop
|
|
42
75
|
|
43
76
|
def stats
|
44
77
|
stats = {}
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
stats[:qps] = qps
|
55
|
-
end
|
56
|
-
@last_queries = {}
|
57
|
-
@last_queries[:count] = queries
|
58
|
-
@last_queries[:time] = Time.now.to_i
|
78
|
+
row = query("show global status like 'Questions'")
|
79
|
+
return {} if row.empty?
|
80
|
+
|
81
|
+
queries = row.first[:Value].to_i
|
82
|
+
|
83
|
+
@qps ||= MMTop::QPS.new
|
84
|
+
@qps.add_sample(queries, Time.now)
|
85
|
+
stats[:qps] = @qps.calc.to_i
|
86
|
+
|
59
87
|
stats
|
60
88
|
end
|
61
89
|
|
data/lib/mmtop/mmconfig.rb
CHANGED
@@ -18,12 +18,7 @@ module MMTop
|
|
18
18
|
h['password'] ||= (pass || config['password'])
|
19
19
|
h['wedge_monitor'] ||= config['wedge_monitor']
|
20
20
|
|
21
|
-
|
22
|
-
Host.new(h['host'], h['user'], h['password'], h)
|
23
|
-
rescue Mysql2::Error => e
|
24
|
-
puts e
|
25
|
-
nil
|
26
|
-
end
|
21
|
+
Host.new(h['host'], h['user'], h['password'], h)
|
27
22
|
end.compact
|
28
23
|
|
29
24
|
@filters = MMTop::Filter.default_filters
|
data/lib/mmtop/qps.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module MMTop
|
2
|
+
class QPS
|
3
|
+
DEFAULT_WINDOW = 20
|
4
|
+
|
5
|
+
QUERIES = 0
|
6
|
+
TIME = 1
|
7
|
+
def self.window
|
8
|
+
@window || DEFAULT_WINDOW
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.window=(window)
|
12
|
+
@window = window
|
13
|
+
end
|
14
|
+
|
15
|
+
def window
|
16
|
+
self.class.window
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_sample(queries, time)
|
20
|
+
samples.push [queries, time]
|
21
|
+
clean_samples
|
22
|
+
end
|
23
|
+
|
24
|
+
def calc
|
25
|
+
clean_samples
|
26
|
+
return '...' if samples.size == 1
|
27
|
+
|
28
|
+
queries = samples.last[QUERIES] - samples.first[QUERIES]
|
29
|
+
time = samples.last[TIME].to_i - samples.first[TIME].to_i
|
30
|
+
|
31
|
+
queries / time
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def clean_samples
|
37
|
+
while samples.first[TIME].to_i < (Time.now.to_i - window)
|
38
|
+
samples.shift
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def samples
|
43
|
+
@samples ||= []
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/mmtop/term_printer.rb
CHANGED
@@ -133,14 +133,16 @@ module MMTop
|
|
133
133
|
str = pipe + " " + column_value(0, p.client, ' ', :right)
|
134
134
|
str += info_sep + column_value(1, p.id ? p.id.to_s : '')
|
135
135
|
str += info_sep + column_value(2, format_time(p.time))
|
136
|
-
str += info_sep
|
136
|
+
str += info_sep
|
137
137
|
str += format_process(p, @x - str.size - 1)
|
138
138
|
str += " " * (@x - str.size - 1) + pipe
|
139
139
|
puts str
|
140
140
|
end
|
141
141
|
|
142
142
|
def print_host(info)
|
143
|
-
|
143
|
+
display_name = info.host.display_name
|
144
|
+
display_name = (display_name + "!").red if info.host.dead?
|
145
|
+
str = pipe + " " + column_value(0, display_name + " " + (info.host.comment || ""), "-".dark_gray)
|
144
146
|
str += sep_fill + column_fill(1) + sep_fill + column_fill(2)
|
145
147
|
str += info_sep + column_value(3, info.connections.size.to_s)
|
146
148
|
str += info_sep + column_value(4, format_slave_status(info.slave_status))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mmtop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 5
|
10
|
+
version: 0.9.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ben Osheroff
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-02-03 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/mmtop/process.rb
|
81
81
|
- lib/mmtop/host.rb
|
82
82
|
- lib/mmtop/term_input.rb
|
83
|
+
- lib/mmtop/qps.rb
|
83
84
|
- lib/mmtop/term_printer.rb
|
84
85
|
- lib/mmtop/commands/filters.rb
|
85
86
|
- lib/mmtop/commands/kill.rb
|