exprc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +14 -0
  4. data/Readme.md +3 -0
  5. data/bin/exprc +132 -0
  6. data/exprc.gemspec +13 -0
  7. metadata +52 -0
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rest-client", "1.6.7"
4
+ gem "json", "1.6.6"
data/Gemfile.lock ADDED
@@ -0,0 +1,14 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ json (1.6.6)
5
+ mime-types (1.18)
6
+ rest-client (1.6.7)
7
+ mime-types (>= 1.16)
8
+
9
+ PLATFORMS
10
+ ruby
11
+
12
+ DEPENDENCIES
13
+ json (= 1.6.6)
14
+ rest-client (= 1.6.7)
data/Readme.md ADDED
@@ -0,0 +1,3 @@
1
+ ## exprc
2
+
3
+ Command line client to [exprd](https://github.com/heroku/exprd).
data/bin/exprc ADDED
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["TZ"] = "UTC"
4
+
5
+ $stdout.sync = $stderr.sync = true
6
+
7
+ require "optparse"
8
+ require "uri"
9
+ require "rest-client"
10
+ require "json"
11
+
12
+ ARGV.options do |o|
13
+ action = nil
14
+ name = nil
15
+ type = nil
16
+ window = nil
17
+ delay = nil
18
+ frequency = nil
19
+ predicate = nil
20
+ value = nil
21
+ key = nil
22
+ percentile = nil
23
+
24
+ o.banner = "usage: exprc list|show|test|create|destroy [options]"
25
+ o.on("-n", "--name n", String, "name of metric") { |n| name = n }
26
+ o.on("-t", "--type t", String, "type of metric") { |t| type = t }
27
+ o.on("-w", "--window w", Integer, "window of metric in seconds") { |w| window = w }
28
+ o.on("-d", "--delay d", Integer, "delay of metric in seconds") { |d| delay = d }
29
+ o.on("-f", "--frequency f", Integer, "frequency of metric emits in seconds") { |f| frequency = f }
30
+ o.on("-p", "--predicate p", String, "predicate data in json") { |p| predicate = p }
31
+ o.on("-v", "--value v", String, "value key") { |v| value = v }
32
+ o.on("-k", "--key k", String, "partitioning key") { |k| key = k }
33
+ o.on("-l", "--percentile l", Integer, "percentile value") { |l| percentile = l }
34
+ o.on("-h", "--help", "display this help") { abort(o.to_s) }
35
+ o.parse!
36
+ action = ARGV.shift
37
+ exprd_api_url = ENV["EXPRD_API_URL"]
38
+
39
+ abort("! error: an action is required (e.g list).\n\n#{o}") if (!action || action.empty?)
40
+ abort("! error: unrecognized action #{action}.") if !%w{list show test create update destroy}.include?(action)
41
+ abort("! error: missing EXPRD_API_URL.\n\n#{o}") if (!exprd_api_url || exprd_api_url.empty?)
42
+ abort("! error: unrecognized args: #{ARGV.join(" ")}.") if !ARGV.empty?
43
+
44
+ case action
45
+ when "list"
46
+ begin
47
+ names = JSON.parse(RestClient.get("#{exprd_api_url}/metrics"))
48
+ names.each do |name|
49
+ puts("- #{name}")
50
+ end
51
+ rescue => e
52
+ puts(" failed")
53
+ message = e.is_a?(RestClient::Exception) ? JSON.parse(e.response.body)["message"] : e.message
54
+ abort("! error: #{message}")
55
+ end
56
+ when "show"
57
+ abort("! error: missing --name.\n\n#{o}") if (!name || name.empty?)
58
+ begin
59
+ info = JSON.parse(RestClient.get("#{exprd_api_url}/metrics/#{name}"))
60
+ puts("= name: #{name}")
61
+ puts("= type: #{info["type"]}")
62
+ puts("= window: #{info["window"]}")
63
+ puts("= delay: #{info["delay"]}")
64
+ puts("= predicate: #{info["predicate"]}") if info["predicate"]
65
+ puts("= value: #{info["value"]}") if info["value"]
66
+ puts("= key: #{info["key"]}") if info["key"]
67
+ puts("= percentile: #{info["percentile"]}") if info["percentile"]
68
+ puts("= frequency: #{info["frequency"]}")
69
+ rescue => e
70
+ puts(" failed")
71
+ message = e.is_a?(RestClient::Exception) ? JSON.parse(e.response.body)["message"] : e.message
72
+ abort("! error: #{message}")
73
+ end
74
+ when "test"
75
+ abort("! error: missing --name.\n\n#{o}") if (!name || name.empty?)
76
+ abort("! error: missing --type.\n\n#{o}") if (!type || type.empty?)
77
+ abort("! error: missing --window.\n\n#{o}") if !window
78
+ abort("! error: missing --delay.\n\n#{o}") if !delay
79
+ $stdout.print("* testing metric #{name}...")
80
+ begin
81
+ params = {
82
+ "type" => type,
83
+ "window" => window,
84
+ "delay" => delay,
85
+ "predicate" => JSON.parse(predicate),
86
+ "value" => value,
87
+ "key" => key,
88
+ "percentile" => percentile,
89
+ "frequency" => frequency}
90
+ results = JSON.parse(RestClient.put("#{exprd_api_url}/metrics/#{name}/tests", JSON.dump(params)))
91
+ puts(" done")
92
+ puts("= name: #{name}")
93
+ puts("= value: #{results["value"]}")
94
+ puts("= time: #{Time.at(results["time"])}")
95
+ rescue => e
96
+ puts(" failed")
97
+ message = e.is_a?(RestClient::Exception) ? JSON.parse(e.response.body)["message"] : e.message
98
+ abort("! error: #{message}")
99
+ end
100
+ when "create"
101
+ abort("! error: missing --name.\n\n#{o}") if (!name || name.empty?)
102
+ $stdout.print("* creating metric #{name}...")
103
+ begin
104
+ params = {
105
+ "type" => type,
106
+ "window" => window,
107
+ "delay" => delay,
108
+ "predicate" => JSON.parse(predicate),
109
+ "value" => value,
110
+ "key" => key,
111
+ "percentile" => percentile,
112
+ "frequency" => frequency}
113
+ RestClient.put("#{exprd_api_url}/metrics/#{name}", JSON.dump(params))
114
+ puts(" done")
115
+ rescue => e
116
+ puts(" failed")
117
+ message = e.is_a?(RestClient::Exception) ? JSON.parse(e.response.body)["message"] : e.message
118
+ abort("! error: #{message}")
119
+ end
120
+ when "destroy"
121
+ abort("! error: missing --name.\n\n#{o}") if (!name || name.empty?)
122
+ $stdout.print("* destroying metric #{name}...")
123
+ begin
124
+ RestClient.delete("#{exprd_api_url}/metrics/#{name}")
125
+ puts(" done")
126
+ rescue => e
127
+ puts(" failed")
128
+ message = e.is_a?(RestClient::Exception) ? JSON.parse(e.response.body)["message"] : e.message
129
+ abort("! error: #{message}")
130
+ end
131
+ end
132
+ end
data/exprc.gemspec ADDED
@@ -0,0 +1,13 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.authors = ["Mark McGranaghan"]
3
+ gem.email = ["mark@heroku.com"]
4
+ gem.description = "CLI to exprd."
5
+ gem.summary = "CLI to exprd."
6
+ gem.homepage = "https://github.com/heroku/exprc"
7
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
8
+ gem.files = `git ls-files`.split("\n")
9
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
10
+ gem.name = "exprc"
11
+ gem.require_paths = ["lib"]
12
+ gem.version = "0.0.1"
13
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: exprc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mark McGranaghan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-03 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: CLI to exprd.
15
+ email:
16
+ - mark@heroku.com
17
+ executables:
18
+ - exprc
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - Gemfile.lock
25
+ - Readme.md
26
+ - bin/exprc
27
+ - exprc.gemspec
28
+ homepage: https://github.com/heroku/exprc
29
+ licenses: []
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 1.8.21
49
+ signing_key:
50
+ specification_version: 3
51
+ summary: CLI to exprd.
52
+ test_files: []