slate 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -0
- data/lib/slate.rb +2 -1
- data/lib/slate/graph.rb +43 -0
- data/lib/slate/target.rb +56 -0
- data/lib/slate/version.rb +1 -1
- data/spec/slate/calculation/mean_spec.rb +1 -1
- data/spec/slate/{render_spec.rb → graph_spec.rb} +46 -21
- metadata +8 -8
- data/lib/slate/render.rb +0 -77
- data/script.rb +0 -61
data/README.md
CHANGED
data/lib/slate.rb
CHANGED
data/lib/slate/graph.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'rest_client'
|
3
|
+
|
4
|
+
module Slate
|
5
|
+
class Graph
|
6
|
+
def initialize(options={})
|
7
|
+
@from = options[:from]
|
8
|
+
@until = options[:until]
|
9
|
+
end
|
10
|
+
|
11
|
+
def <<(target)
|
12
|
+
@target = target
|
13
|
+
end
|
14
|
+
|
15
|
+
def url(format=:png)
|
16
|
+
options = url_options.push(["format", format.to_s])
|
17
|
+
"#{Configuration.instance.endpoint}/render?#{params(options)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def download(format=:png)
|
21
|
+
RestClient.get url(format)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def url_options
|
27
|
+
options = []
|
28
|
+
options << ["target", @target.to_s]
|
29
|
+
options << ["from", @from] if @from
|
30
|
+
options << ["until", @until] if @until
|
31
|
+
|
32
|
+
options
|
33
|
+
end
|
34
|
+
|
35
|
+
def params(options={})
|
36
|
+
options.map do |param|
|
37
|
+
key = param.first
|
38
|
+
value = param.last
|
39
|
+
"#{CGI.escape(key)}=#{CGI.escape(value)}"
|
40
|
+
end.join("&")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/slate/target.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# TODO: Tests
|
2
|
+
module Slate
|
3
|
+
class Target
|
4
|
+
def self.build(metric, &block)
|
5
|
+
target = new(metric)
|
6
|
+
yield target if block_given?
|
7
|
+
target
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(metric)
|
11
|
+
@metric = metric
|
12
|
+
@functions = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
target = @metric
|
17
|
+
@functions.each do |function|
|
18
|
+
if function.is_a? Symbol
|
19
|
+
target = %Q{#{function}(#{target})}
|
20
|
+
else
|
21
|
+
args = arguments(function.last).join(",")
|
22
|
+
target = %Q{#{function.first}(#{target},#{args})}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
target
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_function(*function)
|
30
|
+
if function.size > 1
|
31
|
+
arguments = function[1..-1]
|
32
|
+
@functions << [function.first.to_sym, arguments]
|
33
|
+
else
|
34
|
+
@functions << function.first.to_sym
|
35
|
+
end
|
36
|
+
|
37
|
+
to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def arguments(args=[])
|
43
|
+
args.map do |arg|
|
44
|
+
if arg.is_a?(Numeric)
|
45
|
+
arg.to_s
|
46
|
+
elsif arg.is_a?(Slate::Graph)
|
47
|
+
arg.send(:target)
|
48
|
+
elsif arg.is_a? Slate::Target
|
49
|
+
arg.to_s
|
50
|
+
else
|
51
|
+
%Q{"#{arg}"}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/slate/version.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
|
2
2
|
|
3
3
|
describe Slate::Calculation::Mean do
|
4
4
|
before do
|
5
|
-
@graph = Slate::
|
5
|
+
@graph = Slate::Graph.new(:target => "some.stat")
|
6
6
|
data = [
|
7
7
|
{
|
8
8
|
"target" => "some.stat",
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
2
|
|
3
|
-
describe Slate::
|
3
|
+
describe Slate::Graph do
|
4
4
|
before(:each) do
|
5
5
|
Slate.configure { |c| c.endpoint = "http://graphite" }
|
6
6
|
|
@@ -18,54 +18,77 @@ describe Slate::Render do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should be able to get a single target" do
|
21
|
-
|
21
|
+
target = Slate::Target.build("app.server01.load")
|
22
|
+
graph = Slate::Graph.new
|
23
|
+
graph << target
|
22
24
|
query(graph.url).should include("target" => "app.server01.load", "format" => "png")
|
23
25
|
end
|
24
26
|
|
25
27
|
it "should be able to apply functions" do
|
26
|
-
|
27
|
-
|
28
|
+
target = Slate::Target.build("app.server01.load") do |t|
|
29
|
+
t.add_function :cumulative
|
30
|
+
end
|
31
|
+
graph = Slate::Graph.new
|
32
|
+
graph << target
|
28
33
|
graph.url.should include(CGI.escape("cumulative(app.server01.load)"))
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
target = Slate::Target.build("app.server01.load") do |t|
|
36
|
+
t.add_function :cumulative
|
37
|
+
t.add_function :alias, "load"
|
38
|
+
end
|
39
|
+
graph = Slate::Graph.new
|
40
|
+
graph << target
|
33
41
|
graph.url.should include(CGI.escape("alias(cumulative(app.server01.load),\"load\""))
|
34
42
|
|
35
|
-
|
36
|
-
|
43
|
+
target = Slate::Target.build("app.server01.load") do |t|
|
44
|
+
t.add_function :summarize, "1s", "sum"
|
45
|
+
end
|
46
|
+
graph = Slate::Graph.new
|
47
|
+
graph << target
|
37
48
|
graph.url.should include(CGI.escape("summarize(app.server01.load,\"1s\",\"sum\")"))
|
38
49
|
|
39
|
-
|
40
|
-
|
50
|
+
target = Slate::Target.build("app.server01.load") do |t|
|
51
|
+
t.add_function :movingAverage, 10
|
52
|
+
end
|
53
|
+
graph = Slate::Graph.new
|
54
|
+
graph << target
|
41
55
|
graph.url.should include(CGI.escape("movingAverage(app.server01.load,10)"))
|
42
56
|
end
|
43
57
|
|
44
58
|
it "should be able to accept other graphs as options to a function" do
|
45
|
-
|
59
|
+
first_target = Slate::Target.build("app.server*.load") do |t|
|
60
|
+
t.add_function :sum
|
61
|
+
end
|
62
|
+
second_target = Slate::Target.build("app.server01.load") do |t|
|
63
|
+
t.add_function :asPercent, first_target
|
64
|
+
end
|
46
65
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
graph.add_function :asPercent, other_graph
|
66
|
+
graph = Slate::Graph.new
|
67
|
+
graph << second_target
|
51
68
|
|
52
69
|
graph.url.should include(CGI.escape("asPercent(app.server01.load,sum(app.server*.load))"))
|
53
70
|
end
|
54
71
|
|
55
72
|
it "should be able to specify start and end times" do
|
56
|
-
|
73
|
+
target = Slate::Target.build("app.server01.load")
|
74
|
+
graph = Slate::Graph.new(:from => "-1d")
|
75
|
+
graph << target
|
57
76
|
graph.url.should match(/from=-1d/)
|
58
77
|
|
59
|
-
graph = Slate::
|
78
|
+
graph = Slate::Graph.new(:until => "-1d")
|
79
|
+
graph << target
|
60
80
|
graph.url.should match(/until=-1d/)
|
61
81
|
|
62
|
-
graph = Slate::
|
82
|
+
graph = Slate::Graph.new(:from => "-1d", :until => "-6h")
|
83
|
+
graph << target
|
63
84
|
graph.url.should match(/from=-1d/)
|
64
85
|
graph.url.should match(/until=-6h/)
|
65
86
|
end
|
66
87
|
|
67
88
|
it "should provide methods for retrieving formats" do
|
68
|
-
|
89
|
+
target = Slate::Target.build("app.server01.load")
|
90
|
+
graph = Slate::Graph.new
|
91
|
+
graph << target
|
69
92
|
graph.url(:png).should match(/format=png/)
|
70
93
|
graph.url(:raw).should match(/format=raw/)
|
71
94
|
graph.url(:csv).should match(/format=csv/)
|
@@ -74,7 +97,9 @@ describe Slate::Render do
|
|
74
97
|
end
|
75
98
|
|
76
99
|
it "should retrieve the graph" do
|
77
|
-
|
100
|
+
target = Slate::Target.build("app.server01.load")
|
101
|
+
graph = Slate::Graph.new
|
102
|
+
graph << target
|
78
103
|
graph.download(:png).should eq(@png_stub)
|
79
104
|
graph.download(:raw).should eq(@raw_stub)
|
80
105
|
graph.download(:csv).should eq(@csv_stub)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -124,12 +124,12 @@ files:
|
|
124
124
|
- lib/slate/calculation.rb
|
125
125
|
- lib/slate/calculation/mean.rb
|
126
126
|
- lib/slate/configuration.rb
|
127
|
-
- lib/slate/
|
127
|
+
- lib/slate/graph.rb
|
128
|
+
- lib/slate/target.rb
|
128
129
|
- lib/slate/version.rb
|
129
|
-
- script.rb
|
130
130
|
- slate.gemspec
|
131
131
|
- spec/slate/calculation/mean_spec.rb
|
132
|
-
- spec/slate/
|
132
|
+
- spec/slate/graph_spec.rb
|
133
133
|
- spec/slate_spec.rb
|
134
134
|
- spec/spec_helper.rb
|
135
135
|
homepage: https://github.com/trobrock/slate
|
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
segments:
|
148
148
|
- 0
|
149
|
-
hash: -
|
149
|
+
hash: -3823959702397249819
|
150
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
151
|
none: false
|
152
152
|
requirements:
|
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
version: '0'
|
156
156
|
segments:
|
157
157
|
- 0
|
158
|
-
hash: -
|
158
|
+
hash: -3823959702397249819
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
161
|
rubygems_version: 1.8.24
|
@@ -164,6 +164,6 @@ specification_version: 3
|
|
164
164
|
summary: Simple wrapper on top of the graphite render api
|
165
165
|
test_files:
|
166
166
|
- spec/slate/calculation/mean_spec.rb
|
167
|
-
- spec/slate/
|
167
|
+
- spec/slate/graph_spec.rb
|
168
168
|
- spec/slate_spec.rb
|
169
169
|
- spec/spec_helper.rb
|
data/lib/slate/render.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'rest_client'
|
3
|
-
|
4
|
-
module Slate
|
5
|
-
class Render
|
6
|
-
def initialize(options={})
|
7
|
-
@target = options[:target]
|
8
|
-
@from = options[:from]
|
9
|
-
@until = options[:until]
|
10
|
-
@functions = []
|
11
|
-
end
|
12
|
-
|
13
|
-
def url(format=:png)
|
14
|
-
options = url_options.merge("format" => format.to_s)
|
15
|
-
"#{Configuration.instance.endpoint}/render?#{params(options)}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def download(format=:png)
|
19
|
-
RestClient.get url(format)
|
20
|
-
end
|
21
|
-
|
22
|
-
def add_function(*function)
|
23
|
-
if function.size > 1
|
24
|
-
arguments = function[1..-1]
|
25
|
-
@functions << [function.first.to_sym, arguments]
|
26
|
-
else
|
27
|
-
@functions << function.first.to_sym
|
28
|
-
end
|
29
|
-
|
30
|
-
target
|
31
|
-
end
|
32
|
-
|
33
|
-
def target
|
34
|
-
target = @target
|
35
|
-
@functions.each do |function|
|
36
|
-
if function.is_a? Symbol
|
37
|
-
target = %Q{#{function}(#{target})}
|
38
|
-
else
|
39
|
-
args = arguments(function.last).join(",")
|
40
|
-
target = %Q{#{function.first}(#{target},#{args})}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
target
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def arguments(args=[])
|
50
|
-
args.map do |arg|
|
51
|
-
if arg.is_a?(Numeric)
|
52
|
-
arg.to_s
|
53
|
-
elsif arg.is_a?(Slate::Render)
|
54
|
-
arg.send(:target)
|
55
|
-
else
|
56
|
-
%Q{"#{arg}"}
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def url_options
|
62
|
-
options = {
|
63
|
-
"target" => target
|
64
|
-
}
|
65
|
-
options["from"] = @from if @from
|
66
|
-
options["until"] = @until if @until
|
67
|
-
|
68
|
-
options
|
69
|
-
end
|
70
|
-
|
71
|
-
def params(options={})
|
72
|
-
options.map do |key,value|
|
73
|
-
"#{CGI.escape(key)}=#{CGI.escape(value)}"
|
74
|
-
end.join("&")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/script.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'slate'
|
6
|
-
|
7
|
-
WINDOW = ARGV[0] || "-1w"
|
8
|
-
|
9
|
-
def log(title, value)
|
10
|
-
format = "[%17s] %01.2f\n"
|
11
|
-
printf format, title, value
|
12
|
-
end
|
13
|
-
|
14
|
-
Slate.configure do |c|
|
15
|
-
c.endpoint = "http://statsd.outright.com"
|
16
|
-
end
|
17
|
-
|
18
|
-
graph = Slate::Render.new(target: "stats.timers.rack.*.response_time.upper_90", from: WINDOW)
|
19
|
-
graph.add_function :avg
|
20
|
-
graph.add_function :summarize, "1h", "avg"
|
21
|
-
|
22
|
-
app_response_time = Slate::Calculation::Mean.new(graph).result
|
23
|
-
|
24
|
-
graph = Slate::Render.new(target: "stats.rack.*.status_code.success", from: WINDOW)
|
25
|
-
graph.add_function :sum
|
26
|
-
|
27
|
-
total_graph = Slate::Render.new(target: "stats.rack.*.status_code.*", from: WINDOW)
|
28
|
-
total_graph.add_function :exclude, "missing"
|
29
|
-
total_graph.add_function :sum
|
30
|
-
|
31
|
-
graph.add_function :asPercent, total_graph
|
32
|
-
|
33
|
-
app_success_rate = Slate::Calculation::Mean.new(graph).result
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
graph = Slate::Render.new(target: "stats.timers.agg.thrift.*.response_time.upper_90", from: WINDOW)
|
38
|
-
graph.add_function :avg
|
39
|
-
graph.add_function :summarize, "1h", "avg"
|
40
|
-
|
41
|
-
agg_response_time = Slate::Calculation::Mean.new(graph).result
|
42
|
-
|
43
|
-
|
44
|
-
graph = Slate::Render.new(target: "stats.agg.thrift.*.status_code.success", from: WINDOW)
|
45
|
-
graph.add_function :sum
|
46
|
-
|
47
|
-
total_graph = Slate::Render.new(target: "stats.agg.thrift.*.status_code.*", from: WINDOW)
|
48
|
-
total_graph.add_function :exclude, "missing"
|
49
|
-
total_graph.add_function :sum
|
50
|
-
|
51
|
-
graph.add_function :asPercent, total_graph
|
52
|
-
|
53
|
-
agg_success_rate = Slate::Calculation::Mean.new(graph).result
|
54
|
-
|
55
|
-
log "App Response Time", app_response_time
|
56
|
-
log "App Success Rate" , app_success_rate
|
57
|
-
log "App Uptime" , 0
|
58
|
-
print "\n"
|
59
|
-
log "Agg Response Time", agg_response_time
|
60
|
-
log "Agg Success Rate" , agg_success_rate
|
61
|
-
log "Agg Uptime" , 0
|