newrelic-metrics 0.0.4 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/newrelic-metrics.rb +97 -43
  3. metadata +51 -17
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGM2ODJkNGE4MTk3ZWY3MmE3NDg5MmFiNzVmYTJkZDc3YWRlMjI1Nw==
5
+ data.tar.gz: !binary |-
6
+ MTVmYzIzNDc3NjgzY2YxMDUwYjEwMTExYzZlY2ZhMDk4OWQwNzE3Zg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MDMxOGYxMWUxZDFkOGIyZWYxZGU3NWY1ZDBlZTQ5NzBmODI2NTk5ZTY2ZDY2
10
+ MTQ2ZmFlNjkwMDdhN2I5N2M1ZDM4NjVkYzczZDZlMjc0NGRiYzU2MjlkYzRh
11
+ MDljZjE2Y2Q1OTk0NGFlNGZkYWEyNzM5MTk5NDE2ODYzYmUyNDU=
12
+ data.tar.gz: !binary |-
13
+ NGI2M2E0MjExZTBiOTk1ZmIyOTM1ZWU1N2FkNzY3NjNhZGYyY2ZkYjFiMDM4
14
+ Y2ZjY2EwNGNkMjhlZmVhZWVlODQxOThlNTViNDQxZDU5ZjI1ZjljMDlhMWI2
15
+ MzFkZDE3ZGNkOTUzYzQ3Y2VkZGYzMGQ4ODQ1NTgxZDEyN2UwYWM=
@@ -3,63 +3,117 @@ require 'json'
3
3
  require 'uri'
4
4
  require 'chronic'
5
5
 
6
- class NewRelicMetrics
7
- BASE = 'https://api.newrelic.com/v2'
8
-
9
- def initialize(api_key,ids={})
10
- @api_key = api_key
11
- raise ArgumentError, "Need to define either an application or server id" if ids.keys.length!=1
12
- raise ArgumentError, "#{ids.keys.first} must be `application` or `server`" if ids.keys.first != :server && ids.keys.first != :application
13
- @resource = "#{ids.keys.first}s"
14
- @resource_id = ids.values.first
6
+ module NewRelicMetrics
7
+ class Configuration
8
+ attr_accessor :api_key
9
+ def initialize(options={},&block)
10
+ @api_key=options[:api_key]
11
+ yield(self) if block
12
+ end
15
13
  end
16
14
 
17
- def names
18
- get("metrics")
15
+ class << self
16
+ attr_accessor :configuration
19
17
  end
20
18
 
21
- def summarize(metrics={},range={})
22
- throw ArgumentError, "Range must be an array with the from and to time" if range.length>2
23
-
24
- settings = {summarize:true}.merge(range)
19
+ def self.configure
20
+ self.configuration ||= Configuration.new
21
+ yield(configuration)
22
+ end
25
23
 
26
- metrics(metrics,settings)
24
+ class RequestFailed < StandardError
27
25
  end
28
26
 
29
- def metrics(metrics={},options={})
30
- query = ""
31
- conditions = []
27
+ class Client
28
+ BASE = 'https://api.newrelic.com/v2'
32
29
 
33
- names = metrics.keys
34
- values = metrics.values.flatten
30
+ def initialize(config=nil)
31
+ @config = config || NewRelicMetrics.configuration
35
32
 
36
- names.each {|name| conditions << "names[]=#{URI.encode(name)}" }
37
- values.each {|val| conditions << "values[]=#{URI.encode(val)}" }
33
+ raise ArgumentError.new("No API Key is configured") unless @config && @config.api_key
34
+ end
38
35
 
39
- if options[:from]
40
- from_time = Chronic.parse(options[:from], context: :past)
41
- to_time = Chronic.parse(options[:to]) if options[:to]
42
- to_time ||= Time.now
43
- if from_time
44
- conditions << "from=#{from_time.getlocal('+00:00').iso8601}"
45
- conditions << "to=#{to_time.getlocal('+00:00').iso8601}"
46
- end
36
+ def names(options)
37
+ application = options[:application]
38
+ server = options[:server]
39
+ raise ArgumentError.new("Need to define either an application or server id") unless application || server
40
+ raise ArgumentError.new("Need to define either an application or server id, but not both") if application && server
41
+ resource = application ? 'applications' : 'servers'
42
+ resource_id = application || server
43
+ get(resource, resource_id, "metrics")['metrics']
47
44
  end
48
45
 
49
- conditions << "summarize=true" if options[:summarize]
46
+ def metrics(options)
47
+ application = options[:application]
48
+ server = options[:server]
49
+ metrics = options[:metrics]
50
+ range = options[:range] || {}
51
+ summarize = options[:summarize] || false
50
52
 
51
- query = conditions.join('&')
52
- get("metrics/data",query)
53
- end
53
+ raise ArgumentError.new("missing keyword: metrics") unless metrics
54
+
55
+ if range && range!={}
56
+ raise ArgumentError.new("Range must only contain a :to and :from time") unless range.keys.all?{|k| k==:to || k==:from }
57
+ raise ArgumentError.new("Range must contain a :from time") unless range.keys.include?(:from)
58
+ end
59
+
60
+ raise ArgumentError.new("Need to define either an application or server id") unless application || server
61
+ raise ArgumentError.new("Need to define either an application or server id, but not both") if application && server
62
+
63
+ raise ArgumentError.new("Metrics must be set") if !metrics || metrics=={}
64
+ raise ArgumentError.new("Metrics must be an hash") unless metrics.is_a?(Hash)
65
+ raise ArgumentError.new("Metric keys must be string") unless metrics.keys.all?{|k| k.is_a?(String)}
66
+ raise ArgumentError.new("Metric values must be arrays") unless metrics.values.all?{|k| k.is_a?(Array)}
67
+ raise ArgumentError.new("Metric values must be an array of strings") unless metrics.values.all?{|k| k.all?{|v| v.is_a?(String)} }
68
+
69
+ resource = application ? 'applications' : 'servers'
70
+ resource_id = application || server
54
71
 
55
- private
72
+ conditions = []
56
73
 
57
- def get(path,query=nil)
58
- uri = URI.parse('https://api.newrelic.com/')
59
- uri.path = "/v2/#{@resource}/#{@resource_id}/#{path}.json"
60
- uri.query = query if query && query != ""
74
+ metrics.keys.each {|name| conditions << "names[]=#{URI.encode(name)}" }
75
+ metrics.values.flatten.each {|val| conditions << "values[]=#{URI.encode(val)}" }
61
76
 
62
- response = RestClient.get(uri.to_s,'X-Api-Key'=>@api_key)
63
- JSON.parse(response).values.first
77
+ if range[:from]
78
+ from_time = range[:from].is_a?(String) ? Chronic.parse(range[:from], context: :past) : range[:from]
79
+ to_time = range[:to].is_a?(String) ? Chronic.parse(range[:to]) : range[:to] if range[:to]
80
+ to_time ||= Time.now
81
+ if from_time
82
+ conditions << "from=#{from_time.getlocal('+00:00').iso8601}"
83
+ conditions << "to=#{to_time.getlocal('+00:00').iso8601}"
84
+ end
85
+ end
86
+
87
+ conditions << "summarize=true" if summarize
88
+
89
+ query = conditions.join('&')
90
+ get(resource, resource_id, "metrics/data", query)['metric_data']
91
+ end
92
+
93
+ private
94
+
95
+ def get(resource, resource_id, path, query=nil)
96
+ uri = URI.parse('https://api.newrelic.com/')
97
+ uri.path = "/v2/#{resource}/#{resource_id}/#{path}.json"
98
+ uri.query = query if query && query != ""
99
+
100
+ begin
101
+ response = RestClient.get(uri.to_s,'X-Api-Key'=>@config.api_key)
102
+ rescue => ex
103
+ if ex.response
104
+ message = JSON.parse(ex.response).values.first['title']
105
+ raise RequestFailed, message
106
+ else
107
+ raise RequestFailed, ex.message
108
+ end
109
+ end
110
+ begin
111
+ content = JSON.parse(response)
112
+ rescue => ex
113
+ raise RequestFailed, ex.message
114
+ end
115
+
116
+ content
117
+ end
64
118
  end
65
- end
119
+ end
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Maciej Skierkowski
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-10-14 00:00:00.000000000 Z
11
+ date: 2015-04-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rest-client
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 1.7.2
19
+ version: 1.8.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 1.7.2
26
+ version: 1.8.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: chronic
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,19 +41,59 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: json
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
53
- version: 1.8.1
47
+ version: 1.8.2
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
61
- version: 1.8.1
54
+ version: 1.8.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: codeclimate-test-reporter
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.4.7
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.4.7
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 3.2.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 3.2.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 10.4.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 10.4.2
62
97
  description:
63
98
  email:
64
99
  - maciej@factor.io
@@ -69,26 +104,25 @@ files:
69
104
  - lib/newrelic-metrics.rb
70
105
  homepage: https://factor.io
71
106
  licenses: []
107
+ metadata: {}
72
108
  post_install_message:
73
109
  rdoc_options: []
74
110
  require_paths:
75
111
  - lib
76
112
  required_ruby_version: !ruby/object:Gem::Requirement
77
- none: false
78
113
  requirements:
79
114
  - - ! '>='
80
115
  - !ruby/object:Gem::Version
81
116
  version: '0'
82
117
  required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
118
  requirements:
85
119
  - - ! '>='
86
120
  - !ruby/object:Gem::Version
87
121
  version: '0'
88
122
  requirements: []
89
123
  rubyforge_project:
90
- rubygems_version: 1.8.25
124
+ rubygems_version: 2.4.5
91
125
  signing_key:
92
- specification_version: 3
126
+ specification_version: 4
93
127
  summary: Easily get metrics out of New Relic for your application or servers
94
128
  test_files: []