meter 0.0.10 → 0.1.0
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 +4 -4
- data/lib/meter/backend.rb +28 -188
- data/lib/meter/backends.rb +16 -0
- data/lib/meter/configuration.rb +24 -129
- data/lib/meter/configure.rb +17 -0
- data/lib/meter/version.rb +2 -2
- data/lib/meter.rb +19 -42
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fea98858b4bdf1096610854053ff2f28532ed90
|
4
|
+
data.tar.gz: b24dab519654d590152ee94dc88f60e671575ffa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 842d05e7398a50393fa7c3ee6252ef07e08ef37eda3757129d32d4b6972ffe4486b362dd881483e04d6728075d00d28a441d3d69fa1ff12cbc4401861e9af5e1
|
7
|
+
data.tar.gz: 2c57251afb124930882c5d546bb9916354a289cd91ed9499ccc10f27933bdb1914ac5b17f3d3b5a01788f56af9b031a2dfd8f154c45232be1126b6ade2a725bb
|
data/lib/meter/backend.rb
CHANGED
@@ -1,216 +1,56 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'socket'
|
2
|
-
require 'pathname'
|
3
|
-
|
4
|
-
|
5
|
-
# Copy and paste from https://github.com/DataDog/dogstatsd-ruby/blob/master/lib/statsd.rb
|
6
|
-
# Changes:
|
7
|
-
# - The class is renamed to "Backend"
|
8
|
-
# - the logger class method points to meter's logger
|
9
3
|
|
10
4
|
module Meter
|
11
|
-
# = Statsd: A DogStatsd client (https://www.datadoghq.com)
|
12
|
-
#
|
13
|
-
# @example Set up a global Statsd client for a server on localhost:8125
|
14
|
-
# require 'statsd'
|
15
|
-
# $statsd = Statsd.new 'localhost', 8125
|
16
|
-
# @example Send some stats
|
17
|
-
# $statsd.increment 'page.views'
|
18
|
-
# $statsd.timing 'page.load', 320
|
19
|
-
# $statsd.gauge 'users.online', 100
|
20
|
-
# @example Use {#time} to time the execution of a block
|
21
|
-
# $statsd.time('account.activate') { @account.activate! }
|
22
|
-
# @example Create a namespaced statsd client and increment 'account.activate'
|
23
|
-
# statsd = Statsd.new('localhost').tap{|sd| sd.namespace = 'account'}
|
24
|
-
# statsd.increment 'activate'
|
25
5
|
class Backend
|
26
|
-
# A namespace to prepend to all statsd calls.
|
27
|
-
attr_reader :namespace
|
28
|
-
|
29
|
-
# A String describing the environment, useful to distinguish staging/production
|
30
|
-
attr_reader :environment
|
31
|
-
|
32
|
-
attr_reader :log_dir
|
33
|
-
|
34
|
-
# StatsD host. Defaults to 127.0.0.1.
|
35
|
-
attr_accessor :host
|
36
6
|
|
37
|
-
|
38
|
-
attr_accessor :port
|
39
|
-
|
40
|
-
def self.logger
|
41
|
-
Meter.config.logger
|
42
|
-
end
|
43
|
-
|
44
|
-
# Return the current version of the library.
|
45
|
-
def self.VERSION
|
46
|
-
"1.1.0"
|
47
|
-
end
|
7
|
+
attr_reader :host, :port
|
48
8
|
|
49
|
-
# @param [String] host your statsd host
|
50
|
-
# @param [Integer] port your statsd port
|
51
9
|
def initialize(host = '127.0.0.1', port = 8125)
|
52
|
-
|
10
|
+
@host, @port = host, port
|
53
11
|
@prefix = nil
|
54
12
|
@socket = UDPSocket.new
|
55
13
|
end
|
56
14
|
|
57
|
-
def
|
58
|
-
|
59
|
-
@prefix = "#{namespace}." if @namespace
|
60
|
-
end
|
61
|
-
|
62
|
-
def environment=(new_environment)
|
63
|
-
@environment = new_environment.to_s
|
64
|
-
end
|
65
|
-
|
66
|
-
def host=(host) #:nodoc:
|
67
|
-
@host = host || '127.0.0.1'
|
68
|
-
end
|
69
|
-
|
70
|
-
def port=(port) #:nodoc:
|
71
|
-
@port = port || 8125
|
72
|
-
end
|
73
|
-
|
74
|
-
def log_dir=(log_dir)
|
75
|
-
@log_dir = Pathname.new log_dir
|
15
|
+
def increment(stat, options = {})
|
16
|
+
send_stats stat, 1, :c, options
|
76
17
|
end
|
77
18
|
|
78
|
-
|
79
|
-
|
80
|
-
# @param [String] stat stat name
|
81
|
-
# @param [Hash] opts the options to create the metric with
|
82
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
83
|
-
# @option opts [Array<String>] :tags An array of tags
|
84
|
-
# @see #count
|
85
|
-
def increment(stat, opts={})
|
86
|
-
count stat, 1, opts
|
19
|
+
def gauge(stat, value, options = {})
|
20
|
+
send_stats stat, value, :g, options
|
87
21
|
end
|
88
22
|
|
89
|
-
|
90
|
-
|
91
|
-
# @param [String] stat stat name
|
92
|
-
# @param [Hash] opts the options to create the metric with
|
93
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
94
|
-
# @option opts [Array<String>] :tags An array of tags
|
95
|
-
# @see #count
|
96
|
-
def decrement(stat, opts={})
|
97
|
-
count stat, -1, opts
|
98
|
-
end
|
99
|
-
|
100
|
-
# Sends an arbitrary count for the given stat to the statsd server.
|
101
|
-
#
|
102
|
-
# @param [String] stat stat name
|
103
|
-
# @param [Integer] count count
|
104
|
-
# @param [Hash] opts the options to create the metric with
|
105
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
106
|
-
# @option opts [Array<String>] :tags An array of tags
|
107
|
-
def count(stat, count, opts={})
|
108
|
-
send_stats stat, count, :c, opts
|
109
|
-
end
|
110
|
-
|
111
|
-
# Sends an arbitary gauge value for the given stat to the statsd server.
|
112
|
-
#
|
113
|
-
# This is useful for recording things like available disk space,
|
114
|
-
# memory usage, and the like, which have different semantics than
|
115
|
-
# counters.
|
116
|
-
#
|
117
|
-
# @param [String] stat stat name.
|
118
|
-
# @param [Numeric] gauge value.
|
119
|
-
# @param [Hash] opts the options to create the metric with
|
120
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
121
|
-
# @option opts [Array<String>] :tags An array of tags
|
122
|
-
# @example Report the current user count:
|
123
|
-
# $statsd.gauge('user.count', User.count)
|
124
|
-
def gauge(stat, value, opts={})
|
125
|
-
send_stats stat, value, :g, opts
|
126
|
-
end
|
127
|
-
|
128
|
-
# Sends a value to be tracked as a histogram to the statsd server.
|
129
|
-
#
|
130
|
-
# @param [String] stat stat name.
|
131
|
-
# @param [Numeric] histogram value.
|
132
|
-
# @param [Hash] opts the options to create the metric with
|
133
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
134
|
-
# @option opts [Array<String>] :tags An array of tags
|
135
|
-
# @example Report the current user count:
|
136
|
-
# $statsd.histogram('user.count', User.count)
|
137
|
-
def histogram(stat, value, opts={})
|
138
|
-
send_stats stat, value, :h, opts
|
139
|
-
end
|
140
|
-
|
141
|
-
# Sends a timing (in ms) for the given stat to the statsd server. The
|
142
|
-
# sample_rate determines what percentage of the time this report is sent. The
|
143
|
-
# statsd server then uses the sample_rate to correctly track the average
|
144
|
-
# timing for the stat.
|
145
|
-
#
|
146
|
-
# @param [String] stat stat name
|
147
|
-
# @param [Integer] ms timing in milliseconds
|
148
|
-
# @param [Hash] opts the options to create the metric with
|
149
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
150
|
-
# @option opts [Array<String>] :tags An array of tags
|
151
|
-
def timing(stat, ms, opts={})
|
152
|
-
send_stats stat, ms, :ms, opts
|
153
|
-
end
|
154
|
-
|
155
|
-
# Reports execution time of the provided block using {#timing}.
|
156
|
-
#
|
157
|
-
# @param [String] stat stat name
|
158
|
-
# @param [Hash] opts the options to create the metric with
|
159
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
160
|
-
# @option opts [Array<String>] :tags An array of tags
|
161
|
-
# @yield The operation to be timed
|
162
|
-
# @see #timing
|
163
|
-
# @example Report the time (in ms) taken to activate an account
|
164
|
-
# $statsd.time('account.activate') { @account.activate! }
|
165
|
-
def time(stat, opts={})
|
166
|
-
start = Time.now
|
167
|
-
result = yield
|
168
|
-
timing(stat, ((Time.now - start) * 1000).round, opts)
|
169
|
-
result
|
170
|
-
end
|
171
|
-
# Sends a value to be tracked as a set to the statsd server.
|
172
|
-
#
|
173
|
-
# @param [String] stat stat name.
|
174
|
-
# @param [Numeric] set value.
|
175
|
-
# @param [Hash] opts the options to create the metric with
|
176
|
-
# @option opts [Numeric] :sample_rate sample rate, 1 for always
|
177
|
-
# @option opts [Array<String>] :tags An array of tags
|
178
|
-
# @example Record a unique visitory by id:
|
179
|
-
# $statsd.set('visitors.uniques', User.id)
|
180
|
-
def set(stat, value, opts={})
|
181
|
-
send_stats stat, value, :s, opts
|
23
|
+
def histogram(stat, value, options = {})
|
24
|
+
send_stats stat, value, :h, options
|
182
25
|
end
|
183
26
|
|
184
27
|
def log(stat, data = {})
|
185
|
-
data = { environment: environment }.merge data
|
186
|
-
data.merge! app: namespace, statname: stat
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
def increment_and_log(stat, data = {})
|
191
|
-
increment stat
|
192
|
-
log stat, data
|
28
|
+
data = { environment: ::Meter.config.environment, Timestamp: Time.now }.merge data
|
29
|
+
data.merge! app: ::Meter.config.namespace, statname: stat
|
30
|
+
::Meter.config.logger.debug { "Logging #{log_file} - #{data}"}
|
31
|
+
log_file.open('a') { |f| f.puts(JSON.dump data) }
|
193
32
|
end
|
194
33
|
|
195
34
|
private
|
196
35
|
|
197
|
-
def
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
36
|
+
def log_file
|
37
|
+
::Meter.config.log_dir.join('application.json.log')
|
38
|
+
end
|
39
|
+
|
40
|
+
# See https://github.com/DataDog/dogstatsd-ruby/blob/master/lib/statsd.rb
|
41
|
+
def send_stats(stat, delta, type, options = {})
|
42
|
+
sample_rate = options[:sample_rate] || 1
|
43
|
+
return unless sample_rate == 1 or rand < sample_rate
|
44
|
+
stat = stat.to_s.gsub('::', '.').tr(':|@', '_')
|
45
|
+
rate = "|@#{sample_rate}" unless sample_rate == 1
|
46
|
+
tags = "|##{Array(options[:tags]).join(",")}" if options[:tags]
|
47
|
+
send_to_socket "#{@prefix}#{stat}:#{delta}|#{type}#{rate}#{tags}"
|
206
48
|
end
|
207
49
|
|
208
50
|
def send_to_socket(message)
|
209
|
-
|
210
|
-
@socket.send
|
211
|
-
rescue => boom
|
212
|
-
self.class.logger.error { "boom Statsd: #{boom.class} #{boom}" } if self.class.logger
|
213
|
-
nil
|
51
|
+
::Meter.config.logger.debug { "UDP #{self.host}:#{self.port} - #{message}" }
|
52
|
+
@socket.send message, 0, self.host, self.port
|
214
53
|
end
|
54
|
+
|
215
55
|
end
|
216
56
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'meter/backend'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Meter
|
5
|
+
|
6
|
+
# Holds the currently known backends.
|
7
|
+
#
|
8
|
+
def self.backends
|
9
|
+
@backends ||= ::OpenStruct.new(
|
10
|
+
datadog: ::Meter::Backend.new('127.0.0.1', 8125),
|
11
|
+
counter: ::Meter::Backend.new('127.0.0.1', 3333),
|
12
|
+
heka: ::Meter::Backend.new('127.0.0.1', 8128),
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/meter/configuration.rb
CHANGED
@@ -5,164 +5,59 @@ require 'meter/backend'
|
|
5
5
|
module Meter
|
6
6
|
class Configuration
|
7
7
|
|
8
|
-
|
9
|
-
attr_reader :primary_backend, :secondary_backend, :counter_backend, :meter_backend
|
8
|
+
attr_reader :options
|
10
9
|
|
11
|
-
def initialize(options={})
|
12
|
-
@
|
13
|
-
|
14
|
-
@primary_backend = Backend.new
|
15
|
-
@primary_backend.host = options[:primary_host] || default_host
|
16
|
-
@primary_backend.port = options[:primary_port] || default_port
|
17
|
-
@primary_backend.namespace = options[:namespace] || default_namespace
|
18
|
-
@primary_backend.environment = options[:environment] || default_environment
|
19
|
-
|
20
|
-
@secondary_backend = Backend.new
|
21
|
-
@secondary_backend.host = options[:secondary_host] || ENV['METER_SECONDARY_HOST'] || default_host
|
22
|
-
@secondary_backend.port = options[:secondary_port] || default_secondary_port
|
23
|
-
@secondary_backend.namespace = options[:namespace] || default_namespace
|
24
|
-
@secondary_backend.environment = options[:environment] || default_environment
|
25
|
-
|
26
|
-
@counter_backend = Backend.new
|
27
|
-
@counter_backend.host = options[:counter_host] || default_host
|
28
|
-
@counter_backend.port = options[:counter_port] || default_counter_port
|
29
|
-
@counter_backend.namespace = options[:namespace] || default_namespace
|
30
|
-
@counter_backend.environment = options[:environment] || default_environment
|
31
|
-
|
32
|
-
@meter_backend = Backend.new
|
33
|
-
@meter_backend.host = options[:meter_host] || default_host
|
34
|
-
@meter_backend.port = options[:meter_port] || default_meter_port
|
35
|
-
@meter_backend.namespace = options[:namespace] || default_namespace
|
36
|
-
@meter_backend.environment = options[:environment] || default_environment
|
37
|
-
@meter_backend.log_dir = options[:meter_log_dir] || default_meter_log_dir
|
38
|
-
|
39
|
-
@tags = options[:tags] || {}
|
10
|
+
def initialize(options = {})
|
11
|
+
@options = options
|
40
12
|
end
|
41
13
|
|
42
|
-
def
|
43
|
-
|
44
|
-
secondary_backend.namespace = new_namespace
|
45
|
-
counter_backend.namespace = new_namespace
|
46
|
-
meter_backend.namespace = new_namespace
|
47
|
-
end
|
48
|
-
|
49
|
-
def environment=(new_environment)
|
50
|
-
primary_backend.environment = new_environment
|
51
|
-
secondary_backend.environment = new_environment
|
52
|
-
counter_backend.environment = new_environment
|
53
|
-
meter_backend.environment = new_environment
|
14
|
+
def logger
|
15
|
+
@logger ||= options[:logger] || default_logger
|
54
16
|
end
|
17
|
+
attr_writer :logger
|
55
18
|
|
56
19
|
def namespace
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
def primary_host
|
61
|
-
primary_backend.host
|
62
|
-
end
|
63
|
-
|
64
|
-
def primary_port
|
65
|
-
primary_backend.port
|
66
|
-
end
|
67
|
-
|
68
|
-
def secondary_host
|
69
|
-
secondary_backend.host
|
70
|
-
end
|
71
|
-
|
72
|
-
def secondary_port
|
73
|
-
secondary_backend.port
|
74
|
-
end
|
75
|
-
|
76
|
-
def secondary_host
|
77
|
-
secondary_backend.host
|
78
|
-
end
|
79
|
-
|
80
|
-
def secondary_port
|
81
|
-
secondary_backend.port
|
82
|
-
end
|
83
|
-
|
84
|
-
def primary_host=(new_host)
|
85
|
-
primary_backend.host = new_host
|
20
|
+
@namespace ||= options[:namespace] || default_namespace
|
86
21
|
end
|
22
|
+
attr_writer :namespace
|
87
23
|
|
88
|
-
def
|
89
|
-
|
24
|
+
def environment
|
25
|
+
@environment ||= options[:environment] || default_environment
|
90
26
|
end
|
27
|
+
attr_writer :environment
|
91
28
|
|
92
|
-
def
|
93
|
-
|
29
|
+
def log_dir
|
30
|
+
@log_dir ||= (::Pathname.new(options[:log_dir]) if options[:log_dir]) || default_log_dir
|
94
31
|
end
|
95
32
|
|
96
|
-
def
|
97
|
-
|
33
|
+
def log_dir=(new_dir)
|
34
|
+
@log_dir = Pathname.new new_dir
|
98
35
|
end
|
99
36
|
|
100
37
|
private
|
101
38
|
|
102
39
|
def default_logger
|
103
|
-
if defined?(Rails)
|
104
|
-
|
105
|
-
else
|
106
|
-
Logger.new(STDOUT)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def default_host
|
111
|
-
'127.0.0.1'
|
112
|
-
end
|
113
|
-
|
114
|
-
def default_port
|
115
|
-
8125
|
116
|
-
end
|
117
|
-
|
118
|
-
def default_secondary_port
|
119
|
-
8127
|
120
|
-
end
|
121
|
-
|
122
|
-
def default_counter_port
|
123
|
-
3333
|
124
|
-
end
|
125
|
-
|
126
|
-
def default_meter_port
|
127
|
-
8128
|
40
|
+
return ::Rails.logger if defined?(::Rails)
|
41
|
+
::Logger.new STDOUT
|
128
42
|
end
|
129
43
|
|
130
44
|
def default_namespace
|
131
|
-
|
45
|
+
:meter
|
132
46
|
end
|
133
47
|
|
134
48
|
def default_environment
|
135
|
-
return Rails.env if defined?(Rails)
|
49
|
+
return ::Rails.env if defined?(::Rails)
|
136
50
|
return ENV['RACK_ENV'] if ENV['RACK_ENV'].to_s != ''
|
137
51
|
return ENV['NODE_CHEF_ENVIRONMENT'] if ENV['NODE_CHEF_ENVIRONMENT'].to_s != ''
|
138
52
|
'unknown'
|
139
53
|
end
|
140
54
|
|
141
|
-
def
|
142
|
-
return Rails.root.join('log') if defined?(Rails)
|
143
|
-
Pathname.pwd
|
55
|
+
def default_log_dir
|
56
|
+
return ::Rails.root.join('log') if defined?(::Rails)
|
57
|
+
log_subdir = ::Pathname.pwd.join('log')
|
58
|
+
return log_subdir if log_subdir.directory?
|
59
|
+
Pathname.new '/dev/null'
|
144
60
|
end
|
145
61
|
|
146
62
|
end
|
147
63
|
end
|
148
|
-
|
149
|
-
module Meter
|
150
|
-
|
151
|
-
# Public: Returns the the configuration instance.
|
152
|
-
#
|
153
|
-
def self.config
|
154
|
-
@config ||= Configuration.new
|
155
|
-
end
|
156
|
-
|
157
|
-
# Public: Yields the configuration instance.
|
158
|
-
#
|
159
|
-
def self.configure(&block)
|
160
|
-
yield config
|
161
|
-
end
|
162
|
-
|
163
|
-
# Public: Reset the configuration (useful for testing).
|
164
|
-
#
|
165
|
-
def self.reset!
|
166
|
-
@config = nil
|
167
|
-
end
|
168
|
-
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'meter/configuration'
|
2
|
+
|
3
|
+
module Meter
|
4
|
+
|
5
|
+
# Public: Lazy-loads and returns the the configuration instance.
|
6
|
+
#
|
7
|
+
def self.config
|
8
|
+
@config ||= ::Meter::Configuration.new
|
9
|
+
end
|
10
|
+
|
11
|
+
# Public: Yields the configuration instance.
|
12
|
+
#
|
13
|
+
def self.configure(&block)
|
14
|
+
yield config
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/meter/version.rb
CHANGED
data/lib/meter.rb
CHANGED
@@ -1,59 +1,36 @@
|
|
1
|
-
require '
|
2
|
-
require 'meter/
|
1
|
+
require 'meter/backends'
|
2
|
+
require 'meter/configure'
|
3
3
|
|
4
|
-
# A generic wrapper for Statsd-like gauges and counters.
|
5
|
-
#
|
6
4
|
module Meter
|
7
|
-
extend self
|
8
5
|
|
9
|
-
def increment(key, options = {})
|
6
|
+
def self.increment(key, options = {})
|
10
7
|
id = options.delete(:id)
|
11
|
-
|
12
|
-
if id
|
13
|
-
counter.increment "#{key}.#{id}", options
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def count(key, delta, options = {})
|
18
|
-
id = options.delete(:id)
|
19
|
-
primary.count key, delta, options
|
20
|
-
if id
|
21
|
-
counter.count "#{key}.#{id}", delta, options
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def gauge(key, value, options = {})
|
26
|
-
primary.gauge key, value, options
|
27
|
-
end
|
8
|
+
backends.datadog.increment key, options
|
9
|
+
backends.counter.increment("#{key}.#{id}", options) if id
|
28
10
|
|
29
|
-
|
30
|
-
|
11
|
+
rescue => exception
|
12
|
+
::Meter.config.logger.error exception.inspect
|
31
13
|
end
|
32
14
|
|
33
|
-
def
|
34
|
-
|
35
|
-
end
|
15
|
+
def self.gauge(key, value, options = {})
|
16
|
+
backends.datadog.gauge key, value, options
|
36
17
|
|
37
|
-
|
38
|
-
|
18
|
+
rescue => exception
|
19
|
+
::Meter.config.logger.error exception.inspect
|
39
20
|
end
|
40
21
|
|
41
|
-
|
22
|
+
def self.histogram(key, value, options = {})
|
23
|
+
backends.datadog.histogram key, value, options
|
42
24
|
|
43
|
-
|
44
|
-
config.
|
25
|
+
rescue => exception
|
26
|
+
::Meter.config.logger.error exception.inspect
|
45
27
|
end
|
46
28
|
|
47
|
-
def
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
def counter
|
52
|
-
config.counter_backend
|
53
|
-
end
|
29
|
+
def self.log(key, data)
|
30
|
+
backends.heka.log key, data
|
54
31
|
|
55
|
-
|
56
|
-
config.
|
32
|
+
rescue => exception
|
33
|
+
::Meter.config.logger.error exception.inspect
|
57
34
|
end
|
58
35
|
|
59
36
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bukowskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: trouble
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rspec
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: timecop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: A generic abstraction layer for fire and forgetting measurements via
|
56
84
|
UDP.
|
57
85
|
email:
|
@@ -61,7 +89,9 @@ extra_rdoc_files: []
|
|
61
89
|
files:
|
62
90
|
- lib/meter.rb
|
63
91
|
- lib/meter/backend.rb
|
92
|
+
- lib/meter/backends.rb
|
64
93
|
- lib/meter/configuration.rb
|
94
|
+
- lib/meter/configure.rb
|
65
95
|
- lib/meter/version.rb
|
66
96
|
homepage: https://github.com/bukowskis/meter
|
67
97
|
licenses:
|