tremolo 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1ed9bd38e30071e46726f282c80b9d3acc50906a
4
+ data.tar.gz: 51789cd86d95c20a916750d32f8556f69f93575a
5
+ SHA512:
6
+ metadata.gz: fe6e20680daf956c21d850a40d7d9a58b8fb98e7a3610f869fb4715a5e860211079ac22d6dea97ced56f134e8d14786ce9a67d2497b82a6529a16d667fd21267
7
+ data.tar.gz: 8a4e40f440d6a899922f94675b9821ff704aec992dbecb77ce0ecfac1663f53410e16bdfcfff31cd557399ade9ae2d02952e80ce86401581cbe54e1e3a346c9d
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --warnings
3
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in tremolo.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Tony Pitale
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # Tremolo
2
+
3
+ InfluxDB UDP Tracker built on Celluloid::IO
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'tremolo'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install tremolo
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ # Get a tracker
23
+ tracker = Tremolo.tracker('0.0.0.0', 4444)
24
+
25
+ # options that can be set on the tracker:
26
+ # namespace, a string prefix for all series names on this tracker, joined with '.' (default="")
27
+
28
+ tracker = Tremolo.tracker('0.0.0.0', 4444, namespace: 'appname')
29
+
30
+ # Write a point to 'series-name' series
31
+ tracker.write_point('series-name', {:value => 121, :otherdata => 998142})
32
+
33
+ # Create a series for repeated tracking
34
+ series = tracker.series('series-name')
35
+
36
+ # Write multiple points to the series with this name
37
+ series.write_point({:value => 18, :otherdata => 1986})
38
+ series.write_point({:value => 82, :otherdata => 1984})
39
+ series.write_point({:value => 11, :otherdata => 1984})
40
+
41
+ # track a value of 1 to a series
42
+ tracker.increment('count.series-name')
43
+ series = tracker.series('count.series-name')
44
+ series.increment
45
+
46
+ # track a value of -1 to a series
47
+ tracker.decrement('count.series-name')
48
+ series = tracker.series('count.series-name')
49
+ series.increment
50
+
51
+ # send some timing data
52
+ tracker.timing('timing.series-name', 48) # integer for ms
53
+ series = tracker.series('timing.series-name')
54
+ series.timing(210)
55
+
56
+ # returns the result of the block, and tracks the timing into series-name
57
+ value = tracker.time('timing.series-name') { Net::HTTP.get(URI('http://google.com')) }
58
+ series = tracker.series('timing.series-name')
59
+ value = series.time { Net::HTTP.get(URI('http://google.com')) }
60
+ ```
61
+
62
+ ## Databases, Namespace and Series names
63
+
64
+ Since version 0.7.1 of InfluxDB, multiple databases can be configured for different UDP ports. All
65
+ tracking in Tremolo is done by way of UDP.
66
+
67
+ So, port 4444 from the above goes to one database as configured, and port 8191 could go to a second DB.
68
+
69
+ This somewhat negates the need for the `namespace` option to be set for a `tracker` since each application
70
+ could be configured to go to its own InfluxDB database.
71
+
72
+ **Note** If disconnected, the tracker will silently fail to send stats to InfluxDB. These stats will be lost.
73
+ It will try to send each time, though. so when the server comes back up stats will begin sending again.
74
+
75
+ Some thought should be given to the design and structure of the namespace and series name. I like to have pattern like:
76
+
77
+ * use 'count.series-names' for any individual values, such as `increment` and `decrement`
78
+ * use 'timing.series-names' for any value tracked as milliseconds
79
+
80
+ **Note** The default precision is `ms` it appears. So far there is no way to configure `time_precision` when using UDP. More info here: http://influxdb.com/docs/v0.7/api/reading_and_writing_data.html#time-precision-on-written-data
81
+
82
+ **Note** Be careful passing data to `write_point` that includes the keys `time` or `sequence_number`, they have special meaning to InfluxDB: http://influxdb.com/docs/v0.7/api/reading_and_writing_data.html#specifying-time-and-sequence-number-on-writes
83
+
84
+ ## Contributing
85
+
86
+ 1. Fork it ( https://github.com/[my-github-username]/tremolo/fork )
87
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
88
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
89
+ 4. Push to the branch (`git push origin my-new-feature`)
90
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ module Tremolo
2
+ class DataPoint
3
+ def self.from_hash(series_name, h)
4
+ new(series_name, h.reduce(:merge).keys, h)
5
+ end
6
+
7
+ attr_accessor :series_name, :columns
8
+
9
+ def initialize(series_name, columns, data)
10
+ self.series_name = series_name
11
+ self.columns = columns.sort
12
+
13
+ @data = data
14
+ end
15
+
16
+ def points
17
+ @points ||= @data.map {|h| h.values_at(*columns) }
18
+ end
19
+
20
+ def as_json
21
+ [{
22
+ name: series_name,
23
+ columns: columns,
24
+ points: points
25
+ }]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module Tremolo
2
+ class NoopTracker
3
+ def initialize(host, port, options={})
4
+ end
5
+
6
+ def series(series_name)
7
+ Series.new(self, series_name)
8
+ end
9
+
10
+ def increment(series_name);end
11
+ def decrement(series_name);end
12
+ def timing(series_name, value);end
13
+ def time(series_name, &block)
14
+ block.call
15
+ end
16
+ def write_point(series_name, data);end
17
+ def write_points(series_name, data);end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module Tremolo
2
+ class Sender
3
+ # include Celluloid::Logger
4
+ include Celluloid::IO
5
+
6
+ def initialize(host, port)
7
+ @socket = UDPSocket.new
8
+ @socket.connect(host, port) # client
9
+ end
10
+
11
+ def write_points(series_name, data)
12
+ begin
13
+ @socket.send(prepare(series_name, data), 0)
14
+ rescue Errno::ECONNREFUSED => e
15
+ # debug "Connection refused. Ignoring."
16
+ nil
17
+ end
18
+ end
19
+
20
+ private
21
+ def prepare(series_name, data)
22
+ JSON.generate(DataPoint.from_hash(series_name, data).as_json)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ module Tremolo
2
+ class Series
3
+ attr_reader :tracker, :series_name
4
+
5
+ def initialize(tracker, series_name)
6
+ @tracker, @series_name = tracker, series_name
7
+ end
8
+
9
+ def increment
10
+ write_point({value: 1})
11
+ end
12
+
13
+ def decrement
14
+ write_point({value: -1})
15
+ end
16
+
17
+ def timing(value)
18
+ write_point({value: value})
19
+ end
20
+
21
+ def time(&block)
22
+ tracker.time(series_name, &block)
23
+ end
24
+
25
+ def write_point(data)
26
+ write_points([data])
27
+ end
28
+
29
+ def write_points(data)
30
+ tracker.write_points(series_name, data)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ module Tremolo
2
+ class Tracker
3
+ def initialize(host, port, options={})
4
+ @sender = Sender.new(host, port)
5
+ end
6
+
7
+ def series(series_name)
8
+ Series.new(self, series_name)
9
+ end
10
+
11
+ def increment(series_name)
12
+ write_point(series_name, {value: 1})
13
+ end
14
+
15
+ def decrement(series_name)
16
+ write_point(series_name, {value: -1})
17
+ end
18
+
19
+ def timing(series_name, value)
20
+ write_point(series_name, {value: value})
21
+ end
22
+
23
+ def time(series_name, &block)
24
+ start = Time.now
25
+ block.call.tap do |_|
26
+ value = ((Time.now-start)*1000).round
27
+ timing(series_name, value)
28
+ end
29
+ end
30
+
31
+ def write_point(series_name, data)
32
+ write_points(series_name, [data])
33
+ end
34
+
35
+ def write_points(series_name, data)
36
+ @sender.write_points(series_name, data)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Tremolo
2
+ VERSION = "0.0.1"
3
+ end
data/lib/tremolo.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "tremolo/version"
2
+
3
+ require "json"
4
+ require "celluloid/io"
5
+
6
+ module Tremolo
7
+ def tracker(host, port, options={})
8
+ if host.nil? || port.nil?
9
+ NoopTracker.new(host, port, options)
10
+ else
11
+ Tracker.new(host, port, options)
12
+ end
13
+ end
14
+ module_function :tracker
15
+ end
16
+
17
+ require 'tremolo/data_point'
18
+ require 'tremolo/sender'
19
+ require 'tremolo/series'
20
+ require 'tremolo/tracker'
21
+ require 'tremolo/noop_tracker'
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tremolo::NoopTracker do
4
+ let(:socket) {stub(:connect => true, :send => true)}
5
+ let(:tracker) {Tremolo.tracker(nil, nil)}
6
+
7
+ before(:each) do
8
+ Celluloid::IO::UDPSocket.stubs(:new).returns(socket)
9
+ end
10
+
11
+ it 'does not send point data formatted for InfluxDB' do
12
+ tracker.write_point('accounts.created', {value: 111, associated_id: 81102})
13
+
14
+ expect(socket).to have_received(:send).never
15
+ end
16
+
17
+ it 'does not send single point with value 1' do
18
+ tracker.increment('accounts.created')
19
+
20
+ expect(socket).to have_received(:send).never
21
+ end
22
+
23
+ it 'does not send single point with value -1' do
24
+ tracker.decrement('accounts.created')
25
+
26
+ expect(socket).to have_received(:send).never
27
+ end
28
+
29
+ it 'does not track timing value' do
30
+ tracker.timing('timing.accounts.created', 89)
31
+
32
+ expect(socket).to have_received(:send).never
33
+ end
34
+
35
+ it 'does not track block timing' do
36
+ returned = tracker.time('timing.accounts.created') do
37
+ 'returning a thing'
38
+ end
39
+
40
+ expect(returned).to eq('returning a thing')
41
+ expect(socket).to have_received(:send).never
42
+ end
43
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tremolo::Tracker do
4
+ let(:socket) {stub(:connect => true, :send => true)}
5
+ let(:tracker) {Tremolo.tracker('0.0.0.0', 4444)}
6
+ let(:series) {tracker.series('accounts.created')}
7
+
8
+ before(:each) do
9
+ Celluloid::IO::UDPSocket.stubs(:new).returns(socket)
10
+ end
11
+
12
+ it 'sends point data formatted for InfluxDB' do
13
+ series.write_point({value: 111, associated_id: 81102})
14
+
15
+ json = '[{"name":"accounts.created","columns":["associated_id","value"],"points":[[81102,111]]}]'
16
+
17
+ expect(socket).to have_received(:send).with(json, 0)
18
+ end
19
+
20
+ it 'sends single point with value 1' do
21
+ series.increment
22
+
23
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[1]]}]'
24
+
25
+ expect(socket).to have_received(:send).with(json, 0)
26
+ end
27
+
28
+ it 'sends single point with value -1' do
29
+ series.decrement
30
+
31
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[-1]]}]'
32
+
33
+ expect(socket).to have_received(:send).with(json, 0)
34
+ end
35
+
36
+ it 'tracks timing value for ms' do
37
+ series.timing(89)
38
+
39
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[89]]}]'
40
+
41
+ expect(socket).to have_received(:send).with(json, 0)
42
+ end
43
+
44
+ it 'tracks block timing value for ms' do
45
+ # PREVENT Timers in Celluloid from calling Time.now all the time
46
+ Timers.any_instance.stubs(:wait_interval).returns(nil)
47
+
48
+ start_at = Time.now
49
+ end_at = start_at + 1.05 # 1013.5 ms, rounds to 1014
50
+
51
+ Time.stubs(:now).returns(start_at, end_at)
52
+
53
+ returned = series.time do
54
+ 'returning another thing'
55
+ end
56
+
57
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[1050]]}]'
58
+
59
+ expect(returned).to eq('returning another thing')
60
+ expect(socket).to have_received(:send).with(json, 0)
61
+ end
62
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tremolo::Tracker do
4
+ let(:socket) {stub(:connect => true, :send => true)}
5
+ let(:tracker) {Tremolo.tracker('0.0.0.0', 4444)}
6
+
7
+ before(:each) do
8
+ Celluloid::IO::UDPSocket.stubs(:new).returns(socket)
9
+ end
10
+
11
+ it 'sends point data formatted for InfluxDB' do
12
+ tracker.write_point('accounts.created', {value: 111, associated_id: 81102})
13
+
14
+ json = '[{"name":"accounts.created","columns":["associated_id","value"],"points":[[81102,111]]}]'
15
+
16
+ expect(socket).to have_received(:send).with(json, 0)
17
+ end
18
+
19
+ it 'sends single point with value 1' do
20
+ tracker.increment('accounts.created')
21
+
22
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[1]]}]'
23
+
24
+ expect(socket).to have_received(:send).with(json, 0)
25
+ end
26
+
27
+ it 'sends single point with value -1' do
28
+ tracker.decrement('accounts.created')
29
+
30
+ json = '[{"name":"accounts.created","columns":["value"],"points":[[-1]]}]'
31
+
32
+ expect(socket).to have_received(:send).with(json, 0)
33
+ end
34
+
35
+ it 'tracks timing value for ms' do
36
+ tracker.timing('timing.accounts.created', 89)
37
+
38
+ json = '[{"name":"timing.accounts.created","columns":["value"],"points":[[89]]}]'
39
+
40
+ expect(socket).to have_received(:send).with(json, 0)
41
+ end
42
+
43
+ it 'tracks block timing value for ms' do
44
+ # PREVENT Timers in Celluloid from calling Time.now all the time
45
+ Timers.any_instance.stubs(:wait_interval).returns(nil)
46
+
47
+ start_at = Time.now
48
+ end_at = start_at + 1.0135 # 1013.5 ms, rounds to 1014
49
+
50
+ Time.stubs(:now).returns(start_at, end_at)
51
+
52
+ returned = tracker.time('timing.accounts.created') do
53
+ 'returning a thing'
54
+ end
55
+
56
+ json = '[{"name":"timing.accounts.created","columns":["value"],"points":[[1014]]}]'
57
+
58
+ expect(returned).to eq('returning a thing')
59
+ expect(socket).to have_received(:send).with(json, 0)
60
+ end
61
+ end
@@ -0,0 +1,15 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'bundler/setup'
5
+
6
+ require 'rspec'
7
+ require 'mocha/api'
8
+ require 'bourne'
9
+
10
+ require File.expand_path('../../lib/tremolo', __FILE__)
11
+
12
+ RSpec.configure do |config|
13
+ config.mock_with :mocha
14
+ config.order = 'random'
15
+ end
data/tremolo.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tremolo/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tremolo"
8
+ spec.version = Tremolo::VERSION
9
+ spec.authors = ["Tony Pitale"]
10
+ spec.email = ["tpitale@gmail.com"]
11
+ spec.summary = %q{InfluxDB UDP Tracker built on Celluloid::IO}
12
+ spec.description = %q{InfluxDB UDP Tracker built on Celluloid::IO}
13
+ spec.homepage = "https://github.com/tpitale/tremolo"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "celluloid-io", ">= 0.15.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ spec.add_development_dependency "mocha"
27
+ spec.add_development_dependency "bourne"
28
+ spec.add_development_dependency "simplecov"
29
+ end
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tremolo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tony Pitale
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: celluloid-io
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.15.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.15.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
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: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
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'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bourne
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: InfluxDB UDP Tracker built on Celluloid::IO
112
+ email:
113
+ - tpitale@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".ruby-version"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - lib/tremolo.rb
126
+ - lib/tremolo/data_point.rb
127
+ - lib/tremolo/noop_tracker.rb
128
+ - lib/tremolo/sender.rb
129
+ - lib/tremolo/series.rb
130
+ - lib/tremolo/tracker.rb
131
+ - lib/tremolo/version.rb
132
+ - spec/lib/tremolo/noop_tracker_spec.rb
133
+ - spec/lib/tremolo/series_spec.rb
134
+ - spec/lib/tremolo/tracker_spec.rb
135
+ - spec/spec_helper.rb
136
+ - tremolo.gemspec
137
+ homepage: https://github.com/tpitale/tremolo
138
+ licenses:
139
+ - MIT
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.2.2
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: InfluxDB UDP Tracker built on Celluloid::IO
161
+ test_files:
162
+ - spec/lib/tremolo/noop_tracker_spec.rb
163
+ - spec/lib/tremolo/series_spec.rb
164
+ - spec/lib/tremolo/tracker_spec.rb
165
+ - spec/spec_helper.rb