pencil 0.3.0 → 0.3.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/lib/p ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pencil'
3
+
4
+ Pencil::App.run!
5
+
@@ -40,10 +40,14 @@ module Pencil
40
40
  # time stuff
41
41
  start = param_lookup("start")
42
42
  duration = param_lookup("duration")
43
+
43
44
  @stime = Chronic.parse(start)
44
45
  if @stime
45
46
  @stime -= @stime.sec unless @params["noq"]
47
+ elsif start =~ /^\d+$/ #epoch
48
+ @stime = Time.at start.to_i
46
49
  end
50
+
47
51
  if duration
48
52
  @duration = ChronicDuration.parse(duration) || 0
49
53
  else
@@ -15,11 +15,13 @@ module Pencil
15
15
  port = 9292
16
16
  @rawconfig = {}
17
17
  @confdir = "."
18
+ @recursive = false
18
19
 
19
20
  optparse = OptionParser.new do |o|
20
21
  o.on("-d", "--config-dir DIR",
21
22
  "location of the config directory (default .)") do |arg|
22
23
  @confdir = arg
24
+ @recursive = true
23
25
  end
24
26
  o.on("-p", "--port PORT", "port to bind to (default 9292)") do |arg|
25
27
  port = arg.to_i
@@ -32,7 +34,9 @@ module Pencil
32
34
  end
33
35
 
34
36
  def reload!
35
- configs = Dir.glob("#{@confdir}/**/*.y{a,}ml")
37
+ # only do a recursive search if "-d" is specified
38
+ configs = Dir.glob("#{@confdir}/#{@recursive ? '**/' : ''}*.y{a,}ml")
39
+
36
40
  configs.each do |c|
37
41
  yml = YAML.load(File.read(c))
38
42
  next unless yml
@@ -199,12 +199,16 @@ module Pencil
199
199
 
200
200
  end
201
201
 
202
+ def valid_time (s)
203
+ Chronic.parse(s) || s =~ /^\d+$/
204
+ end
205
+
202
206
  def permalink
203
207
  return "" unless @stime && @duration
204
208
  format = "%F %T" # chronic REALLY understands this
205
209
  url = request.path + "?"
206
- url << "&start=#{@stime.strftime(format)}"
207
- url << "&duration=#{ChronicDuration.output(@duration)}"
210
+ url << "&amp;start=#{@stime.strftime(format)}"
211
+ url << "&amp;duration=#{ChronicDuration.output(@duration)}"
208
212
  "<a id=\"permalink\" href=\"#{url}\">permalink</a>"
209
213
  end
210
214
  end
@@ -14,13 +14,14 @@ module Pencil
14
14
 
15
15
  @graphs = []
16
16
  @graph_opts = {}
17
- params["graphs"].each do |name|
18
- # graphs map to option hashes
19
- if name.respond_to?(:keys) # could be YAML::Omap
20
- g = Graph.find(name.keys.first) # should only be one key
21
- @graph_opts[g] = name[name.keys.first]||{}
17
+ params["graphs"].each do |n|
18
+ if n.respond_to?(:keys)
19
+ key = n.keys.first # should only be one key
20
+ val = n.values.first
21
+ g = Graph.find(key)
22
+ @graph_opts[g] = val||{}
22
23
  else
23
- raise "Bad format for graph (must be a hash-y; #{name.class}:#{name.inspect} is not)"
24
+ raise "Bad format for graph (must be a hash-y; #{n.class}:#{n.inspect} is not)"
24
25
  end
25
26
 
26
27
  @graphs << g if g
@@ -101,7 +102,6 @@ module Pencil
101
102
  hosts = get_host_wildcards(graph)
102
103
  _, clusters = get_valid_hosts(graph)
103
104
 
104
- next_url = ""
105
105
  type = opts[:zoom] ? :cluster : :global
106
106
  options = opts.merge({:sum => type})
107
107
  graph_url = graph.render_url(hosts, clusters, options)
@@ -146,8 +146,8 @@ module Pencil
146
146
  colors = []
147
147
  #FIXME code duplication
148
148
  if opts[:sum] == :global
149
- @params["targets"].each do |stat_name, opts|
150
- z = new_map(opts)
149
+ @params["targets"].each do |stat_name, o|
150
+ z = new_map(o)
151
151
 
152
152
  z[:key] ||= stat_name
153
153
  #######################
@@ -175,25 +175,25 @@ module Pencil
175
175
  # target << handle_metric(translate(:sumSeries, metric), z)
176
176
 
177
177
  if z.keys.member?('divideSeries') # special case
178
- # apply divideSeries, sumSeries then other options
179
- res = translate(:divideSeries, metric)
180
- res = translate(:sumSeries, res)
181
- z.delete(:divideSeries)
182
- h = YAML::Omap.new
183
- z.each { |k,v| h[k] = v unless k == 'divideSeries' }
184
- target << handle_metric(res, h)
185
- else
186
- target << handle_metric(translate(:sumSeries, metric), z)
187
- end
178
+ # apply divideSeries, sumSeries then other options
179
+ res = translate(:divideSeries, metric)
180
+ res = translate(:sumSeries, res)
181
+ z.delete(:divideSeries)
182
+ h = YAML::Omap.new
183
+ z.each { |k,v| h[k] = v unless k == 'divideSeries' }
184
+ target << handle_metric(res, h)
185
+ else
186
+ target << handle_metric(translate(:sumSeries, metric), z)
187
+ end
188
188
  if !@params[:use_color] ||
189
- (!z[:color] && @params[:use_color])
189
+ (!z[:color] && @params[:use_color])
190
190
  colors << next_color(colors, z[:color])
191
191
  end
192
192
  end # @params["targets"].each
193
193
  elsif opts[:sum] == :cluster # one line per cluster/metric
194
194
  clusters.each do |cluster|
195
- @params["targets"].each do |stat_name, opts|
196
- z = new_map(opts)
195
+ @params["targets"].each do |stat_name, o|
196
+ z = new_map(o)
197
197
 
198
198
  metrics = []
199
199
  #######################
@@ -207,14 +207,14 @@ module Pencil
207
207
  # divideSeries is picky about the number of series given as
208
208
  # arguments, so sum them in this case
209
209
  handle_metric(translate(:sumSeries, mm),
210
- m[m.keys.first], true)
210
+ m[m.keys.first], true)
211
211
  else
212
212
  handle_metric(mm, m[m.keys.first], true)
213
213
  end
214
214
  end.join(",")
215
215
  else
216
216
  metrics << handle_metric(compose_metric(stat_name,
217
- cluster, h), {}, true)
217
+ cluster, h), {}, true)
218
218
  end
219
219
  #######################
220
220
  z[:key] = "#{cluster} #{z[:key]}"
@@ -229,7 +229,7 @@ module Pencil
229
229
  target << handle_metric(res, h)
230
230
  else
231
231
  target << handle_metric(translate(:sumSeries,
232
- metrics.join(',')), z)
232
+ metrics.join(',')), z)
233
233
  end
234
234
 
235
235
  if !@params[:use_color] || (!z[:color] && @params[:use_color])
@@ -238,8 +238,8 @@ module Pencil
238
238
  end # metrics.each
239
239
  end # clusters.each
240
240
  else # one line per {metric,host,colo}
241
- @params["targets"].each do |stat_name, opts|
242
- z = new_map(opts)
241
+ @params["targets"].each do |stat_name, o|
242
+ z = new_map(o)
243
243
  clusters.each do |cluster|
244
244
  hosts.each do |host|
245
245
  label = "#{host} #{z[:key]}"
@@ -287,11 +287,11 @@ module Pencil
287
287
  url = URI.join(@params[:graphite_url], "/render/?").to_s
288
288
  url_parts = []
289
289
  url_opts.each do |k, v|
290
- [v].flatten.each do |v|
291
- url_parts << "#{URI.escape(k.to_s)}=#{URI.escape(v.to_s)}"
290
+ [v].flatten.each do |v2|
291
+ url_parts << "#{URI.escape(k.to_s)}=#{URI.escape(v2.to_s)}"
292
292
  end
293
293
  end
294
- url += url_parts.join("&")
294
+ url += url_parts.join("&amp;")
295
295
  return url
296
296
  end
297
297
 
@@ -339,8 +339,8 @@ module Pencil
339
339
  end
340
340
  unless ci && hi
341
341
  last.reverse.each_with_index do |v, i|
342
- ci = -1 -i if v.match("%c")
343
- hi = -1 -i if v.match("%h")
342
+ ci = (-1) -i if v.match("%c")
343
+ hi = (-1) -i if v.match("%h")
344
344
  end
345
345
  end
346
346
  hosts = metrics.map do |m|
@@ -23,6 +23,7 @@ module Pencil
23
23
  end
24
24
  end # graph["hosts"].each
25
25
  end # Graph.each
26
+ @graphs.sort!
26
27
  end
27
28
 
28
29
  def self.find(name)
@@ -1,3 +1,3 @@
1
1
  module Pencil
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -8,7 +8,7 @@
8
8
  <input <%= "value=\"#{val}\" " if val %> size="<%= name =~ /start|duration/ ? 10 : 4 %>" name="<%= name %>" id="<%= name %>" type="text"/>
9
9
  <% if name == "start" %>
10
10
  <a href="http://chronic.rubyforge.org/" class="inline-link" target="_blank">
11
- <% if Chronic.parse(param_lookup(name)) %>
11
+ <% if valid_time(param_lookup(name)) %>
12
12
  ?
13
13
  <% else %>
14
14
  <div class="error">Bad timespec!</div>
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: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 0
10
- version: 0.3.0
9
+ - 1
10
+ version: 0.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pete Fritchman
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-05-29 00:00:00 Z
19
+ date: 2012-06-01 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: map
@@ -165,6 +165,7 @@ files:
165
165
  - lib/pencil/models.rb
166
166
  - lib/pencil/helpers.rb
167
167
  - lib/pencil/rubyfixes.rb
168
+ - lib/p
168
169
  - docs/pencil_options.md
169
170
  - examples/graphs.yml
170
171
  - examples/pencil.yml
@@ -199,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
200
  requirements: []
200
201
 
201
202
  rubyforge_project:
202
- rubygems_version: 1.8.11
203
+ rubygems_version: 1.8.24
203
204
  signing_key:
204
205
  specification_version: 3
205
206
  summary: pencil -- Graphite dashboard system