wavefront-client 0.5.3 → 1.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.
- checksums.yaml +8 -8
- data/README.md +39 -8
- data/bin/wavefront-client +22 -3
- data/lib/wavefront/client/version.rb +1 -1
- data/lib/wavefront/client.rb +3 -1
- data/lib/wavefront/exception.rb +1 -0
- data/lib/wavefront/mixins.rb +29 -0
- data/lib/wavefront/response.rb +41 -20
- data/lib/wavefront/writer.rb +24 -10
- data/spec/example_response.json +1 -1
- data/spec/wavefront/mixins_spec.rb +29 -0
- data/spec/wavefront/response_spec.rb +9 -4
- data/spec/wavefront/writer_spec.rb +10 -9
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWYzOTdiOTVhYzhlMDhlNzYwMGQzZDMwZGU5ZWM5NGY1NGE4ODgxMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MDBhYzIwNDM5YmZmZjkzNTU2YTc1NzVkNWM1NWEzMjJhMDdlYTgxZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTJkMDUxMmQyZTcxNTk4MTkyNzQyMDQ0Njk0MmFmNmQxMmYwYzQ4NGU0ODVm
|
10
|
+
NDMxNDZjNjNhNjAwNjk5YjMzNTMxNWE4NWY5ODI5ZjczYWNhMDgxMGU1MWZm
|
11
|
+
NjJkMWNiOWM3YjM0ZWRhMmMwYjViNmQzZDJiZDQzMzgzNTIwOTU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YTE4OTg4YTAwYWI3N2MzZWYwYzFhMmZhNjE3ZjFiOGRhZjkzYzc5MTBlYWY0
|
14
|
+
Njc4Y2Q1NzY0MDI4OWI1OWY2MGJhZGM2ZDAyZWYwYTAzNDgyNjU4YTMzNWU0
|
15
|
+
ZWE1MDAyYjcyNGZkZTVmYjc4NmEwZGZjNjFmZjY2NmE2ZDI3YmE=
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ writer = Wavefront::Writer.new({:agent_host => 'agent.local.com', :host_name =>
|
|
20
20
|
# value of the metric at current timestamp is: 5
|
21
21
|
writer.write(5)
|
22
22
|
# Let's write a different metric overwriting the default options from the constructor
|
23
|
-
writer.write(6, 'namespace.my.other.metric', 'server2'
|
23
|
+
writer.write(6, 'namespace.my.other.metric', {host_name: 'server2'})
|
24
24
|
```
|
25
25
|
|
26
26
|
* The initializer takes a hash of options, wherein one can set
|
@@ -32,9 +32,17 @@ writer.write(6, 'namespace.my.other.metric', 'server2', {})
|
|
32
32
|
* The write method parameters are:
|
33
33
|
* `metric_value` - A number, the value of the metric reporting at the current timestamp
|
34
34
|
* `metric_name` - A `String`, this must be present, either within the write method call or set on the Writer class
|
35
|
-
*
|
36
|
-
|
37
|
-
|
35
|
+
* A hash of options:
|
36
|
+
* `host_name` - A `String`, which will appear as the host for the sent
|
37
|
+
metric in Wavefront. Defaults to the `host_name` used to initialize
|
38
|
+
the class.
|
39
|
+
* `point_tags` - A `Map` of key, value pairs of strings which will be
|
40
|
+
sent to Wavefront. Not required. Note that if you specify these as
|
41
|
+
part of the write method call they replace any set at the class level.
|
42
|
+
The two maps are _not_ merged. Defaults to the `point_tags` used to
|
43
|
+
initialize the class
|
44
|
+
* `timestamp` - The Epoch Seconds (`Fixnum`), or a Ruby `Time` object, of
|
45
|
+
the reported point Default: `Time.now`
|
38
46
|
|
39
47
|
### Host Tags
|
40
48
|
|
@@ -52,13 +60,13 @@ meta.add_tags(["host.server1.server.com","host.server2.server.com"],["tag1","tag
|
|
52
60
|
meta.remove_tags(["server1.server.com","server2.server.com"],["tag1","tag2"]) # Remove an arbitrary number of tags from an arbitrary number of hosts
|
53
61
|
```
|
54
62
|
|
55
|
-
* The initializer takes up to 3 parameters:
|
63
|
+
* The initializer takes up to 3 parameters:
|
56
64
|
* `token` - A valid Wavefront API Token. This is required.
|
57
65
|
* `host` - A `String` representing the Wavefront endpoint to connect to. Default: `metrics.wavefront.com`.
|
58
66
|
* `debug` `true|false` - When set to `true` output `RestClient` debugging to `stdout`. Default: `false`.
|
59
67
|
|
60
68
|
### Query Client
|
61
|
-
|
69
|
+
|
62
70
|
The `Wavefront::Client` class can be used to send queries to Wavefront and get a response
|
63
71
|
|
64
72
|
Example usage:
|
@@ -72,7 +80,7 @@ response = wave.query('<TS_EXPRESSION>') # <TS_EXPRESSION> : Placeholder for a
|
|
72
80
|
response = wave.query('<TS_EXPRESSION>', 'm', {:start_time => Time.now - 86400, :end_time => Time.now}) # <TS_EXPRESSION> : Placeholder for a valid Wavefront ts() query
|
73
81
|
```
|
74
82
|
|
75
|
-
* Like the Metadata class, the initializer takes up to 3 parameters:
|
83
|
+
* Like the Metadata class, the initializer takes up to 3 parameters:
|
76
84
|
* `token` - A valid Wavefront API Token. This is required.
|
77
85
|
* `host` - A `String` representing the Wavefront endpoint to connect to. Default: `metrics.wavefront.com`.
|
78
86
|
* `debug` `true|false` - When set to `true` output `RestClient` debugging to `stdout`. Default: `false`.
|
@@ -84,6 +92,7 @@ response = wave.query('<TS_EXPRESSION>', 'm', {:start_time => Time.now - 86400,
|
|
84
92
|
* `:start_time` - An object of class `Time` that specifies the query start time. Default: `Time.now - 600`.
|
85
93
|
* `:end_time` - And object of class `Time` that specifies the query end time. Default: `Time.now`.
|
86
94
|
* `:response_format` `[ :raw, :ruby, :graphite, :highcharts ]` - See the section "Response Classes" below. Default: `:raw`.
|
95
|
+
* `:prefix_length` - Used when performing schema manipulations. See the Graphite response format below. Default `1`.
|
87
96
|
|
88
97
|
|
89
98
|
### Response Classes
|
@@ -105,7 +114,7 @@ response.class # Wavefront::Response::Raw
|
|
105
114
|
response = wave.query('<TS_EXPRESSION>', 'm', {:response_format => :ruby}) # <TS_EXPRESSION> : Placeholder for a valid Wavefront ts() query
|
106
115
|
response.class # Wavefront::Response::Ruby
|
107
116
|
response.instance_variables # [:@response, :@query, :@name, :@timeseries, :@stats]
|
108
|
-
response.query
|
117
|
+
response.query
|
109
118
|
```
|
110
119
|
|
111
120
|
* `:response_format => :graphite`
|
@@ -117,6 +126,17 @@ response = wave.query('<TS_EXPRESSION>', 'm', {:response_format => :graphite}) #
|
|
117
126
|
response.graphite[0]['datapoints'].first # [99.8, 1403702640]
|
118
127
|
```
|
119
128
|
|
129
|
+
**Note:** The `target` schema String is constructed from the `label` and the `host` portions of the raw Wavefront response in order to be idiomatically Graphite. In order to determine how to do this properly one must split the `label` into a prefix and a postfix, inserting the `host` between then.
|
130
|
+
|
131
|
+
For example, `label: "web.prod.base.host.cpu-0.percent-idle"` and `host: i-12345678`, by default, would yield: `web.i-12345678.prod.base.host.cpu-0.percent-idle` as the Graphite target.
|
132
|
+
|
133
|
+
Depending on the vagaries of your particular configuration you may wish to specify more than the default 1 field as a prefix. This can be achieved passing the `:prefix_length` key as an option with an appropriate `Fixnum`. For example:
|
134
|
+
|
135
|
+
```
|
136
|
+
response = wave.query('<TS_EXPRESSION>', 'm', {:response_format => :graphite, :prefix_length => 2})
|
137
|
+
response.graphite[0]['target'] # web.prod.i-12345678.base.host.cpu-0.percent-idle
|
138
|
+
```
|
139
|
+
|
120
140
|
* `:response_format => :highcharts`
|
121
141
|
|
122
142
|
A ruby object that returns highcharts-format data via the `response` method:
|
@@ -155,4 +175,15 @@ rake install
|
|
155
175
|
5. Create new Pull Request
|
156
176
|
|
157
177
|
|
178
|
+
## Credits
|
179
|
+
|
180
|
+
Many thanks to SpaceApe games for initially contributing this Ruby client. Contributors include:
|
181
|
+
|
182
|
+
Sam Pointer
|
183
|
+
Louis McCormack
|
184
|
+
Joshua McGhee
|
185
|
+
Robert Fisher
|
186
|
+
Salil Deshmukh
|
187
|
+
Conor Beverland
|
188
|
+
|
158
189
|
[1]: http://wavefront.com
|
data/bin/wavefront-client
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
|
16
16
|
require 'wavefront/client'
|
17
17
|
require 'slop'
|
18
|
+
require 'pp'
|
19
|
+
require 'json'
|
18
20
|
|
19
21
|
@opts = Slop.parse(strict: true) do
|
20
22
|
banner 'Usage: wavefront-client QUERY (OPTIONS)'
|
@@ -24,6 +26,8 @@ require 'slop'
|
|
24
26
|
on 's', 'start=', 'Time in UNIX epoch seconds to begin the query from'
|
25
27
|
on 't', 'token=', 'Wavefront authentication token'
|
26
28
|
on 'e', 'end=', 'Time in UNIX epoch seconds to query to'
|
29
|
+
on 'f', 'format=', "Output format (#{Wavefront::Client::FORMATS.join(', ')})", default: Wavefront::Client::DEFAULT_FORMAT.to_s
|
30
|
+
on 'p', 'prefixlength=', 'The number of path elements to treat as a prefix when doing schema manipulations', default: 1
|
27
31
|
on 'h', 'help', 'Display this message'
|
28
32
|
end
|
29
33
|
|
@@ -44,14 +48,29 @@ else
|
|
44
48
|
exit 1
|
45
49
|
end
|
46
50
|
|
51
|
+
unless Wavefront::Client::FORMATS.include?(@opts[:format].to_sym)
|
52
|
+
puts "The output format must be on of #{Wavefront::Client::FORMATS.join(', ')}"
|
53
|
+
exit 1
|
54
|
+
end
|
55
|
+
|
47
56
|
options = Hash.new
|
57
|
+
options[:response_format] = @opts[:format].to_sym
|
58
|
+
options[:prefix_length] = @opts[:prefixlength].to_i
|
59
|
+
|
48
60
|
if @opts[:start]
|
49
|
-
options[:start_time] = @opts[:start]
|
61
|
+
options[:start_time] = Time.at(@opts[:start].to_i)
|
50
62
|
end
|
51
63
|
|
52
64
|
if @opts[:end]
|
53
|
-
options[:end_time] = @opts[:end]
|
65
|
+
options[:end_time] = Time.at(@opts[:end].to_i)
|
54
66
|
end
|
55
67
|
|
56
68
|
wave = Wavefront::Client.new(@opts[:token])
|
57
|
-
|
69
|
+
case options[:response_format]
|
70
|
+
when :raw
|
71
|
+
puts wave.query(query, granularity, options)
|
72
|
+
when :graphite
|
73
|
+
puts wave.query(query, granularity, options).graphite.to_json
|
74
|
+
else
|
75
|
+
pp wave.query(query, granularity, options)
|
76
|
+
end
|
data/lib/wavefront/client.rb
CHANGED
@@ -43,10 +43,12 @@ module Wavefront
|
|
43
43
|
options[:end_time] ||= Time.now
|
44
44
|
options[:start_time] ||= options[:end_time] - DEFAULT_PERIOD_SECONDS
|
45
45
|
options[:response_format] ||= DEFAULT_FORMAT
|
46
|
+
options[:prefix_length] ||= 1
|
46
47
|
|
47
48
|
[ options[:start_time], options[:end_time] ].each { |o| raise Wavefront::Exception::InvalidTimeFormat unless o.is_a?(Time) }
|
48
49
|
raise Wavefront::Exception::InvalidGranularity unless GRANULARITIES.include?(granularity)
|
49
50
|
raise Wavefront::Exception::InvalidResponseFormat unless FORMATS.include?(options[:response_format])
|
51
|
+
raise InvalidPrefixLength unless options[:prefix_length].is_a?(Fixnum)
|
50
52
|
|
51
53
|
args = {:params =>
|
52
54
|
{:q => query, :g => granularity, :n => 'Unknown',
|
@@ -54,7 +56,7 @@ module Wavefront
|
|
54
56
|
response = RestClient.get @base_uri.to_s, args
|
55
57
|
|
56
58
|
klass = Object.const_get('Wavefront').const_get('Response').const_get(options[:response_format].to_s.capitalize)
|
57
|
-
return klass.new(response)
|
59
|
+
return klass.new(response, options)
|
58
60
|
|
59
61
|
end
|
60
62
|
|
data/lib/wavefront/exception.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2015 Wavefront Inc.
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
|
15
|
+
=end
|
16
|
+
|
17
|
+
module Wavefront
|
18
|
+
module Mixins
|
19
|
+
def interpolate_schema(label, host, prefix_length)
|
20
|
+
label_parts = label.split('.')
|
21
|
+
interpolated = Array.new
|
22
|
+
interpolated << label_parts.shift(prefix_length)
|
23
|
+
interpolated << host
|
24
|
+
interpolated << label_parts
|
25
|
+
interpolated.flatten!
|
26
|
+
return interpolated.join('.')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/wavefront/response.rb
CHANGED
@@ -16,15 +16,17 @@ See the License for the specific language governing permissions and
|
|
16
16
|
|
17
17
|
require 'wavefront/client/version'
|
18
18
|
require 'wavefront/exception'
|
19
|
+
require 'wavefront/mixins'
|
19
20
|
require 'json'
|
20
21
|
|
21
22
|
module Wavefront
|
22
23
|
class Response
|
23
24
|
class Raw
|
24
|
-
attr_reader :response
|
25
|
+
attr_reader :response, :options
|
25
26
|
|
26
|
-
def initialize(response)
|
27
|
+
def initialize(response, options={})
|
27
28
|
@response = response
|
29
|
+
@options = options
|
28
30
|
end
|
29
31
|
|
30
32
|
def to_s
|
@@ -35,10 +37,11 @@ module Wavefront
|
|
35
37
|
|
36
38
|
class Ruby
|
37
39
|
include JSON
|
38
|
-
attr_reader :response
|
40
|
+
attr_reader :response, :options
|
39
41
|
|
40
|
-
def initialize(response)
|
42
|
+
def initialize(response, options={})
|
41
43
|
@response = response
|
44
|
+
@options = options
|
42
45
|
|
43
46
|
JSON.parse(response).each_pair do |k,v|
|
44
47
|
self.instance_variable_set("@#{k}", v) # Dynamically populate instance vars
|
@@ -49,43 +52,61 @@ module Wavefront
|
|
49
52
|
end
|
50
53
|
|
51
54
|
class Graphite < Wavefront::Response::Ruby
|
52
|
-
|
55
|
+
include Wavefront::Mixins
|
56
|
+
attr_reader :response, :graphite, :options
|
53
57
|
|
54
|
-
def initialize(response)
|
58
|
+
def initialize(response, options={})
|
55
59
|
super
|
60
|
+
options[:prefix_length] ||= 1 # See also Wavefront::Client
|
56
61
|
|
57
|
-
|
62
|
+
@graphite = Array.new
|
58
63
|
self.timeseries.each do |ts|
|
64
|
+
|
65
|
+
output_timeseries = Hash.new
|
66
|
+
output_timeseries['target'] = interpolate_schema(ts['label'], ts['host'], options[:prefix_length])
|
67
|
+
|
68
|
+
datapoints = Array.new
|
59
69
|
ts['data'].each do |d|
|
60
70
|
datapoints << [d[1], d[0]]
|
61
71
|
end
|
62
|
-
end
|
63
72
|
|
64
|
-
|
73
|
+
output_timeseries['datapoints'] = datapoints
|
74
|
+
@graphite << output_timeseries
|
75
|
+
|
76
|
+
end
|
65
77
|
end
|
66
78
|
|
67
79
|
end
|
68
80
|
|
69
81
|
class Highcharts < Wavefront::Response::Ruby
|
70
82
|
include JSON
|
71
|
-
attr_reader :response, :highcharts
|
83
|
+
attr_reader :response, :highcharts, :options
|
72
84
|
|
73
|
-
def initialize(response)
|
85
|
+
def initialize(response, options={})
|
74
86
|
super
|
75
87
|
|
76
88
|
@response = JSON.parse(response)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
89
|
+
@highcharts = []
|
90
|
+
self.timeseries.each do |series|
|
91
|
+
# Highcharts expects the time in milliseconds since the epoch
|
92
|
+
# And for some reason the first value tends to be BS
|
93
|
+
# We also have to deal with missing (null/nil) data points.
|
94
|
+
amended_data = Array.new
|
95
|
+
next unless series['data'].size > 0
|
96
|
+
series['data'][1..-1].each do |time_value_pair|
|
97
|
+
if time_value_pair[0]
|
98
|
+
time_value_pair[0] = time_value_pair[0] * 1000
|
99
|
+
else
|
100
|
+
time_value_pair[0] = "null"
|
101
|
+
end
|
102
|
+
amended_data << time_value_pair
|
103
|
+
end
|
104
|
+
@highcharts << { 'name' => series['label'], 'data' => amended_data }
|
105
|
+
end
|
85
106
|
end
|
86
107
|
|
87
108
|
def to_json
|
88
|
-
|
109
|
+
@highcharts.to_json
|
89
110
|
end
|
90
111
|
end
|
91
112
|
|
data/lib/wavefront/writer.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
=begin
|
1
|
+
=begin
|
2
2
|
Copyright 2015 Wavefront Inc.
|
3
3
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
you may not use this file except in compliance with the License.
|
@@ -31,23 +31,37 @@ module Wavefront
|
|
31
31
|
options[:host_name] ||= DEFAULT_HOSTNAME
|
32
32
|
options[:metric_name] ||= ''
|
33
33
|
options[:point_tags] ||= {}
|
34
|
-
|
34
|
+
|
35
35
|
@host_name = options[:host_name]
|
36
36
|
@metric_name = options[:metric_name]
|
37
37
|
@point_tags = options[:point_tags]
|
38
|
-
|
38
|
+
|
39
39
|
@socket = get_socket(options[:agent_host], options[:agent_port])
|
40
40
|
end
|
41
|
-
|
42
|
-
def write(metric_value, metric_name
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
|
42
|
+
def write(metric_value, metric_name = @metric_name, options = {})
|
43
|
+
options[:host_name] ||= @host_name
|
44
|
+
options[:point_tags] ||= @point_tags
|
45
|
+
options[:timestamp] ||= Time.now
|
46
|
+
|
47
|
+
if metric_name.empty?
|
48
|
+
raise Wavefront::Exception::EmptyMetricName
|
49
|
+
end
|
50
|
+
|
51
|
+
if options[:point_tags].empty?
|
52
|
+
append = "host=#{options[:host_name]}"
|
53
|
+
else
|
54
|
+
tags = options[:point_tags].map { |k, v| "#{k}=\"#{v}\"" }.join(' ')
|
55
|
+
append = "host=#{options[:host_name]} #{tags}"
|
56
|
+
end
|
57
|
+
|
58
|
+
@socket.puts [metric_name, metric_value, options[:timestamp].to_i,
|
59
|
+
append].join(' ')
|
47
60
|
end
|
48
61
|
|
49
62
|
private
|
50
|
-
|
63
|
+
|
64
|
+
def get_socket(host, port)
|
51
65
|
TCPSocket.new(host, port)
|
52
66
|
end
|
53
67
|
|
data/spec/example_response.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"query":"ts(\"collectd.memory.memory.cached\", host=\"test.server\")","name":"Unknown","timeseries":[{"label":"collectd.memory.memory.cached","host":"test.server","data":[[1436487780,4.625565013333333E8],[1436487840,4.625646933333333E8],[1436487900,4.625728853333333E8],[1436487960,4.625810773333333E8],[1436488020,4.625926826666667E8],[1436488080,4.626015573333333E8],[1436488140,4.626097493333333E8],[1436488200,4.626179413333333E8],[1436488260,4.626261333333333E8],[1436488320,4.626343253333333E8],[1436488380,4.626425173333333E8],[1436488440,4.626507093333333E8],[1436488500,4.626589013333333E8],[1436488560,4.626670933333333E8],[1436488620,4.626752853333333E8],[1436488680,4.626868906666667E8],[1436488740,4.626957653333333E8],[1436488800,4.627039573333333E8],[1436488860,4.627121493333333E8],[1436488920,4.627203413333333E8],[1436488980,4.6272512E8]]}],"granularity":60,"stats":{"keys":24,"points":1336,"summaries":1314,"summarized_points":0,"summarized_summaries":0,"buffer_keys":24,"compacted_keys":2,"compacted_points":1314,"latency":78,"queries":2,"s3_keys":0,"cpu_ns":5412921}}
|
1
|
+
{"query":"100 - ts(ops.prod.base.host.cpu-*.percent-idle)","name":"Unknown","timeseries":[{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-0ae6d2a7","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-0de6d2a0","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-32388c9f","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-406d6eed","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-4fe968e2","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-5b3f8bf6","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-ba3f8b17","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-bce7d311","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-bd971010","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"ip-172-31-31-195","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"unknown","data":[]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-24292a89","data":[[1439371440,0.4000000000000033],[1439371500,0.5826666666666659],[1439371560,0.3335000000000008],[1439371620,0.5326666666666663],[1439371680,0.3000000000000019],[1439371740,0.44983333333333303],[1439371800,0.4170000000000016],[1439371860,0.3999999999999986],[1439371920,0.46683333333333366],[1439371980,0.4163333333333341],[1439372040,0.48316666666666447],[1439372100,0.43299999999999983],[1439372160,0.4165000000000016],[1439372220,0.3498333333333316],[1439372280,0.6000000000000014],[1439372340,0.4168333333333365],[1439372400,87.93666666666667],[1439372460,99.65514166666667],[1439372520,11.878333333333334],[1439372580,0.449333333333333],[1439372640,0.3499999999999967],[1439372700,0.6333333333333305],[1439372760,0.5168333333333308],[1439372820,0.38333333333333286],[1439372880,0.3498333333333316],[1439372940,0.4824999999999993],[1439373000,0.416666666666669],[1439373060,0.4660000000000011],[1439373120,0.4001666666666684],[1439373180,0.4164999999999992],[1439373240,0.36666666666666714]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-249e1f89","data":[[1439371440,0.38283333333333286],[1439371500,0.34983333333333394],[1439371560,0.34966666666666885],[1439371620,0.36616666666666714],[1439371680,0.38333333333333286],[1439371740,0.3333333333333333],[1439371800,0.5495000000000019],[1439371860,0.25],[1439371920,0.2666666666666681],[1439371980,0.36616666666666714],[1439372040,0.28350000000000125],[1439372100,0.4829999999999994],[1439372160,0.43283333333333474],[1439372220,0.4659999999999987],[1439372280,0.36649999999999966],[1439372340,0.333333333333331],[1439372400,84.88483333333333],[1439372460,99.59467666666667],[1439372520,2.799333333333337],[1439372580,0.28316666666666873],[1439372640,0.2500000000000024],[1439372700,0.3498333333333363],[1439372760,0.4164999999999992],[1439372820,0.3495000000000014],[1439372880,0.44933333333333064],[1439372940,0.28333333333333616],[1439373000,0.36650000000000205],[1439373060,0.24983333333333255],[1439373120,0.3163333333333351],[1439373180,0.38350000000000267],[1439373240,0.36666666666666475]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-27292a8a","data":[[1439371440,0.3000000000000019],[1439371500,0.28333333333333616],[1439371560,0.2666666666666681],[1439371620,0.36633333333333223],[1439371680,0.3330000000000008],[1439371740,0.31650000000000017],[1439371800,0.5498333333333321],[1439371860,0.34966666666666885],[1439371920,0.36650000000000205],[1439371980,0.5998333333333316],[1439372040,0.3335000000000008],[1439372100,0.34983333333333394],[1439372160,0.2833333333333338],[1439372220,0.3166666666666676],[1439372280,0.29999999999999954],[1439372340,0.36649999999999966],[1439372400,90.50422833333333],[1439372460,96.05833333333334],[1439372520,0.9016666666666684],[1439372580,0.28316666666666396],[1439372640,0.3990000000000009],[1439372700,0.44966666666666794],[1439372760,0.44966666666666794],[1439372820,0.4165000000000016],[1439372880,0.3833333333333305],[1439372940,0.3330000000000008],[1439373000,0.5326666666666663],[1439373060,0.4331666666666673],[1439373120,0.416166666666669],[1439373180,0.4993333333333349],[1439373240,0.31650000000000017]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-4bb938e6","data":[[1439371440,0.28316666666666634],[1439371500,0.4159999999999992],[1439371560,0.2833333333333338],[1439371620,0.28333333333333144],[1439371680,0.36600000000000205],[1439371740,0.29983333333333445],[1439371800,0.3333333333333333],[1439371860,0.36633333333333457],[1439371920,0.4159999999999992],[1439371980,0.28316666666666873],[1439372040,0.3333333333333357],[1439372100,0.3500000000000038],[1439372160,0.2666666666666681],[1439372220,0.2666666666666657],[1439372280,0.4001666666666684],[1439372340,0.5328333333333338],[1439372400,93.83716666666666],[1439372460,99.36666666666667],[1439372520,0.8335000000000008],[1439372580,0.4330000000000022],[1439372640,0.382666666666663],[1439372700,0.3000000000000019],[1439372760,0.44966666666666794],[1439372820,0.3830000000000003],[1439372880,0.3668333333333346],[1439372940,0.3000000000000019],[1439373000,0.4161666666666667],[1439373060,0.25],[1439373120,0.3333333333333333],[1439373180,0.31700000000000017],[1439373240,0.3331666666666659]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-0bab2aa6","data":[[1439371440,0.28333333333333616],[1439371500,0.3000000000000019],[1439371560,0.23333333333333428],[1439371620,0.23333333333333192],[1439371680,0.3501666666666665],[1439371740,0.36650000000000443],[1439371800,0.3334999999999984],[1439371860,0.29983333333333445],[1439371920,0.36650000000000205],[1439371980,0.2833333333333338],[1439372040,0.43283333333333707],[1439372100,0.3168333333333327],[1439372160,0.2498333333333349],[1439372220,0.3334999999999984],[1439372280,0.38333333333333525],[1439372340,0.3500000000000038],[1439372400,94.44966666666667],[1439372460,94.86545833333334],[1439372520,0.950833333333333],[1439372580,0.29983333333333445],[1439372640,0.2833333333333338],[1439372700,0.3330000000000008],[1439372760,0.3498333333333363],[1439372820,0.29983333333333206],[1439372880,0.28316666666666634],[1439372940,0.3333333333333333],[1439373000,0.3828333333333328],[1439373060,0.29983333333333445],[1439373120,0.2833333333333338],[1439373180,0.3161666666666652],[1439373240,0.36633333333333223]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-592f2cf4","data":[[1439371440,0.28333333333333616],[1439371500,0.36616666666666947],[1439371560,0.31666666666667],[1439371620,0.23333333333333428],[1439371680,0.4336666666666673],[1439371740,0.3496666666666665],[1439371800,0.4333333333333371],[1439371860,0.2665000000000006],[1439371920,0.3164999999999978],[1439371980,0.36650000000000205],[1439372040,0.3500000000000014],[1439372100,0.38333333333333286],[1439372160,0.350333333333334],[1439372220,0.44966666666667027],[1439372280,0.3333333333333333],[1439372340,0.3328333333333333],[1439372400,90.5225],[1439372460,99.21745333333334],[1439372520,0.617000000000002],[1439372580,0.2666666666666681],[1439372640,0.2998333333333368],[1439372700,0.36649999999999966],[1439372760,0.38333333333333286],[1439372820,0.2666666666666657],[1439372880,0.29983333333333445],[1439372940,0.43316666666666964],[1439373000,0.44933333333333536],[1439373060,0.3164999999999978],[1439373120,0.3830000000000003],[1439373180,0.43283333333333474],[1439373240,0.3500000000000014]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-a99e1f04","data":[[1439371440,0.34983333333333394],[1439371500,0.3666666666666695],[1439371560,0.23333333333333192],[1439371620,0.38283333333333286],[1439371680,0.23333333333333428],[1439371740,0.2166666666666662],[1439371800,0.29999999999999954],[1439371860,0.2500000000000024],[1439371920,0.3660000000000044],[1439371980,0.29983333333333206],[1439372040,0.3500000000000014],[1439372100,0.44983333333333536],[1439372160,0.28316666666666873],[1439372220,0.3165000000000025],[1439372280,0.44949999999999807],[1439372340,0.21666666666666856],[1439372400,90.03998333333334],[1439372460,93.50291666666666],[1439372520,0.5836666666666683],[1439372580,0.36616666666666714],[1439372640,0.3329999999999984],[1439372700,0.2666666666666681],[1439372760,0.3328333333333357],[1439372820,0.3330000000000008],[1439372880,0.30016666666666464],[1439372940,0.28316666666666873],[1439373000,0.29999999999999954],[1439373060,0.2996666666666646],[1439373120,0.3830000000000003],[1439373180,0.3330000000000008],[1439373240,0.399666666666666]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-743635d9","data":[[1439371440,0.3831666666666654],[1439371500,0.3500000000000014],[1439371560,0.29983333333333206],[1439371620,0.43333333333333],[1439371680,0.38333333333333286],[1439371740,0.34983333333333394],[1439371800,0.4494999999999981],[1439371860,0.36616666666666475],[1439371920,0.46633333333333366],[1439371980,0.3000000000000019],[1439372040,0.3335000000000008],[1439372100,0.3000000000000019],[1439372160,0.31650000000000017],[1439372220,0.333333333333331],[1439372280,0.3996666666666684],[1439372340,0.3666666666666695],[1439372400,91.44183333333334],[1439372460,99.75181666666667],[1439372520,2.2713333333333354],[1439372580,0.24983333333333016],[1439372640,0.29999999999999954],[1439372700,0.40000000000000097],[1439372760,0.30016666666666464],[1439372820,0.43283333333333474],[1439372880,0.4829999999999994],[1439372940,0.2500000000000024],[1439373000,0.4833333333333319],[1439373060,0.2666666666666657],[1439373120,0.2666666666666681],[1439373180,0.36649999999999966],[1439373240,0.4670000000000011]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-bbc7c416","data":[[1439371440,0.4831666666666668],[1439371500,0.3331666666666706],[1439371560,0.28350000000000125],[1439371620,0.28300000000000125],[1439371680,0.30016666666666697],[1439371740,0.3331666666666682],[1439371800,0.3831666666666654],[1439371860,0.2500000000000024],[1439371920,0.34933333333333155],[1439371980,0.3333333333333357],[1439372040,0.3331666666666659],[1439372100,0.3333333333333333],[1439372160,0.44949999999999807],[1439372220,0.36650000000000205],[1439372280,0.3168333333333351],[1439372340,0.4333333333333371],[1439372400,86.07533333333333],[1439372460,99.82667666666667],[1439372520,2.8129999999999997],[1439372580,0.38333333333333286],[1439372640,0.3999999999999986],[1439372700,0.4163333333333365],[1439372760,0.4165000000000016],[1439372820,0.40016666666666606],[1439372880,0.41616666666666663],[1439372940,0.3331666666666635],[1439373000,0.3998333333333311],[1439373060,0.36650000000000205],[1439373120,0.2666666666666681],[1439373180,0.3331666666666659],[1439373240,0.40000000000000097]]},{"label":"ops.prod.base.host.cpu-0.percent-idle","host":"i-e0a1204d","data":[[1439371440,0.5160000000000006],[1439371500,0.44983333333333064],[1439371560,0.41616666666666663],[1439371620,0.4826666666666668],[1439371680,0.2833333333333338],[1439371740,0.3500000000000014],[1439371800,0.4833333333333343],[1439371860,0.3999999999999986],[1439371920,0.2666666666666681],[1439371980,0.3166666666666676],[1439372040,0.28299999999999886],[1439372100,0.2666666666666681],[1439372160,0.5],[1439372220,0.3830000000000003],[1439372280,0.36633333333333223],[1439372340,0.43266666666666725],[1439372400,95.13166666666666],[1439372460,94.40085],[1439372520,0.9680000000000035],[1439372580,0.449333333333333],[1439372640,0.3331666666666682],[1439372700,0.4826666666666668],[1439372760,0.3168333333333351],[1439372820,0.44966666666666555],[1439372880,0.31650000000000017],[1439372940,0.36633333333333223],[1439373000,0.3669999999999997],[1439373060,0.4663333333333336],[1439373120,0.4826666666666668],[1439373180,0.46683333333333127],[1439373240,0.3999999999999986]]}],"granularity":60,"stats":{"keys":1269,"points":15452,"summaries":14338,"summarized_points":0,"summarized_summaries":0,"buffer_keys":1259,"compacted_keys":155,"compacted_points":14338,"latency":4,"queries":20,"s3_keys":0,"cpu_ns":15186747,"skipped_compacted_keys":144}}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2015 Wavefront Inc.
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
14
|
+
|
15
|
+
=end
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
require 'wavefront/mixins'
|
19
|
+
|
20
|
+
HOST = 'i-12345678'
|
21
|
+
|
22
|
+
describe Wavefront::Mixins do
|
23
|
+
include Wavefront::Mixins
|
24
|
+
it 'provides a method to interpolate the schema' do
|
25
|
+
wavefront_schema = "a.b.c.d.e"
|
26
|
+
expect(interpolate_schema(wavefront_schema, HOST, 1)).to eq("a.#{HOST}.b.c.d.e")
|
27
|
+
expect(interpolate_schema(wavefront_schema, HOST, 2)).to eq("a.b.#{HOST}.c.d.e")
|
28
|
+
end
|
29
|
+
end
|
@@ -16,6 +16,7 @@ See the License for the specific language governing permissions and
|
|
16
16
|
|
17
17
|
require 'spec_helper'
|
18
18
|
require 'pathname'
|
19
|
+
require 'json'
|
19
20
|
|
20
21
|
RESPONSE = 'test'
|
21
22
|
|
@@ -52,14 +53,18 @@ describe Wavefront::Response::Ruby do
|
|
52
53
|
end
|
53
54
|
|
54
55
|
describe Wavefront::Response::Graphite do
|
56
|
+
include Wavefront::Mixins
|
57
|
+
include JSON
|
55
58
|
it 'returns something that resembles some graphite output' do
|
56
59
|
example_response = File.read(Pathname.new(__FILE__).parent.parent.join('example_response.json'))
|
57
60
|
response = Wavefront::Response::Graphite.new(example_response)
|
61
|
+
response_hash = JSON.parse(example_response)
|
62
|
+
schema = interpolate_schema(response_hash['timeseries'][0]['label'], response_hash['timeseries'][0]['host'], 1)
|
58
63
|
|
59
|
-
expect(response.graphite.size).to eq(
|
64
|
+
expect(response.graphite.size).to eq(21)
|
60
65
|
expect(response.graphite[0].keys.size).to eq(2)
|
61
|
-
expect(response.graphite[0]['target']).to eq(
|
62
|
-
expect(response.graphite[
|
66
|
+
expect(response.graphite[0]['target']).to eq(schema)
|
67
|
+
expect(response.graphite[15]['datapoints'].size).to eq(31)
|
63
68
|
end
|
64
69
|
end
|
65
70
|
|
@@ -68,7 +73,7 @@ describe Wavefront::Response::Highcharts do
|
|
68
73
|
example_response = File.read(Pathname.new(__FILE__).parent.parent.join('example_response.json'))
|
69
74
|
response = Wavefront::Response::Highcharts.new(example_response)
|
70
75
|
|
71
|
-
expect(
|
76
|
+
expect(response.highcharts[0]['data'].size).to eq(30)
|
72
77
|
JSON.parse(response.to_json).each { |m| expect(m.keys.size).to eq(2) }
|
73
78
|
end
|
74
79
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
=begin
|
1
|
+
=begin
|
2
2
|
Copyright 2015 Wavefront Inc.
|
3
3
|
Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
you may not use this file except in compliance with the License.
|
@@ -28,11 +28,11 @@ describe Wavefront::Writer do
|
|
28
28
|
|
29
29
|
it 'has some defaults' do
|
30
30
|
expect(Wavefront::Writer::DEFAULT_HOST).to_not be_nil
|
31
|
-
expect(Wavefront::Writer::DEFAULT_HOST).to be_a_kind_of String
|
31
|
+
expect(Wavefront::Writer::DEFAULT_HOST).to be_a_kind_of String
|
32
32
|
expect(Wavefront::Writer::DEFAULT_PORT).to_not be_nil
|
33
|
-
expect(Wavefront::Writer::DEFAULT_PORT).to be_a_kind_of Fixnum
|
33
|
+
expect(Wavefront::Writer::DEFAULT_PORT).to be_a_kind_of Fixnum
|
34
34
|
expect(Wavefront::Writer::DEFAULT_HOSTNAME).to_not be_nil
|
35
|
-
expect(Wavefront::Writer::DEFAULT_HOSTNAME).to be_a_kind_of String
|
35
|
+
expect(Wavefront::Writer::DEFAULT_HOSTNAME).to be_a_kind_of String
|
36
36
|
end
|
37
37
|
|
38
38
|
|
@@ -62,9 +62,9 @@ describe Wavefront::Writer do
|
|
62
62
|
allow(Time).to receive(:now).and_return(123456789)
|
63
63
|
expect(socket).to receive(:puts).with("metric 50 123456789 host=somehost")
|
64
64
|
writer = Wavefront::Writer.new
|
65
|
-
writer.write(50, "metric", host,
|
65
|
+
writer.write(50, "metric", {host_name: host, timestamp: 123456789})
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
it 'should accept a single tag and append it correctly' do
|
69
69
|
host = 'somehost'
|
70
70
|
port = '8566'
|
@@ -74,7 +74,8 @@ describe Wavefront::Writer do
|
|
74
74
|
allow(Time).to receive(:now).and_return(123456789)
|
75
75
|
expect(socket).to receive(:puts).with("metric 50 123456789 host=somehost tag_key_one=\"tag_val_one\"")
|
76
76
|
writer = Wavefront::Writer.new
|
77
|
-
writer.write(50, "metric",
|
77
|
+
writer.write(50, "metric",
|
78
|
+
{host_name: host, point_tags: tags, timestamp: 123456789})
|
78
79
|
end
|
79
80
|
|
80
81
|
it 'should accept multiple tags and append them correctly' do
|
@@ -86,9 +87,9 @@ describe Wavefront::Writer do
|
|
86
87
|
allow(Time).to receive(:now).and_return(123456789)
|
87
88
|
expect(socket).to receive(:puts).with("metric 50 123456789 host=somehost tag_key_one=\"tag_val_one\" k2=\"v2\"")
|
88
89
|
writer = Wavefront::Writer.new
|
89
|
-
writer.write(50, "metric",
|
90
|
+
writer.write(50, "metric",
|
91
|
+
{host_name: host, point_tags: tags, timestamp: 123456789})
|
90
92
|
|
91
93
|
end
|
92
94
|
end
|
93
|
-
|
94
95
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wavefront-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Pointer
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-08-
|
15
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bundler
|
@@ -108,12 +108,14 @@ files:
|
|
108
108
|
- lib/wavefront/events.rb
|
109
109
|
- lib/wavefront/exception.rb
|
110
110
|
- lib/wavefront/metadata.rb
|
111
|
+
- lib/wavefront/mixins.rb
|
111
112
|
- lib/wavefront/response.rb
|
112
113
|
- lib/wavefront/writer.rb
|
113
114
|
- spec/example_response.json
|
114
115
|
- spec/spec_helper.rb
|
115
116
|
- spec/wavefront/client_spec.rb
|
116
117
|
- spec/wavefront/metadata_spec.rb
|
118
|
+
- spec/wavefront/mixins_spec.rb
|
117
119
|
- spec/wavefront/response_spec.rb
|
118
120
|
- spec/wavefront/writer_spec.rb
|
119
121
|
- wavefront-client.gemspec
|
@@ -146,5 +148,6 @@ test_files:
|
|
146
148
|
- spec/spec_helper.rb
|
147
149
|
- spec/wavefront/client_spec.rb
|
148
150
|
- spec/wavefront/metadata_spec.rb
|
151
|
+
- spec/wavefront/mixins_spec.rb
|
149
152
|
- spec/wavefront/response_spec.rb
|
150
153
|
- spec/wavefront/writer_spec.rb
|