exprc 0.0.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.
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: []