ventable-statsd 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dcc39504e8969b950d09412fb294e9374363113b
4
+ data.tar.gz: 6404aafc8fc04e43600bb7ac613a84566b0e133e
5
+ SHA512:
6
+ metadata.gz: 51acb90d7d8a388ab4b652b0380bfd9642de5d78dae31af1237a943228a9105e323bf072aebf200630396cf5e32f2ed470030f154ebcb0bffa817f9f3c55793b
7
+ data.tar.gz: a787a16e1d26efcb7388d1611f708e01404a9c1659cbfc38dc1ffa1f710079ddbf980d52d26249f27dcc27752d89afe6da7a0c3b7fbb009b38d2a2486aa4acae
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /pkg/
7
+ /doc/
8
+ /spec/reports/
9
+ /spec/coverage/
10
+ /tmp/
11
+ .idea
12
+ .DS_Store
13
+ .DS_Store?
14
+ ._*
15
+ .Spotlight-V100
16
+ .Trashes
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format progress
2
+ --color
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.13.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ventable-statsd.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Konstantin Gredeskoul
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,227 @@
1
+
2
+ [![Build Status](https://travis-ci.org/kigster/ventable-statsd.svg?branch=master)](https://travis-ci.org/kigster/ventable-statsd)
3
+ [![Gem Version](https://badge.fury.io/rb/ventable-statsd.svg)](https://badge.fury.io/rb/ventable-statsd)
4
+ [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/kigster/simple-feed/master/LICENSE.txt)
5
+
6
+ # Ventable::Statsd – Easily Track Application Events with Statsd
7
+
8
+ This library is a small extension to the
9
+ [Ventable](https://github.com/kigster/ventable) eventing library. It
10
+ provides out of the box support for tracking Ventable events using
11
+ Statsd.
12
+
13
+ Why? Because by utilizing Ventable's powerful abstraction you can map
14
+ the most important events in the system as classes, and then subscribe
15
+ them all globally to the `Statsd` collector.
16
+
17
+ This gem does not depend on any particular implementation of `statsd`
18
+ client library, and it expects that you create a `statsd` client and
19
+ pass it via the `.configure` to the `Ventable::Statsd`.
20
+
21
+ The client should typically respond to the methods such as `increment`,
22
+ `gauge`, `set`, `measure` and expect the metric name and value to be
23
+ it's parameters. The methods were modelled based on the
24
+ [`statsd-instrument`](https://github.com/Shopify/statsd-instrument) ruby
25
+ gem, but it should be compatible with many others.
26
+
27
+ ## Usage
28
+
29
+ The gem works as follows:
30
+
31
+ 1. You configure the backend
32
+ 2. You register your ventable events to notify `Ventable::Statsd`
33
+ 3. You either follow the default naming strategy, or provide your own.
34
+ See [Naming Events](#naming-events) further down.
35
+
36
+ ### Configuration
37
+
38
+ Before we can track our events, let's configure our statsd:
39
+
40
+ ```ruby
41
+ require 'statsd-instrument'
42
+ require 'ventable/statsd'
43
+
44
+ # see https://github.com/Shopify/statsd-instrument for more info
45
+ StatsD.backend = StatsD::Instrument::Backends::UDPBackend.new("172.16.0.1:8125", :statsd)
46
+
47
+ Ventable::Statsd.configure do |config|
48
+ config.statsd = StatsD
49
+ config.enabled = true
50
+ end
51
+ ```
52
+
53
+ ### Registration of the Events
54
+
55
+ Now we must connect the event dispatch mechanism with the
56
+ `Ventable::Statsd` module:
57
+
58
+ ```ruby
59
+ class ApplicationOpenedEvent
60
+ include Ventable::Event
61
+ end
62
+
63
+ # Subscribe the event to track event dispatch
64
+ ApplicationOpenedEvent.notifies Ventable::Statsd
65
+
66
+ # Now fire the event, and it should send a packet to statsd!
67
+ ApplicationOpenedEvent.new.fire!
68
+ #=> calls StatsD.increment('application_opened_count', 1)
69
+ ```
70
+
71
+ Or you can register `Ventable::Statsd` in a super class of all of your
72
+ application events, so that you don't have to repeat this code:
73
+
74
+ ```ruby
75
+ class AbstractEvent
76
+ def self.inherited(klass)
77
+ klass.instance_eval do
78
+ include Ventable::Event
79
+ end
80
+ klass.notifies Ventable::Statsd
81
+ end
82
+ end
83
+
84
+ class ApplicationOpenedEvent < AbstractEvent; end
85
+ ```
86
+
87
+ <a name='naming-events'></a>
88
+
89
+ ### Naming Metrics from Events
90
+
91
+ The biggest customization lies within the way you might like to map
92
+ various event occurring to a specific metric name in the Graphite
93
+ database.
94
+
95
+ As you might now, when metric name is separated by a dot '.', Graphite
96
+ create sub-folders and group sub-metrics together. For example
97
+ `order.completed.count` and `order.cancelled.count` would be grouped
98
+ together under `order.*` in Graphite.
99
+
100
+ This is why the default naming scheme uses your event class name,
101
+ converts it to a lower-case underscored version, and replaces all
102
+ underscores with a dot (while also removing redundant `_event` if
103
+ there). This way, an event named, say `UserRegistrationCompletedEvent`
104
+ would be converted to a metric name `user.registration.completed.count`.
105
+ Note how the default metric type is `count`, which would be registered
106
+ by calling `increment(name, 1)` on `Statsd`.
107
+
108
+ #### Customizing Event-to-Metric Naming
109
+
110
+ But what if you wanted to customize how metrics are called?
111
+
112
+ What if you want to keep track of some events as a gauge and not the counter?
113
+
114
+ In these and other cases, there are two ways to customize the event
115
+ names. But before we jump in to see how these are configured, let's
116
+ discuss what these procs are expected to return.
117
+
118
+ ##### Event Naming Hash
119
+
120
+ The *return* of naming customization method/proc is a complete or any
121
+ portion of the following hash — and here are a couple of examples that
122
+ hopefully explain how this hash is used by the library:
123
+
124
+ ```ruby
125
+ # Method to call on statsd; and its value Metric to pass to Statsd
126
+ { method: :increment, value: 1, name: 'graphite.metric.name' }
127
+ { method: :gauge, value: event.total, name: 'graphite.aggregate.gauge' }
128
+ ```
129
+
130
+
131
+ ##### Globally via a Proc
132
+
133
+ You can configure a proc at the top level that receives an event as a
134
+ parameter, and returns an _event naming hash_ (see above) for a given
135
+ event. This can be useful if you can write a single proc that covers all
136
+ of your cases in one place, but is distinct from the default naming.
137
+
138
+ The argument to the proc or method is the event instance.
139
+
140
+ Below we provide the metric naming algorithm in the configuration clause
141
+ for the gem:
142
+
143
+ ```ruby
144
+ Ventable::Stats.configure do |c|
145
+ # this would return a name 'my_event.count' for MyEvent
146
+ c.event_to_metric_proc = ->(event) { { method: :increment,
147
+ value: 1,
148
+ name: event.class.name.underscore + '.count' } }
149
+ end
150
+ ```
151
+
152
+ ##### Via a class method `statsd_config`
153
+
154
+ You can also configure each event with a class method `statsd_config`
155
+ that receives an event instance as an argument, and must return the
156
+ _event naming hash_ to customize the naming and statsd methods.
157
+
158
+ While in the previous example above the proc was applied to all events,
159
+ the following would only apply to the concrete event classes below:
160
+
161
+ ```ruby
162
+ class OrderShippedEvent
163
+ attr_accessor :carrier
164
+ class << self
165
+ def statsd_config
166
+ ->(event) { { method: :increment,
167
+ value: 1,
168
+ name: "order.shipped.#{event.carrier.code}.count" } }
169
+ end
170
+ end
171
+ end
172
+
173
+ class OrderReturnStartedEvent
174
+ class << self
175
+ def statsd_config
176
+ ->(*) { { name: 'order.returns.count' } }
177
+ end
178
+ end
179
+ end
180
+ ```
181
+
182
+ The above examples demonstrate the flexibility of the naming:
183
+
184
+ 1. In the first example, `OrderShippedEvent` is supposed have `carrier`
185
+ accessor, which in turn has a `code` — presumably returning a short
186
+ string, one of `%w(fedex ups dhl)` etc. By using this custom naming
187
+ scheme we are able to group in Graphite our shipping completions by
188
+ carrier without having to create a new event class for each carrier
189
+ type.
190
+ 2. In the second example we do not care about the event instance, but
191
+ provide the gem with an alternative name for this event. Note also
192
+ that we are not including `:method` or `:value`, which would then be
193
+ used from the defaults.
194
+
195
+
196
+ ## Installation
197
+
198
+ Add this line to your application's Gemfile:
199
+
200
+ ```ruby
201
+ gem 'ventable-statsd'
202
+ ```
203
+
204
+ And then execute:
205
+
206
+ $ bundle
207
+
208
+ Or install it yourself as:
209
+
210
+ $ gem install ventable-statsd
211
+
212
+ ## Development
213
+
214
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
215
+
216
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
217
+
218
+ ## Contributing
219
+
220
+ Bug reports and pull requests are welcome on GitHub at
221
+ https://github.com/kigster/ventable-statsd.
222
+
223
+
224
+ ## License
225
+
226
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
227
+
@@ -0,0 +1,16 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ require 'yard'
5
+
6
+
7
+ YARD::Rake::YardocTask.new(:doc) do |t|
8
+ t.files = %w(lib/**/*.rb exe/*.rb - README.md LICENSE.txt)
9
+ t.options.unshift('--title', '"SimpleFeed — Fast and Scalable "write-time" Simple Feed for Social Networks, with a Redis-based default backend implementation."')
10
+ t.after = ->() { exec('open doc/index.html') } if RUBY_PLATFORM =~ /darwin/
11
+ end
12
+
13
+
14
+ RSpec::Core::RakeTask.new(:spec)
15
+
16
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ventable/statsd"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,38 @@
1
+ require 'ventable/statsd/version'
2
+ require 'ventable/statsd/tracker'
3
+
4
+ module Ventable
5
+ module Statsd
6
+ # @!parse extend Ventable::Statsd::Tracker::InstanceMethods
7
+ def tracker
8
+ Ventable::Statsd::Tracker.instance
9
+ end
10
+
11
+ def self.tracker
12
+ Ventable::Statsd::Tracker.instance
13
+ end
14
+
15
+ def self.configure
16
+ yield(Ventable::Statsd::Tracker.instance)
17
+ end
18
+
19
+ class << self
20
+ # @!macro [attach] generate_method
21
+ # @method $1_way
22
+ # Sends $1 to +Ventable::Statsd::Tracker.instance+
23
+ def self.gen(method)
24
+ define_method(method) do |*args|
25
+ tracker.send(method, *args)
26
+ end
27
+ end
28
+
29
+ gen :handle_event
30
+ gen :event_to_metric
31
+ gen :event_to_metric_proc=
32
+ gen :enable!
33
+ gen :disable!
34
+ gen :statsd=
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,102 @@
1
+ require 'singleton'
2
+ require 'ventable'
3
+ require 'active_support/inflections'
4
+
5
+ module Ventable
6
+ module Statsd
7
+ PROXIED_METHODS = %i(increment gauge set measure)
8
+
9
+ DEFAULT_CONFIGURATION = ->(event) { { method: :increment,
10
+ value: 1,
11
+ name: event_to_metric(event) + '.count' } }
12
+
13
+ # Main interface class which delegates some methods to the instance of
14
+ # statsd in order to increment, or gauge/set various metrics.
15
+ #
16
+ # @attr [Statsd] statsd any statsd interface class that responds to methods listed in +PROXIED_METHODS+
17
+ # @attr_reader [Bool] enabled set to false to bypass delegation
18
+ # @attr_writer [Proc] event_to_metric_proc optional proc returning event configuration hash
19
+ class Tracker
20
+ include Singleton
21
+
22
+ attr_writer :statsd, :enabled, :event_to_metric_proc
23
+
24
+ private
25
+
26
+ def initialize
27
+ super
28
+ @statsd = nil
29
+ @enabled = true
30
+ @event_to_metric_proc = nil
31
+ end
32
+
33
+ public
34
+
35
+ PROXIED_METHODS.each do |method|
36
+ define_method(method) do |metric, amount, *args|
37
+ @statsd.send(method, metric, amount, *args)
38
+ end
39
+ end
40
+
41
+ def enable!
42
+ self.enabled = true
43
+ end
44
+
45
+ def disable!
46
+ self.enabled = false
47
+ end
48
+
49
+ # A wrapper around the actual +Statsd+, which checks whether
50
+ # the gem is enabled or disabled before calling +Statsd+.
51
+ #
52
+ # @param [Symbol] operation method name to send to the actual +Statsd+
53
+ #
54
+ # @example Increment a counter
55
+ # enable!
56
+ # statsd(:increment, 'my_event_count', 1)
57
+ #
58
+ # @return nil if disabled, or whatever +Statsd+ returns otherwise.
59
+ def statsd(operation, *args, **opts, &block)
60
+ if @enabled
61
+ raise ArgumentError, 'statsd is not configured, please set it before recording events' unless @statsd
62
+ self.send(operation, *args, **opts, &block)
63
+ end
64
+ end
65
+
66
+ def handle_event(event)
67
+ ec = event_config(event)
68
+ options = ec[:options] || {}
69
+ statsd(ec[:method], *[ec[:name], ec[:value]], **options)
70
+ end
71
+
72
+ private
73
+
74
+ def event_config(event)
75
+ # defaults:
76
+ config = DEFAULT_CONFIGURATION[event]
77
+
78
+ if @event_to_metric_proc
79
+ proc_config = @event_to_metric_proc.call(event) # expect a config Hash
80
+ raise TypeError, "#event_to_metric_proc must return a hash, \neg. { method: :gauge, value: 0.1, name: 'frauds_detected_this_hour' }, \nbut I got #{proc_config.class.name}" unless proc_config.is_a?(Hash)
81
+ config.merge!(proc_config) if proc_config
82
+ end
83
+
84
+ if event.class.respond_to?(:statsd_config)
85
+ config.merge!(event.class.statsd_config(event))
86
+ end
87
+
88
+ config
89
+ end
90
+
91
+ def event_to_metric(event)
92
+ event.
93
+ class.
94
+ name.
95
+ gsub(/.*::/, '').
96
+ underscore.
97
+ gsub(/_?event/, '').
98
+ gsub('_', '.')
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,5 @@
1
+ module Ventable
2
+ module Statsd
3
+ VERSION = '0.2.0'
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ventable/statsd/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'ventable-statsd'
8
+ spec.version = Ventable::Statsd::VERSION
9
+ spec.authors = ['Konstantin Gredeskoul']
10
+ spec.email = ['kig@reinvent.one']
11
+
12
+ spec.summary = %q{Integrate Ventable with Statsd in order to track some or all events that occur using a light-weight UDP protocol.}
13
+ spec.description = %q{Integrate Ventable with Statsd in order to track some or all events that occur using a light-weight UDP protocol.}
14
+ spec.homepage = 'https://github.com/kigster/ventable-statsd'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_dependency 'activesupport'
25
+ spec.add_dependency 'ventable', '~> 1.0'
26
+
27
+ spec.add_development_dependency 'yard'
28
+ spec.add_development_dependency 'simplecov', '~> 0.12'
29
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0'
30
+
31
+ spec.add_development_dependency 'bundler', '~> 1.13'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.0'
34
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ventable-statsd
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Konstantin Gredeskoul
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ventable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.13'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ description: Integrate Ventable with Statsd in order to track some or all events that
126
+ occur using a light-weight UDP protocol.
127
+ email:
128
+ - kig@reinvent.one
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - LICENSE.txt
138
+ - README.md
139
+ - Rakefile
140
+ - bin/console
141
+ - bin/setup
142
+ - lib/ventable/statsd.rb
143
+ - lib/ventable/statsd/tracker.rb
144
+ - lib/ventable/statsd/version.rb
145
+ - ventable-statsd.gemspec
146
+ homepage: https://github.com/kigster/ventable-statsd
147
+ licenses:
148
+ - MIT
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.6.6
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Integrate Ventable with Statsd in order to track some or all events that
170
+ occur using a light-weight UDP protocol.
171
+ test_files: []