tremolo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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