copperegg-revealmetrics 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  require "test/unit"
2
- require "copperegg"
2
+ require "copperegg/revealmetrics"
3
3
 
4
4
  class MetricSampleTest < Test::Unit::TestCase
5
-
5
+
6
6
  end
@@ -1,51 +1,51 @@
1
1
  require "test/unit"
2
- require "copperegg"
2
+ require "copperegg/revealmetrics"
3
3
 
4
4
  class TagTest < Test::Unit::TestCase
5
5
 
6
6
  def test_name_accessor_and_setter
7
- tag = CopperEgg::Tag.new(:name => "my_tag")
7
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
8
8
 
9
9
  assert_equal "my_tag", tag.name
10
10
  end
11
11
 
12
12
  def test_save_should_fail_if_name_is_blank
13
- tag = CopperEgg::Tag.new
13
+ tag = Copperegg::Revealmetrics::Tag.new
14
14
 
15
- error = assert_raise(CopperEgg::ValidationError) { tag.save }
15
+ error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
16
16
  assert_equal "Name can't be blank.", error.message
17
17
  end
18
18
 
19
19
  def test_save_should_fail_if_name_contains_invalid_characters
20
- tag = CopperEgg::Tag.new(:name => "my%%%tag")
20
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "my%%%tag")
21
21
 
22
- error = assert_raise(CopperEgg::ValidationError) { tag.save }
22
+ error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
23
23
  assert_equal "Name contains invalid characters.", error.message
24
24
  end
25
25
 
26
26
  def test_objects_accessor_and_setter
27
- tag = CopperEgg::Tag.new(:name => "my_tag", :objects => [{"idv" => "obj1"}, {"idv" => "obj2"}])
27
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag", :objects => [{"idv" => "obj1"}, {"idv" => "obj2"}])
28
28
 
29
29
  assert_equal ["obj1", "obj2"], tag.objects
30
30
  end
31
31
 
32
32
  def test_save_should_fail_if_no_objects_are_declared
33
- tag = CopperEgg::Tag.new(:name => "my_tag")
33
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
34
34
 
35
- error = assert_raise(CopperEgg::ValidationError) { tag.save }
35
+ error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
36
36
  assert_equal "You must define at least one object.", error.message
37
37
  end
38
38
 
39
39
  def test_save_should_fail_if_objects_include_non_strings
40
- tag = CopperEgg::Tag.new(:name => "my_tag")
40
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "my_tag")
41
41
  tag.objects = ["obj1", 12323]
42
42
 
43
- error = assert_raise(CopperEgg::ValidationError) { tag.save }
43
+ error = assert_raise(Copperegg::Revealmetrics::ValidationError) { tag.save }
44
44
  assert_equal "Invalid object identifier.", error.message
45
45
  end
46
46
 
47
47
  def test_to_hash
48
- tag = CopperEgg::Tag.new(:name => "test")
48
+ tag = Copperegg::Revealmetrics::Tag.new(:name => "test")
49
49
  tag.objects = ["obj1", "obj2"]
50
50
 
51
51
  assert tag.valid?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: copperegg-revealmetrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Anderson
@@ -61,14 +61,14 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - LICENSE
63
63
  - README.md
64
- - lib/copperegg.rb
65
- - lib/copperegg/api.rb
66
- - lib/copperegg/custom_dashboard.rb
67
- - lib/copperegg/metric_group.rb
68
- - lib/copperegg/metric_sample.rb
69
- - lib/copperegg/mixins/persistence.rb
70
- - lib/copperegg/tag.rb
71
- - lib/copperegg/ver.rb
64
+ - lib/copperegg/revealmetrics.rb
65
+ - lib/copperegg/revealmetrics/api.rb
66
+ - lib/copperegg/revealmetrics/custom_dashboard.rb
67
+ - lib/copperegg/revealmetrics/metric_group.rb
68
+ - lib/copperegg/revealmetrics/metric_sample.rb
69
+ - lib/copperegg/revealmetrics/mixins/persistence.rb
70
+ - lib/copperegg/revealmetrics/tag.rb
71
+ - lib/copperegg/revealmetrics/ver.rb
72
72
  - test/custom_dashboard_test.rb
73
73
  - test/metric_group_test.rb
74
74
  - test/metric_sample_test.rb
@@ -1,13 +0,0 @@
1
- require "net/http"
2
- require "net/https"
3
- require "uri"
4
- require "json/pure"
5
- require File.dirname(__FILE__) + "/copperegg/mixins/persistence"
6
- require File.dirname(__FILE__) + "/copperegg/metric_group"
7
- require File.dirname(__FILE__) + "/copperegg/custom_dashboard"
8
- require File.dirname(__FILE__) + "/copperegg/metric_sample"
9
- require File.dirname(__FILE__) + "/copperegg/tag"
10
- require File.dirname(__FILE__) + "/copperegg/api"
11
-
12
- module CopperEgg
13
- end
@@ -1,24 +0,0 @@
1
- module CopperEgg
2
- class Api
3
- class << self
4
- attr_accessor :apikey
5
- attr_reader :ssl_verify_peer, :timeout
6
-
7
- def host=(host)
8
- @uri = URI.join(host, "/v2/revealmetrics/").to_s
9
- end
10
-
11
- def uri
12
- @uri || "https://api.copperegg.com/v2/revealmetrics/"
13
- end
14
-
15
- def ssl_verify_peer=(boolean)
16
- @ssl_verify_peer = boolean ? true : false
17
- end
18
-
19
- def timeout=(seconds)
20
- @timeout = seconds.to_i
21
- end
22
- end
23
- end
24
- end
@@ -1,138 +0,0 @@
1
- module CopperEgg
2
- class CustomDashboard
3
- include CopperEgg::Mixins::Persistence
4
-
5
- WIDGET_TYPES = %w(metric metric_list timeline)
6
- WIDGET_STYLES = %w(value timeline both list values)
7
- WIDGET_MATCHES = %w(select multi tag all)
8
-
9
- resource "dashboards"
10
-
11
- attr_accessor :name, :label, :data
12
-
13
- def load_attributes(attributes)
14
- @data = {"widgets" => {}, "order" => []}
15
- attributes.each do |name, value|
16
- if name.to_s == "id"
17
- @id = value
18
- elsif name.to_s == "data"
19
- attributes[name].each do |data_name, data_value|
20
- if data_name.to_s == "order"
21
- data["order"] = data_value
22
- else
23
- data["widgets"] = data_value
24
- end
25
- end
26
- elsif !respond_to?("#{name}=")
27
- next
28
- else
29
- send "#{name}=", value
30
- end
31
- end
32
- end
33
-
34
- def valid?
35
- @error = nil
36
- if self.name.nil? || self.name.to_s.strip.empty?
37
- @error = "Name can't be blank."
38
- else
39
- self.data["widgets"].values.each do |widget|
40
- widget.each do |key, value|
41
- if key.to_s == "type" && !WIDGET_TYPES.include?(value)
42
- @error = "Invalid widget type #{value}."
43
- elsif key.to_s == "style" && !WIDGET_STYLES.include?(value)
44
- @error = "Invalid widget style #{value}."
45
- elsif key.to_s == "match" && !WIDGET_MATCHES.include?(value)
46
- @error = "Invalid widget match #{value}."
47
- elsif key.to_s == "metric" && (!value.is_a?(Hash) || value.keys.size == 0)
48
- @error = "Invalid widget metric. #{value}"
49
- else
50
- (widget["metric"] || widget[:metric]).each do |metric_group_name, metric_group_value|
51
- if !metric_group_value.is_a?(Array)
52
- @error = "Invalid widget metric. #{metric_group_value}"
53
- elsif metric_group_value.length == 0
54
- @error = "Invalid widget metric. #{metric_group_value}"
55
- else
56
- metric_group_value.each do |metric_data|
57
- if !metric_data.is_a?(Array)
58
- @error = "Invalid widget metric. #{metric_group_value}"
59
- elsif metric_data.length < 2
60
- @error = "Invalid widget metric. #{metric_group_value}"
61
- elsif (/^\d+$/ =~ metric_data.first.to_s).nil?
62
- @error = "Invalid widget metric. #{metric_group_value}"
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
69
- match_param = widget["match_param"] || widget[:match_param]
70
- if (widget["match"] || widget[:match]) != "all" && (match_param.nil? || match_param.to_s.strip.empty?)
71
- @error = "Missing match parameter."
72
- end
73
- break if !@error.nil?
74
- end
75
- end
76
- @error.nil?
77
- end
78
-
79
- def to_hash
80
- set_data_order
81
- self.instance_variables.reduce({}) do |memo, variable|
82
- unless variable.to_s == "@error"
83
- value = instance_variable_get(variable)
84
- memo[variable.to_s.sub("@","")] = value
85
- end
86
- memo
87
- end
88
- end
89
-
90
- class <<self
91
- def create(*args)
92
- options = args.last.class == Hash ? args.pop : {}
93
-
94
- return super(args.first) if args.first.is_a?(Hash)
95
-
96
- metric_group = args.first
97
- raise ArgumentError.new("CopperEgg::MetricGroup object expected") if !metric_group.is_a?(MetricGroup)
98
- raise ArgumentError.new("Invalid metric group") if !metric_group.valid?
99
-
100
- metrics = filter_metrics(metric_group, options[:metrics]).map { |name| metric_group.metrics.find {|metric| metric.name == name} }
101
- identifiers = options[:identifiers].is_a?(Array) ? (options[:identifiers].empty? ? nil : options[:identifiers]) : (options[:identifier] ? [options[:identifiers]] : nil)
102
- widget_match = identifiers.nil? ? "all" : (identifiers.size == 1 ? "select" : "multi")
103
- widget_type = widget_match == "select" ? "metric" : "timeline"
104
- widget_style = widget_type == "metric" ? "both" : "values"
105
- name = options[:name] || "#{metric_group.label} Dashboard"
106
-
107
- dashboard = new(:name => name)
108
- metrics.each.with_index do |metric, i|
109
- metric_data = [metric.position, metric.name]
110
- metric_data.push("rate") if metric.type == "ce_counter" || metric.type == "ce_counter_f"
111
- widget = {:type => widget_type, :style => widget_style, :match => widget_match, :metric => {metric_group.name => [metric_data]}}
112
- widget[:match_param] = identifiers if identifiers
113
- dashboard.data["widgets"][i.to_s] = widget
114
- end
115
- dashboard.save
116
- dashboard
117
- end
118
-
119
- def find_by_name(name)
120
- find.detect {|dashboard| dashboard.name == name}
121
- end
122
-
123
- private
124
-
125
- def filter_metrics(metric_group, specified_metrics)
126
- metrics = metric_group.metrics.map(&:name)
127
- specified_metrics = specified_metrics.is_a?(Array) ? specified_metrics & metrics : (specified_metrics ? [specified_metrics] & metrics : [])
128
- specified_metrics.empty? ? metrics : specified_metrics
129
- end
130
- end
131
-
132
- private
133
-
134
- def set_data_order
135
- @data["order"] = @data["widgets"].keys if @data["order"].empty?
136
- end
137
- end
138
- end
@@ -1,123 +0,0 @@
1
- module CopperEgg
2
- class MetricGroup
3
- include CopperEgg::Mixins::Persistence
4
-
5
- resource "metric_groups"
6
-
7
- attr_accessor :name, :label, :frequency, :metrics
8
-
9
- def load_attributes(attributes)
10
- @metrics = []
11
- attributes.each do |name, value|
12
- if name.to_s == "id"
13
- @id = value
14
- elsif !respond_to?("#{name}=")
15
- next
16
- elsif value.to_s == "metrics"
17
- @metrics = value.map {|v| Metric.new(v)}
18
- else
19
- send "#{name}=", value
20
- end
21
- end
22
- end
23
-
24
- def to_hash
25
- self.instance_variables.reduce({}) do |memo, variable|
26
- value = instance_variable_get(variable)
27
- if variable.to_s == "@metrics"
28
- memo[variable.to_s.sub("@","")] = value.map(&:to_hash)
29
- elsif variable.to_s != "@error"
30
- memo[variable.to_s.sub("@","")] = value
31
- end
32
- memo
33
- end
34
- end
35
-
36
- def valid?
37
- @error = nil
38
- if self.name.nil? || self.name.to_s.strip.empty?
39
- @error = "Name can't be blank."
40
- elsif self.metrics.nil? || self.metrics.empty?
41
- @error = "You must define at least one metric."
42
- else
43
- self.metrics = self.metrics.map {|metric| metric.is_a?(Hash) ? Metric.new(metric) : metric}
44
- self.metrics.each do |metric|
45
- if !metric.is_a?(Metric)
46
- @error = "Metric expected."
47
- break
48
- elsif !metric.valid?
49
- @error = metric.error
50
- break
51
- else
52
- metric.send(:remove_instance_variable, :@position) if (metric.instance_variables.include?(:@position) || metric.instance_variables.include?("@position")) && !self.persisted?
53
- end
54
- end
55
- end
56
- @error.nil?
57
- end
58
-
59
- private
60
-
61
- def create
62
- response = self.class.request(:request_type => "get", :id => self.name, :show_hidden => true)
63
- if response.code == "200"
64
- json = JSON.parse(response.body)
65
- metric_group = self.class.new(json)
66
- @id = self.name
67
- # needs_update = self.label != metric_group.label || self.frequency != metric_group.frequency || self.metrics.length != metric_group.metrics.length || self.metrics.map(&:name).sort != metric_group.metrics.map {|m| m["name"]}.sort
68
- if true #needs_update
69
- self.class.request(self.to_hash.merge(:id => @id, :is_hidden => 0, :request_type => "put", :show_hidden => true))
70
- else
71
- response
72
- end
73
- else
74
- self.class.request(self.to_hash.merge(:request_type => "post"))
75
- end
76
- end
77
-
78
- class Metric
79
- TYPES = %w(ce_gauge ce_gauge_f ce_counter ce_counter_f)
80
-
81
- attr_accessor :name, :label, :type, :unit
82
- attr_reader :error, :position
83
-
84
- def initialize(attributes={})
85
- attributes.each do |name, value|
86
- if name.to_s == "position"
87
- @position = value
88
- elsif !respond_to?("#{name}=")
89
- next
90
- else
91
- send "#{name}=", value
92
- end
93
- end
94
- end
95
-
96
- def to_hash
97
- self.instance_variables.reduce({}) do |memo, variable|
98
- if variable.to_s != "@error"
99
- value = instance_variable_get(variable)
100
- memo[variable.to_s.sub("@","")] = value
101
- end
102
- memo
103
- end
104
- end
105
-
106
- def valid?
107
- valid = false
108
- @error = nil
109
- if self.name.nil? || self.name.to_s.strip.empty?
110
- @error = "Metric name cannot be blank."
111
- elsif self.type.nil? || self.type.to_s.strip.empty?
112
- @error = "Metric type must be defined."
113
- elsif !TYPES.include?(self.type)
114
- @error = "Invalid metric type #{self.type}."
115
- else
116
- valid = true
117
- remove_instance_variable(:@error)
118
- end
119
- valid
120
- end
121
- end
122
- end
123
- end
@@ -1,22 +0,0 @@
1
- module CopperEgg
2
- class MetricSample
3
- include CopperEgg::Mixins::Persistence
4
-
5
- resource "samples"
6
-
7
- def self.save(group_name, identifier, timestamp, metric_values)
8
- request(:id => group_name, :identifier => identifier, :timestamp => timestamp, :values => metric_values, :request_type => "post")
9
- end
10
-
11
- def self.samples(group_name, metrics, starttime=nil, duration=nil, sample_size=nil)
12
- metrics = [metrics] unless metrics.is_a?(Array)
13
- params = {}
14
- params[:starttime] = starttime if starttime
15
- params[:duration] = duration if duration
16
- params[:sample_size] = sample_size if sample_size
17
- params[:queries] = {group_name => [{:metrics => metrics}]}
18
-
19
- request(params.merge(:request_type => "get"))
20
- end
21
- end
22
- end
@@ -1,118 +0,0 @@
1
- module CopperEgg
2
- class ValidationError < Exception; end
3
-
4
- class HttpError < Exception; end
5
-
6
- module Mixins
7
- module Persistence
8
- def self.included(klass)
9
- klass.class_eval do
10
- class << self
11
- attr_reader :resource_name
12
-
13
- def find(*args)
14
- params = args.last.class == Hash ? args.pop : {}
15
- id = args.first
16
- response = request(params.merge(:request_type => "get", :id => id))
17
- if response.code == "200"
18
- json = JSON.parse(response.body)
19
- if json.is_a?(Array)
20
- json.map {|attributes| new(attributes)}
21
- else
22
- new(json)
23
- end
24
- end
25
- end
26
-
27
- def create(params)
28
- params.delete(:id)
29
- params.delete("id")
30
- new(params).save
31
- end
32
-
33
- def delete(id)
34
- request(:id => id, :request_type => "delete")
35
- end
36
-
37
- def request(params={})
38
- request_type = params.delete(:request_type)
39
- raise "invalid type `#{request_type}`" if !%w(get post put delete).include?(request_type)
40
- id = params.delete(:id)
41
-
42
- uri = id ? URI.parse("#{Api.uri}/#{self.resource_name}/#{id}.json") : URI.parse("#{Api.uri}/#{self.resource_name}.json")
43
-
44
- http = Net::HTTP.new(uri.host, uri.port)
45
- http.use_ssl = uri.scheme == 'https'
46
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if !Api.ssl_verify_peer
47
-
48
- request = Net::HTTP.const_get(request_type.capitalize).new(uri.request_uri)
49
- request.body = JSON.generate(params) unless params.empty?
50
- request.basic_auth(Api.apikey, "U")
51
- request["Content-Type"] = "application/json"
52
-
53
- begin
54
- response = http.request(request)
55
- rescue Exception => e
56
- raise e
57
- end
58
-
59
- response
60
- end
61
-
62
- def request_200(params={})
63
- response = request(params)
64
- unless response.code === "200"
65
- raise HttpError.new("HTTP request failed with code `#{response.code}`: `#{response.body}`")
66
- end
67
- response
68
- end
69
-
70
- private
71
-
72
- def resource(value)
73
- @resource_name = value
74
- end
75
- end
76
- end
77
- end
78
-
79
- attr_reader :id, :error
80
-
81
- def initialize(attributes={})
82
- load_attributes(attributes)
83
- end
84
-
85
- def save
86
- if valid?
87
- response = persisted? ? update : create
88
- attributes = JSON.parse(response.body)
89
- if response.code != "200"
90
- @error = attributes.merge("code" => response.code)
91
- else
92
- load_attributes(attributes)
93
- end
94
- else
95
- raise ValidationError.new(@error)
96
- end
97
- end
98
-
99
- def delete
100
- self.class.request(:id => @id, :request_type => "delete")
101
- end
102
-
103
- def persisted?
104
- !@id.nil?
105
- end
106
-
107
- private
108
-
109
- def create
110
- self.class.request(to_hash.merge(:request_type => "post"))
111
- end
112
-
113
- def update
114
- self.class.request(to_hash.merge(:id => @id, :request_type => "put"))
115
- end
116
- end
117
- end
118
- end