newrelic-metrics 0.0.4 → 0.1.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 (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: []