lookout-statsd 0.7.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjhiMDk4OTZmNWJkNjgzZmVhMGU5YzgxYzA4ZjZkYTExM2ZiZWRlMw==
5
+ data.tar.gz: !binary |-
6
+ NGFmMzljMDhhZTE2MzkzYzZhYTJjZTBhYmFlYjE4MjNjY2I2ZTc2ZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YWQwNmUzMTIwZjkwNGFkNzRjNDQ2YjEyNTA5ZGVhOGJkOTZkYTBjMmJhZjkz
10
+ YWY1MzUzMzVlZGI1OWY4OTBkNTIxODhhNmQ4MDMyZjU3OGYwNTdhZjRjMTZl
11
+ N2RjZjQxN2RiYzdhN2EwYTEzMDgxZDU0NTM1YzliMjNlYjc3YTc=
12
+ data.tar.gz: !binary |-
13
+ YWI2ODM0NzUxODhmNjZkYzAxNWU5NGNjOTRlNmQ2ZmY0MDc5NDUyOGFlNjUw
14
+ MTE2ZDgwMTgwYThiNzgwYWNmY2RkMzE3OWQ0MTVlZWI1ZWQyYzYwMjMzNDEw
15
+ ZThiMjRhZDVkZmUwOGJmZTczNDRhY2UxNDIxOWM2OTJiMmRhNDY=
data/.gitignore CHANGED
@@ -1,3 +1,7 @@
1
1
  /pkg
2
2
  .rvmrc
3
+ .ruby-version
4
+ .ruby-gemset
3
5
  Gemfile.lock
6
+ tmp
7
+ tmp/*
data/Gemfile CHANGED
@@ -11,6 +11,11 @@ group :test do
11
11
 
12
12
  gem "rspec"
13
13
  gem "cucumber"
14
+
15
+ gem 'guard', "< 2.0"
16
+ gem 'guard-rspec', "< 4.0"
17
+ gem 'pry'
14
18
  end
15
19
 
20
+
16
21
  gemspec
data/Guardfile ADDED
@@ -0,0 +1,24 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec, :cli => '--color --format nested --fail-fast' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
+ watch('config/routes.rb') { "spec/routing" }
15
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
+
17
+ # Capybara features specs
18
+ watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
19
+
20
+ # Turnip features and steps
21
+ watch(%r{^spec/acceptance/(.+)\.feature$})
22
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
23
+ end
24
+
data/bin/statsd CHANGED
@@ -3,6 +3,8 @@
3
3
  $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
4
4
  require 'yaml'
5
5
  require 'optparse'
6
+ require 'rubygems'
7
+ require 'pry'
6
8
 
7
9
  begin
8
10
  ORIGINAL_ARGV = ARGV.dup
@@ -15,7 +17,7 @@ begin
15
17
  opts.separator "Options:"
16
18
 
17
19
  opts.on("-cCONFIG", "--config-file CONFIG", "Configuration file") do |x|
18
- options[:config] = x
20
+ options[:config_file] = x
19
21
  end
20
22
 
21
23
  opts.on("-h", "--help", "Show this message") do
@@ -27,12 +29,11 @@ begin
27
29
  parser.parse!
28
30
 
29
31
  # dispatch
30
- if !options[:config]
32
+ if !options[:config_file]
31
33
  puts parser.help
32
34
  else
33
35
  require 'statsd'
34
- require 'statsd/server'
35
- Statsd::Server::Daemon.new.run(options)
36
+ Statsd::Daemon.new.run(options)
36
37
  end
37
38
  rescue Exception => e
38
39
  if e.instance_of?(SystemExit)
data/config.yml CHANGED
@@ -1,10 +1,25 @@
1
1
  ---
2
+ # Accept incoming Statsd UDP messages.
2
3
  bind: 127.0.0.1
3
4
  port: 8125
4
5
 
5
6
  # Flush interval should be your finest retention in seconds
6
- flush_interval: 10
7
+ flush_interval: 5
7
8
 
8
9
  # Graphite
9
10
  graphite_host: localhost
10
11
  graphite_port: 2003
12
+
13
+ # Forwarding sends copies of incoming UDP statsd messages to other
14
+ # destinations.
15
+ # This allows for bundling of many senders into one UDP flow/stream, or
16
+ # directs stats to redundant carbon caches.
17
+ #
18
+ forwarding: true
19
+ forwarding_socket_lifetime: 10
20
+ # Example destinations:
21
+ forwarding_destinations:
22
+ - hostname: localhost
23
+ port: 9000
24
+ - hostname: 127.0.0.1
25
+ port: 9001
data/lib/statsd.rb CHANGED
@@ -1,5 +1,10 @@
1
1
  require 'socket'
2
2
  require 'resolv'
3
+ require 'statsd/daemon'
4
+ require 'statsd/graphite'
5
+ require 'statsd/aggregator'
6
+ require 'statsd/forwarder'
7
+ require 'statsd/test'
3
8
 
4
9
  module Statsd
5
10
  # initialize singleton instance in an initializer
@@ -116,7 +121,9 @@ module Statsd
116
121
  # use "around_filter Statsd::Rails::ActionTimerFilter"
117
122
  class ActionTimerFilter
118
123
  def self.filter(controller, &block)
119
- key = "requests.#{controller.controller_name}.#{controller.params[:action]}"
124
+ # Use params[:controller] insted of controller.controller_name to get full path.
125
+ controller_name = controller.params[:controller].gsub("/", ".")
126
+ key = "requests.#{controller_name}.#{controller.params[:action]}"
120
127
  Statsd.instance.timing(key, &block)
121
128
  end
122
129
  end
@@ -1,11 +1,5 @@
1
- require 'eventmachine'
2
- require 'yaml'
3
- require 'erb'
4
-
5
- require 'statsd/graphite'
6
-
7
1
  module Statsd
8
- module Server
2
+ module Aggregator
9
3
  Version = '0.5.5'
10
4
 
11
5
  FLUSH_INTERVAL = 10
@@ -27,7 +21,7 @@ module Statsd
27
21
  [counters,timers,gauges]
28
22
  end
29
23
 
30
- def receive_data(msg)
24
+ def self.receive_data(msg)
31
25
  msg.split("\n").each do |row|
32
26
  bits = row.split(':')
33
27
  key = bits.shift.gsub(/\s+/, '_').gsub(/\//, '-').gsub(/[^a-zA-Z_\-0-9\.]/, '')
@@ -55,28 +49,5 @@ module Statsd
55
49
  end
56
50
  end
57
51
 
58
- class Daemon
59
- def run(options)
60
- config = YAML::load(ERB.new(IO.read(options[:config])).result)
61
-
62
- EventMachine::run do
63
- EventMachine::open_datagram_socket(config['bind'], config['port'], Statsd::Server)
64
- puts "Listening on #{config['bind']}:#{config['port']}"
65
-
66
- # Periodically Flush
67
- EventMachine::add_periodic_timer(config['flush_interval']) do
68
- counters,timers = Statsd::Server.get_and_clear_stats!
69
-
70
- EventMachine.connect config['graphite_host'], config['graphite_port'], Statsd::Graphite do |conn|
71
- conn.counters = counters
72
- conn.timers = timers
73
- conn.flush_interval = config['flush_interval']
74
- conn.flush_stats
75
- end
76
- end
77
- end
78
- end
79
- end
80
-
81
52
  end
82
53
  end
@@ -0,0 +1,78 @@
1
+ require 'eventmachine'
2
+ require 'yaml'
3
+ require 'erb'
4
+
5
+ module Statsd
6
+ class MessageDispatchDaemon < EventMachine::Connection
7
+ # Methods to be called when a statsd message comes in.
8
+ @@receivers = []
9
+ # Register a Module implementing an EventMachine::Connection -like
10
+ # interface.
11
+ #
12
+ # receive_data methods on all registered modules will get called, but for
13
+ # any other EM::Connection methods, the last registered module/method will
14
+ # take precedence.
15
+ def self.register_receiver(mod)
16
+ begin
17
+ method = mod.method('receive_data')
18
+ @@receivers << method unless @@receivers.include?(method)
19
+ rescue NameError
20
+ raise ArgumentError.new("The passed module #{mod} doesn't implement a receive_data method.")
21
+ end
22
+ include mod
23
+ end
24
+ def self.receivers=(list)
25
+ raise ArgumentError unless list.is_a?(Array)
26
+ @@receivers = list
27
+ end
28
+ def self.receivers
29
+ @@receivers
30
+ end
31
+ def receive_data(msg)
32
+ @@receivers.each do |method|
33
+ method.call(msg)
34
+ end
35
+ end
36
+ end
37
+ class Daemon
38
+ def run(options)
39
+ config = if options[:config] and options[:config].is_a?(Hash)
40
+ options[:config]
41
+ elsif options[:config_file] and options[:config_file].is_a?(String)
42
+ YAML::load(ERB.new(IO.read(options[:config_file])).result)
43
+ end
44
+
45
+ EventMachine::run do
46
+ ## statsd->graphite aggregation
47
+ if config['graphite_host']
48
+ MessageDispatchDaemon.register_receiver(Statsd::Aggregator)
49
+ EventMachine::add_periodic_timer(config['flush_interval']) do
50
+ counters,timers = Statsd::Aggregator.get_and_clear_stats!
51
+ EventMachine.connect config['graphite_host'], config['graphite_port'], Statsd::Graphite do |conn|
52
+ conn.counters = counters
53
+ conn.timers = timers
54
+ conn.flush_interval = config['flush_interval']
55
+ conn.flush_stats
56
+ end
57
+ end
58
+ ##
59
+
60
+ ## statsd->statsd data relay
61
+ if config['forwarding']
62
+ Statsd::Forwarder.set_destinations(config['forwarding_destinations'])
63
+ MessageDispatchDaemon.register_receiver(Statsd::Forwarder)
64
+
65
+ Statsd::Forwarder.build_fresh_sockets
66
+ EventMachine::add_periodic_timer(config['forwarding_socket_lifetime']) do
67
+ Statsd::Forwarder.build_fresh_sockets
68
+ end
69
+ end
70
+ ##
71
+
72
+ puts "Going to listen on #{config['bind']}:#{config['port']}"
73
+ EventMachine::open_datagram_socket(config['bind'], config['port'], MessageDispatchDaemon)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,52 @@
1
+ require 'socket'
2
+
3
+ module Statsd
4
+ module Forwarder
5
+ @@sockets = {}
6
+ @@destinations = []
7
+
8
+ def self.sockets; @@sockets; end
9
+ def self.sockets=(hash)
10
+ raise ArgumentError unless hash.is_a?(Hash)
11
+ @@sockets = hash
12
+ end
13
+ def self.destinations; @@destinations; end
14
+ def self.destinations=(list)
15
+ raise ArgumentError unless list.is_a?(Array)
16
+ @@destinations = list
17
+ end
18
+
19
+ def self.receive_data(msg)
20
+ # Broadcast the incoming message to all the forwarding destinations.
21
+ @@sockets.each do |destination, socket|
22
+ begin
23
+ socket.send(msg, 0)
24
+ rescue SocketError, Errno::ECONNREFUSED => e
25
+ puts "ERROR: Couldn't send message to #{destination}. Stopping this output.(#{e.inspect})"
26
+ @@sockets.delete(destination)
27
+ end
28
+ end
29
+ end
30
+ def self.build_fresh_sockets
31
+ # Reset destinations to those destinations for which we could
32
+ # actually get a socket going.
33
+ @@sockets.clear
34
+ @@destinations = @@destinations.select do |destination|
35
+ begin
36
+ s = UDPSocket.new(Socket::AF_INET)
37
+ s.connect destination['hostname'], destination['port']
38
+ @@sockets[destination] = s
39
+ true
40
+ rescue SocketError => e
41
+ puts "ERROR: Couldn't create a socket to #{destination['hostname']}/#{destination['port']}. Pruning destination from Forwarder. (#{e.inspect})"
42
+ false
43
+ end
44
+ end
45
+ end
46
+ def self.set_destinations(destinations)
47
+ raise ArgumentError unless destinations.is_a?(Array)
48
+ raise ArgumentError unless destinations.map { |d| d.keys }.flatten.uniq.sort == ['hostname', 'port']
49
+ @@destinations = destinations
50
+ end
51
+ end
52
+ end
data/lib/statsd/test.rb CHANGED
@@ -1,3 +1,3 @@
1
- require './graphite'
1
+ require 'statsd'
2
2
  counters = timers = []
3
3
  #Statsd::Graphite.flush_stats(counters,timers)
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,3 @@
1
1
  $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
2
 
3
3
  require 'statsd'
4
- require 'statsd/server'
@@ -1,15 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
-
4
- describe Statsd::Server do
5
- include Statsd::Server
3
+ describe Statsd::Aggregator do
4
+ #include Statsd::Aggregator
6
5
 
7
6
  describe :receive_data do
8
7
  it 'should not vomit on bad data' do
9
8
  bad_data = "dev.rwygand.app.flexd.exception.no action responded to index. actions: authenticate, authentication_request, authorization, bubble_stacktrace?, decode_credentials, encode_credentials, not_found, and user_name_and_password:1|c"
10
9
 
11
10
  expect {
12
- receive_data(bad_data)
11
+ Statsd::Aggregator.receive_data(bad_data)
13
12
  }.not_to raise_error
14
13
  end
15
14
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statsd::Daemon do
4
+ describe :new do
5
+ before(:each) do
6
+ EventMachine.should_receive(:run) { |&block| block.call }
7
+ EventMachine.should_receive(:open_datagram_socket).and_return true
8
+ EventMachine.should_receive(:add_periodic_timer).at_least(:once) { |delay, &block| block.call }
9
+ EventMachine.should_receive(:connect).and_return true
10
+ Statsd::MessageDispatchDaemon.receivers = []
11
+ end
12
+
13
+ it 'Should extend MessageDispatchDaemon with an Aggregator if "carbon_cache" is configured' do
14
+ config = {
15
+ "bind"=>"127.0.0.1",
16
+ "port"=>8125,
17
+ "flush_interval"=>5,
18
+ "graphite_host"=>"localhost",
19
+ "graphite_port"=>2003,
20
+ "forwarding"=>false,
21
+ }
22
+
23
+ Statsd::Daemon.new.run(:config => config)
24
+ Statsd::MessageDispatchDaemon.receivers.should eq([Statsd::Aggregator.method(:receive_data)])
25
+ end
26
+
27
+ it 'Should extend MessageDispatchDaemon with an Aggregator and Forwarder if "carbon_cache" is configured and forwarding is enabled' do
28
+ config = {
29
+ "bind"=>"127.0.0.1",
30
+ "port"=>8125,
31
+ "flush_interval"=>5,
32
+ "graphite_host"=>"localhost",
33
+ "graphite_port"=>2003,
34
+ "forwarding"=>true,
35
+ "forwarding_destinations"=>
36
+ [
37
+ {"port"=>9000, "hostname"=>"localhost"},
38
+ {"port"=>9001, "hostname"=>"127.0.0.1"}
39
+ ]
40
+ }
41
+
42
+ Statsd::Daemon.new.run(:config => config)
43
+ Statsd::MessageDispatchDaemon.receivers.should eq([Statsd::Aggregator.method(:receive_data), Statsd::Forwarder.method(:receive_data)])
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'timeout'
3
+
4
+ describe Statsd::Forwarder do
5
+ let(:destinations) do
6
+ [ {'hostname'=>'localhost', 'port'=>9000},
7
+ {'hostname'=>'127.0.0.1', 'port'=>9001} ]
8
+ end
9
+ before(:each) do
10
+ Statsd::Forwarder.sockets = {}
11
+ expect { Statsd::Forwarder.set_destinations(destinations) }.not_to raise_error
12
+ end
13
+ it 'Should accept a list of destinations to forward to.' do
14
+ Statsd::Forwarder.destinations.should eq(destinations)
15
+ end
16
+ it 'Should create sockets to the destinations with #build_fresh_sockets' do
17
+ Statsd::Forwarder.sockets.should eq({})
18
+ Statsd::Forwarder.build_fresh_sockets
19
+ Statsd::Forwarder.sockets.should be_a_kind_of(Hash)
20
+ Statsd::Forwarder.sockets.keys.length.should eq(destinations.length)
21
+ Statsd::Forwarder.sockets.values.each { |socket| socket.should be_a_kind_of(UDPSocket) }
22
+ end
23
+ describe 'Replicating incoming messages' do
24
+ let(:socket_one) do
25
+ u = UDPSocket.new
26
+ u.bind('127.0.0.1', 0)
27
+ #let(:socket_one_port) { u.local_address.ip_port }
28
+ u
29
+ end
30
+ let(:socket_two) do
31
+ u = UDPSocket.new
32
+ u.bind('127.0.0.1', 0)
33
+ u
34
+ end
35
+ let(:test_stat) { "app.thing.speed:10|ms\n" }
36
+ it 'Registers two local receivers, Gets an incoming message, both receivers get it' do
37
+ Statsd::Forwarder.set_destinations([{'hostname' => '127.0.0.1', 'port' => socket_one.addr[1] },
38
+ {'hostname' => '127.0.0.1', 'port' => socket_two.addr[1] }])
39
+ Statsd::Forwarder.build_fresh_sockets
40
+ Statsd::Forwarder.receive_data(test_stat)
41
+
42
+ Timeout.timeout(3) do
43
+ msg, _, _ = socket_one.recv(4_096)
44
+ msg.should eq(test_stat)
45
+
46
+ msg, _, _ = socket_two.recv(4_096)
47
+ msg.should eq(test_stat)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statsd::Rails::ActionTimerFilter do
4
+
5
+ describe ".filter" do
6
+ before(:all) do
7
+ Statsd.create_instance
8
+ end
9
+
10
+ it "should log the appropriate data with simple controller" do
11
+ controller = mock_controller('control', 'act')
12
+ Statsd.instance.should_receive(:timing).with("requests.control.act")
13
+ Statsd::Rails::ActionTimerFilter.filter(controller) {}
14
+ end
15
+
16
+ it "should log the appropriate data with complex controller" do
17
+ controller = mock_controller('api/v1/control', 'act')
18
+ Statsd.instance.should_receive(:timing).with("requests.api.v1.control.act")
19
+ Statsd::Rails::ActionTimerFilter.filter(controller) {}
20
+ end
21
+ end
22
+
23
+ # Create a mock controller with the given name and action
24
+ def mock_controller(name, action)
25
+ controller = double("MyController")
26
+ params = {
27
+ :controller => name,
28
+ :action => action,
29
+ }
30
+ controller.stub(:params).and_return(params)
31
+ controller
32
+ end
33
+ end
data/stats.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  require 'eventmachine'
2
2
  require 'statsd'
3
- require 'statsd/server'
4
- require 'statsd/graphite'
5
3
 
6
4
  require 'yaml'
7
5
  require 'erb'
@@ -11,9 +9,9 @@ APP_CONFIG = YAML::load(ERB.new(IO.read(File.join(ROOT,'config.yml'))).result)
11
9
 
12
10
  # Start the server
13
11
  EventMachine::run do
14
- EventMachine::open_datagram_socket('127.0.0.1', 8125, Statsd::Server)
12
+ EventMachine::open_datagram_socket('127.0.0.1', 8125, Statsd::Aggregator)
15
13
  EventMachine::add_periodic_timer(APP_CONFIG['flush_interval']) do
16
- counters,timers = Statsd::Server.get_and_clear_stats!
14
+ counters,timers = Statsd::Aggregator.get_and_clear_stats!
17
15
 
18
16
  # Graphite
19
17
  EventMachine.connect APP_CONFIG['graphite_host'], APP_CONFIG['graphite_port'], Statsd::Graphite do |conn|
@@ -23,6 +21,4 @@ EventMachine::run do
23
21
  conn.flush_stats
24
22
  end
25
23
  end
26
-
27
-
28
24
  end
data/statsd.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "lookout-statsd"
5
- s.version = "0.7.1"
5
+ s.version = "0.9.0"
6
6
  s.platform = Gem::Platform::RUBY
7
7
 
8
8
  s.authors = ['R. Tyler Croy', 'Andrew Coldham', 'Ben VandenBos']
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.required_rubygems_version = ">= 1.3.6"
16
16
 
17
- s.add_dependency "eventmachine", ">= 0.12.10"
17
+ s.add_dependency "eventmachine", ">= 0.12.10", "< 0.15.2"
18
18
  s.add_dependency "erubis", ">= 2.6.6"
19
19
 
20
20
  s.files = `git ls-files`.split("\n")
metadata CHANGED
@@ -1,117 +1,104 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: lookout-statsd
3
- version: !ruby/object:Gem::Version
4
- hash: 1
5
- prerelease:
6
- segments:
7
- - 0
8
- - 7
9
- - 1
10
- version: 0.7.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - R. Tyler Croy
14
8
  - Andrew Coldham
15
9
  - Ben VandenBos
16
10
  autorequire:
17
11
  bindir: bin
18
12
  cert_chain: []
19
-
20
- date: 2013-05-14 00:00:00 Z
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- type: :runtime
13
+ date: 2013-12-04 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
24
16
  name: eventmachine
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 59
31
- segments:
32
- - 0
33
- - 12
34
- - 10
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
35
21
  version: 0.12.10
36
- requirement: *id001
37
- prerelease: false
38
- - !ruby/object:Gem::Dependency
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: 0.15.2
39
25
  type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: 0.12.10
32
+ - - <
33
+ - !ruby/object:Gem::Version
34
+ version: 0.15.2
35
+ - !ruby/object:Gem::Dependency
40
36
  name: erubis
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- hash: 27
47
- segments:
48
- - 2
49
- - 6
50
- - 6
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
51
41
  version: 2.6.6
52
- requirement: *id002
42
+ type: :runtime
53
43
  prerelease: false
54
- description: A network daemon for aggregating statistics (counters and timers), rolling them up, then sending them to graphite.
55
- email:
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: 2.6.6
49
+ description: A network daemon for aggregating statistics (counters and timers), rolling
50
+ them up, then sending them to graphite.
51
+ email:
56
52
  - rtyler.croy@mylookout.com
57
- executables:
53
+ executables:
58
54
  - statsd
59
55
  extensions: []
60
-
61
56
  extra_rdoc_files: []
62
-
63
- files:
57
+ files:
64
58
  - .gitignore
65
59
  - Gemfile
60
+ - Guardfile
66
61
  - README.md
67
62
  - Rakefile
68
63
  - bin/statsd
69
64
  - config.yml
70
65
  - lib/statsd.rb
66
+ - lib/statsd/aggregator.rb
67
+ - lib/statsd/daemon.rb
71
68
  - lib/statsd/echos.rb
69
+ - lib/statsd/forwarder.rb
72
70
  - lib/statsd/graphite.rb
73
- - lib/statsd/server.rb
74
71
  - lib/statsd/test.rb
75
72
  - netcat-example.sh
76
73
  - spec/spec_helper.rb
77
- - spec/statsd/server_spec.rb
74
+ - spec/statsd/aggregator_spec.rb
75
+ - spec/statsd/daemon_spec.rb
76
+ - spec/statsd/forwarder_spec.rb
77
+ - spec/statsd/rails/action_timer_filter_spec.rb
78
78
  - spec/statsd_spec.rb
79
79
  - stats.rb
80
80
  - statsd.gemspec
81
81
  homepage: https://github.com/lookout/statsd
82
82
  licenses: []
83
-
83
+ metadata: {}
84
84
  post_install_message:
85
85
  rdoc_options: []
86
-
87
- require_paths:
86
+ require_paths:
88
87
  - lib
89
- required_ruby_version: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- hash: 3
95
- segments:
96
- - 0
97
- version: "0"
98
- required_rubygems_version: !ruby/object:Gem::Requirement
99
- none: false
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- hash: 23
104
- segments:
105
- - 1
106
- - 3
107
- - 6
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
108
97
  version: 1.3.6
109
98
  requirements: []
110
-
111
99
  rubyforge_project:
112
- rubygems_version: 1.8.25
100
+ rubygems_version: 2.1.11
113
101
  signing_key:
114
- specification_version: 3
102
+ specification_version: 4
115
103
  summary: Ruby version of statsd.
116
104
  test_files: []
117
-