pencil 0.2.6 → 0.2.8
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/VERSION.rb +1 -0
- data/examples/dashboards.yml +4 -0
- data/examples/graphs.yml +102 -5
- data/examples/pencil.yml +1 -1
- data/lib/dash.rb +2 -7
- data/lib/helpers.rb +3 -3
- data/lib/models/graph.rb +2 -2
- data/lib/models/host.rb +10 -5
- data/lib/views/dash-cluster-zoom.erb +0 -1
- data/lib/views/global.erb +1 -3
- data/lib/views/layout.erb +7 -3
- data/lib/views/partials/hosts_selector.erb +3 -1
- metadata +27 -28
data/VERSION.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
PENCIL_VERSION = "0.2.8"
|
data/examples/dashboards.yml
CHANGED
@@ -51,6 +51,10 @@
|
|
51
51
|
- load_average:
|
52
52
|
- cpu_usage:
|
53
53
|
- network_traffic:
|
54
|
+
- mysql_pending_file_io:
|
55
|
+
- mysql_history_length:
|
56
|
+
- mysql_file_io_threads:
|
57
|
+
- mysql_file_io_threads_usage:
|
54
58
|
hosts: ["sync*_db", "wp-db*"]
|
55
59
|
sync_node_alloc:
|
56
60
|
title: sync node allocation
|
data/examples/graphs.yml
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
title: "syncstorage 401s"
|
26
26
|
targets:
|
27
27
|
syncstorage.request_rate.401:
|
28
|
-
:key:
|
28
|
+
:key: 200
|
29
29
|
:color: brown
|
30
30
|
hosts: ["sync*_web", "test*_web", "wp-web*"]
|
31
31
|
|
@@ -193,10 +193,10 @@
|
|
193
193
|
scale: 1024 # M -> G
|
194
194
|
hosts: ["*"]
|
195
195
|
# some random options for demonstration
|
196
|
-
template: alphas
|
197
|
-
bgcolor: "#AFFFFF"
|
198
|
-
vtitle: tvtnolgrf
|
199
|
-
lineWidth: 20
|
196
|
+
# template: alphas
|
197
|
+
# bgcolor: "#AFFFFF"
|
198
|
+
# vtitle: tvtnolgrf
|
199
|
+
# lineWidth: 20
|
200
200
|
|
201
201
|
sync_node_alloc:
|
202
202
|
title: "node alloc rate"
|
@@ -221,3 +221,100 @@
|
|
221
221
|
:color: blue
|
222
222
|
|
223
223
|
hosts: ["wp-adm01"]
|
224
|
+
|
225
|
+
mysql_pending_file_io:
|
226
|
+
title: "mysql pending file i/o"
|
227
|
+
targets:
|
228
|
+
stats.timers.mysql.innodb.pending_read.mean:
|
229
|
+
:key: read
|
230
|
+
:color: green
|
231
|
+
stats.timers.mysql.innodb.pending_write.mean:
|
232
|
+
:key: write
|
233
|
+
:color: blue
|
234
|
+
stats.timers.mysql.innodb.pending_ibuf.mean:
|
235
|
+
:key: ibuf
|
236
|
+
:color: brown
|
237
|
+
stats.timers.mysql.innodb.pending_log.mean:
|
238
|
+
:key: log
|
239
|
+
:color: red
|
240
|
+
stats.timers.mysql.innodb.pending_sync.mean:
|
241
|
+
:key: sync
|
242
|
+
:color: yellow
|
243
|
+
|
244
|
+
hosts: ["wp-db*", "sync*_db"]
|
245
|
+
|
246
|
+
mysql_history_length:
|
247
|
+
title: "mysql transaction history"
|
248
|
+
targets:
|
249
|
+
stats.timers.mysql.innodb.history_length.mean:
|
250
|
+
:key: read
|
251
|
+
:color: green
|
252
|
+
|
253
|
+
hosts: ["wp-db*", "sync*_db"]
|
254
|
+
|
255
|
+
mysql_file_io_threads_usage:
|
256
|
+
title: "mysql file i/o threads active (% used)"
|
257
|
+
targets:
|
258
|
+
? - stats.timers.mysql.innodb.threads_active_read.mean:
|
259
|
+
- stats.timers.mysql.innodb.threads_total_read.mean:
|
260
|
+
:
|
261
|
+
!omap
|
262
|
+
- :divideSeries:
|
263
|
+
- :color: green
|
264
|
+
- :asPercent: 1.0
|
265
|
+
- :movingAverage: 10
|
266
|
+
- :key: read
|
267
|
+
? - stats.timers.mysql.innodb.threads_active_write.mean:
|
268
|
+
- stats.timers.mysql.innodb.threads_total_write.mean:
|
269
|
+
:
|
270
|
+
!omap
|
271
|
+
- :divideSeries:
|
272
|
+
- :color: blue
|
273
|
+
- :asPercent: 1.0
|
274
|
+
- :movingAverage: 10
|
275
|
+
- :key: write
|
276
|
+
? - stats.timers.mysql.innodb.threads_active_ibuf.mean:
|
277
|
+
- stats.timers.mysql.innodb.threads_total_ibuf.mean:
|
278
|
+
:
|
279
|
+
!omap
|
280
|
+
- :divideSeries:
|
281
|
+
- :color: brown
|
282
|
+
- :asPercent: 1.0
|
283
|
+
- :movingAverage: 10
|
284
|
+
- :key: ibuf
|
285
|
+
? - stats.timers.mysql.innodb.threads_active_log.mean:
|
286
|
+
- stats.timers.mysql.innodb.threads_total_log.mean:
|
287
|
+
:
|
288
|
+
!omap
|
289
|
+
- :divideSeries:
|
290
|
+
- :color: red
|
291
|
+
- :asPercent: 1.0
|
292
|
+
- :movingAverage: 10
|
293
|
+
- :key: log
|
294
|
+
hosts: ["wp-db*", "sync*_db"]
|
295
|
+
|
296
|
+
mysql_file_io_threads:
|
297
|
+
title: "mysql file i/o threads"
|
298
|
+
targets:
|
299
|
+
stats.timers.mysql.innodb.threads_active_read.mean:
|
300
|
+
!omap
|
301
|
+
- :color: green
|
302
|
+
- :movingAverage: 10
|
303
|
+
- :key: read
|
304
|
+
stats.timers.mysql.innodb.threads_active_write.mean:
|
305
|
+
!omap
|
306
|
+
- :color: blue
|
307
|
+
- :movingAverage: 10
|
308
|
+
- :key: write
|
309
|
+
stats.timers.mysql.innodb.threads_active_ibuf.mean:
|
310
|
+
!omap
|
311
|
+
- :color: brown
|
312
|
+
- :movingAverage: 10
|
313
|
+
- :key: ibuf
|
314
|
+
stats.timers.mysql.innodb.threads_active_log.mean:
|
315
|
+
!omap
|
316
|
+
- :color: red
|
317
|
+
- :movingAverage: 10
|
318
|
+
- :key: log
|
319
|
+
|
320
|
+
hosts: ["wp-db*", "sync*_db"]
|
data/examples/pencil.yml
CHANGED
data/lib/dash.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
1
|
require "rubygems"
|
4
2
|
require "namespace"
|
5
3
|
|
@@ -17,9 +15,6 @@ require "chronic_duration"
|
|
17
15
|
require "optparse"
|
18
16
|
require "rubyfixes"
|
19
17
|
|
20
|
-
# fixme style.css isn't actually cached, you need to set something up with
|
21
|
-
# rack to cache static files
|
22
|
-
|
23
18
|
$:.unshift(File.dirname(__FILE__))
|
24
19
|
|
25
20
|
module Dash
|
@@ -129,8 +124,8 @@ module Dash
|
|
129
124
|
end
|
130
125
|
|
131
126
|
get '/host/:cluster/:host/?' do
|
132
|
-
@host = Host.
|
133
|
-
@cluster =
|
127
|
+
@host = Host.find_by_name_and_cluster(params[:host], params[:cluster])
|
128
|
+
@cluster = @host.cluster
|
134
129
|
raise "Unknown host: #{params[:host]} in #{params[:cluster]}" unless @host
|
135
130
|
|
136
131
|
@title = "#{@host.cluster} :: host :: #{@host.name}"
|
data/lib/helpers.rb
CHANGED
@@ -114,15 +114,15 @@ module Dash::Helpers
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
-
def hosts_selector(hosts)
|
117
|
+
def hosts_selector(hosts, print_clusters=false)
|
118
|
+
@print_clusters = print_clusters
|
118
119
|
@hosts = hosts
|
119
120
|
erb :'partials/hosts_selector', :layout => false
|
120
121
|
end
|
121
122
|
|
122
123
|
def append_query_string(str)
|
123
124
|
v = str.dup
|
124
|
-
|
125
|
-
(v << "?#{query}") unless request.query_string.empty?
|
125
|
+
(v << "?#{request.query_string}") unless request.query_string.empty?
|
126
126
|
return v
|
127
127
|
end
|
128
128
|
|
data/lib/models/graph.rb
CHANGED
@@ -307,11 +307,11 @@ module Dash::Models
|
|
307
307
|
return metrics.flatten.map { |x| x.split(".") }
|
308
308
|
end
|
309
309
|
|
310
|
-
# FIXMEEEE needs to be fixed for different metric formats
|
311
310
|
def hosts_clusters
|
312
311
|
metrics = expand
|
313
312
|
clusters = Set.new
|
314
313
|
|
314
|
+
# find the indicies of the clusters and hosts
|
315
315
|
f = @params[:metric_format].dup.split("%m")
|
316
316
|
first = f.first.split(".")
|
317
317
|
last = f.last.split(".")
|
@@ -327,7 +327,7 @@ module Dash::Models
|
|
327
327
|
end
|
328
328
|
end
|
329
329
|
hosts = metrics.map do |m|
|
330
|
-
Host.new(m[hi],
|
330
|
+
Host.new(m[hi], m[ci], @params)
|
331
331
|
end.uniq
|
332
332
|
|
333
333
|
# filter by what matches the graph definition
|
data/lib/models/host.rb
CHANGED
@@ -4,9 +4,14 @@ require "models/graph"
|
|
4
4
|
module Dash::Models
|
5
5
|
class Host < Base
|
6
6
|
attr_accessor :graphs
|
7
|
+
attr_reader :cluster
|
7
8
|
|
8
|
-
def initialize(name, params={})
|
9
|
-
super
|
9
|
+
def initialize(name, cluster, params={})
|
10
|
+
super(name, params)
|
11
|
+
@cluster = cluster
|
12
|
+
# hack for the case where colo{1,2}.host1 both exist
|
13
|
+
@@objects[self.class.to_s].delete(name)
|
14
|
+
@@objects[self.class.to_s]["#{cluster}#{name}"] = self
|
10
15
|
|
11
16
|
@graphs = []
|
12
17
|
Graph.each do |graph_name, graph|
|
@@ -19,8 +24,8 @@ module Dash::Models
|
|
19
24
|
end # Graph.each
|
20
25
|
end
|
21
26
|
|
22
|
-
def
|
23
|
-
return
|
27
|
+
def self.find(name)
|
28
|
+
return @@objects[self.name][key] rescue []
|
24
29
|
end
|
25
30
|
|
26
31
|
def key
|
@@ -64,7 +69,7 @@ module Dash::Models
|
|
64
69
|
|
65
70
|
def self.find_by_name_and_cluster(name, cluster)
|
66
71
|
Host.each do |host_name, host|
|
67
|
-
next unless
|
72
|
+
next unless host.name == name
|
68
73
|
return host if host.cluster == cluster
|
69
74
|
end
|
70
75
|
return nil
|
data/lib/views/global.erb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
<h2>List of dashboards for <%= cluster_selector %></h2>
|
2
2
|
|
3
|
-
I feel like some graphs should go here
|
4
|
-
|
5
3
|
<% hosts = Host.all
|
6
4
|
boards = @dashboards
|
7
5
|
seen_hosts = Set.new %>
|
@@ -10,7 +8,7 @@ I feel like some graphs should go here
|
|
10
8
|
<h2><a href="/dash/<%= "#{@cluster}/#{append_query_string(b.name)}" %>"><%= b.name %></a>
|
11
9
|
<% dash_hosts = b.get_all_hosts()[0]
|
12
10
|
seen_hosts += dash_hosts %>
|
13
|
-
<%= hosts_selector(dash_hosts) %>
|
11
|
+
<%= hosts_selector(dash_hosts, true) %>
|
14
12
|
</h2>
|
15
13
|
<%= b.graphs.collect do |g|
|
16
14
|
href = append_query_string("/dash/#{@cluster}/#{b.name}/#{g}")
|
data/lib/views/layout.erb
CHANGED
@@ -17,16 +17,20 @@
|
|
17
17
|
<div id="nav">
|
18
18
|
<% if @cluster %>
|
19
19
|
<ul>
|
20
|
+
<!-- fixme change this to the cluster overview link when there's only one cluster-->
|
20
21
|
Global Views:
|
21
22
|
<li><a href="<%= cluster_link("global") %>">overview</a></li>
|
22
23
|
<br>
|
24
|
+
<% clusters = settings.config.clusters %>
|
25
|
+
<% if clusters.size > 1 %>
|
23
26
|
Cluster Views:
|
24
27
|
<br>
|
25
|
-
|
28
|
+
|
26
29
|
<% clusters.sort.each do |cluster| %>
|
27
30
|
<li><a href="<%= cluster_link(cluster) %>"><%= cluster %></a></li>
|
28
31
|
<% end %>
|
29
32
|
<br>
|
33
|
+
<% end %>
|
30
34
|
Dashboards: (<%= @cluster %>)
|
31
35
|
<br>
|
32
36
|
<% @dashboards.sort.each do |dash| %>
|
@@ -35,7 +39,7 @@
|
|
35
39
|
<br>
|
36
40
|
Jump to Host:
|
37
41
|
<br>
|
38
|
-
<%= hosts_selector(Host.all) %>
|
42
|
+
<%= hosts_selector(* @cluster == "global" ? [Host.all, true] : [Host.find_by_cluster(@cluster), false]) %>
|
39
43
|
<br>
|
40
44
|
<br>
|
41
45
|
<%= input_boxes %>
|
@@ -52,6 +56,6 @@
|
|
52
56
|
|
53
57
|
</body>
|
54
58
|
<div id="footer" style="color:green;">
|
55
|
-
generated <%= @request_time %> by <a href="https://github.com/
|
59
|
+
generated <%= @request_time %> by <a href="https://github.com/fetep/pencil">pencil</a> v<%= PENCIL_VERSION %>
|
56
60
|
</div>
|
57
61
|
</html>
|
@@ -1,7 +1,9 @@
|
|
1
1
|
<select onchange="window.open(this.options[this.selectedIndex].value,'_top')">
|
2
2
|
<option value="">-select host-</option>
|
3
3
|
<% @hosts.sort.each do |h|
|
4
|
+
option = "#{h.name}"
|
5
|
+
option << " [#{h.cluster}] " if @print_clusters
|
4
6
|
value = append_query_string("/host/#{h.cluster}/#{h}") %>
|
5
|
-
<option value="<%= value %>" <%= "selected=\"selected\"" if @host == h %>><%=
|
7
|
+
<option value="<%= value %>" <%= "selected=\"selected\"" if @host == h %>><%= option %></option>
|
6
8
|
<% end %>
|
7
9
|
</select>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pencil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 7
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 8
|
10
|
+
version: 0.2.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Pete Fritchman
|
@@ -16,8 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-08-
|
20
|
-
default_executable:
|
19
|
+
date: 2011-08-16 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: mongrel
|
@@ -114,41 +113,41 @@ extensions: []
|
|
114
113
|
extra_rdoc_files: []
|
115
114
|
|
116
115
|
files:
|
117
|
-
-
|
116
|
+
- VERSION.rb
|
118
117
|
- lib/models.rb
|
118
|
+
- lib/config.ru
|
119
119
|
- lib/helpers.rb
|
120
|
-
- lib/
|
120
|
+
- lib/dash.rb
|
121
121
|
- lib/config.rb
|
122
|
-
- lib/
|
123
|
-
- lib/
|
124
|
-
- lib/
|
125
|
-
- lib/
|
122
|
+
- lib/models/dashboard.rb
|
123
|
+
- lib/models/graph.rb
|
124
|
+
- lib/models/base.rb
|
125
|
+
- lib/models/host.rb
|
126
126
|
- lib/views/dash-global.erb
|
127
|
-
- lib/views/
|
127
|
+
- lib/views/host.erb
|
128
|
+
- lib/views/dash-cluster-zoom.erb
|
128
129
|
- lib/views/global.erb
|
129
|
-
- lib/views/
|
130
|
+
- lib/views/layout.erb
|
131
|
+
- lib/views/dash-global-zoom.erb
|
130
132
|
- lib/views/partials/graph_switcher.erb
|
131
|
-
- lib/views/partials/cluster_selector.erb
|
132
|
-
- lib/views/partials/dash_switcher.erb
|
133
133
|
- lib/views/partials/hosts_selector.erb
|
134
|
+
- lib/views/partials/cluster_switcher.erb
|
134
135
|
- lib/views/partials/refresh_button.erb
|
135
136
|
- lib/views/partials/cookies_form.erb
|
136
|
-
- lib/views/partials/
|
137
|
-
- lib/views/
|
138
|
-
- lib/
|
139
|
-
- lib/
|
137
|
+
- lib/views/partials/dash_switcher.erb
|
138
|
+
- lib/views/partials/input_boxes.erb
|
139
|
+
- lib/views/partials/cluster_selector.erb
|
140
|
+
- lib/views/cluster.erb
|
141
|
+
- lib/views/dash-cluster.erb
|
140
142
|
- lib/public/style.css
|
141
|
-
- lib/
|
142
|
-
- lib/
|
143
|
-
- lib/
|
144
|
-
- lib/models/host.rb
|
145
|
-
- lib/config.ru
|
143
|
+
- lib/public/favicon.ico
|
144
|
+
- lib/rubyfixes.rb
|
145
|
+
- lib/namespace.rb
|
146
146
|
- docs/pencil_options.md
|
147
|
+
- examples/dashboards.yml
|
147
148
|
- examples/pencil.yml
|
148
149
|
- examples/graphs.yml
|
149
|
-
- examples/dashboards.yml
|
150
150
|
- bin/pencil
|
151
|
-
has_rdoc: true
|
152
151
|
homepage: https://github.com/fetep/pencil
|
153
152
|
licenses:
|
154
153
|
- Mozilla Public License (1.1)
|
@@ -178,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
177
|
requirements: []
|
179
178
|
|
180
179
|
rubyforge_project:
|
181
|
-
rubygems_version: 1.
|
180
|
+
rubygems_version: 1.7.2
|
182
181
|
signing_key:
|
183
182
|
specification_version: 3
|
184
183
|
summary: pencil -- Graphite dashboard system
|