ffwd-statsd 0.1.6 → 0.1.7

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.
@@ -19,25 +19,57 @@ require 'ffwd/connection'
19
19
  require_relative 'parser'
20
20
 
21
21
  module FFWD::Plugin::Statsd
22
- class Connection < FFWD::Connection
23
- include FFWD::Logging
24
-
25
- def self.plugin_type
26
- "statsd_in"
22
+ module Connection
23
+ module ConnectionBase
24
+ def receive_statsd_frame(data)
25
+ metric = Parser.parse(data)
26
+ return if metric.nil?
27
+ @core.input.metric metric
28
+ @bind.increment :received_metrics
29
+ rescue ParserError => e
30
+ log.error "Invalid frame '#{data}': #{e}"
31
+ @bind.increment :failed_metrics
32
+ rescue => e
33
+ log.error "Error when parsing metric '#{data}'", e
34
+ @bind.increment :failed_metrics
35
+ end
27
36
  end
28
37
 
29
- def initialize bind, core
30
- @bind = bind
31
- @core = core
38
+ class UDP < FFWD::Connection
39
+ include ConnectionBase
40
+ include FFWD::Logging
41
+
42
+ def initialize bind, core
43
+ @bind = bind
44
+ @core = core
45
+ end
46
+
47
+ def self.plugin_type
48
+ "statsd_udp_in"
49
+ end
50
+
51
+ def receive_data data
52
+ receive_statsd_frame data
53
+ end
32
54
  end
33
55
 
34
- def receive_data(data)
35
- metric = Parser.parse(data)
36
- return if metric.nil?
37
- @core.input.metric metric
38
- @bind.increment :received_metrics
39
- rescue => e
40
- log.error "Failed to receive data", e
56
+ class TCP < FFWD::Connection
57
+ include ConnectionBase
58
+ include FFWD::Logging
59
+ include EM::Protocols::LineText2
60
+
61
+ def initialize bind, core
62
+ @bind = bind
63
+ @core = core
64
+ end
65
+
66
+ def self.plugin_type
67
+ "statsd_tcp_in"
68
+ end
69
+
70
+ def receive_line(data)
71
+ receive_statsd_frame data
72
+ end
41
73
  end
42
74
  end
43
75
  end
@@ -14,9 +14,12 @@
14
14
  # the License.
15
15
 
16
16
  module FFWD::Plugin::Statsd
17
+ class ParserError < Exception; end
18
+
17
19
  module Parser
18
20
  COUNT = "count"
19
21
  HISTOGRAM = "histogram"
22
+ RATE = "rate"
20
23
 
21
24
  def self.gauge name, value
22
25
  {:proc => nil, :key => name, :value => value}
@@ -26,21 +29,39 @@ module FFWD::Plugin::Statsd
26
29
  {:proc => COUNT, :key => name, :value => value}
27
30
  end
28
31
 
32
+ def self.meter name, value
33
+ {:proc => RATE, :key => name, :value => value}
34
+ end
35
+
29
36
  def self.timing name, value
30
37
  {:proc => HISTOGRAM, :key => name, :value => value}
31
38
  end
32
39
 
33
- def self.parse line
34
- name, value = line.split ':', 2
35
- raise "invalid frame" if value.nil?
36
- value, type = value.split '|', 2
37
- raise "invalid frame" if type.nil?
38
- type, sample_rate = type.split '|@', 2
40
+ def self.parse m
41
+ name, value = m.split ':', 2
42
+
43
+ if value.nil?
44
+ raise ParserError.new("Missing value")
45
+ end
46
+
47
+ value, type_block = value.split '|', 2
48
+
49
+ if type_block.nil?
50
+ raise ParserError.new("Missing type")
51
+ end
39
52
 
40
- return nil if type.nil? or type.empty?
41
- return nil if value.nil? or value.empty?
53
+ type, sample_rate = type_block.split '|@', 2
54
+
55
+ if type.nil? or type.empty?
56
+ raise ParserError.new("Missing type")
57
+ end
58
+
59
+ if value.nil? or value.empty?
60
+ raise ParserError.new("Missing value")
61
+ end
62
+
63
+ value = value.to_f
42
64
 
43
- value = value.to_f unless value.nil?
44
65
  sample_rate = sample_rate.to_f unless sample_rate.nil?
45
66
 
46
67
  value /= sample_rate unless sample_rate.nil?
@@ -53,12 +74,16 @@ module FFWD::Plugin::Statsd
53
74
  return count(name, value)
54
75
  end
55
76
 
56
- if type == "ms"
77
+ if type == "m"
78
+ return meter(name, value)
79
+ end
80
+
81
+ if type == "ms" or type == "h"
57
82
  return timing(name, value)
58
83
  end
59
84
 
60
- log.warning "Not supported type: #{type}"
61
- return nil
85
+ raise ParserError.new(
86
+ "Received message of unsupported type '#{type}'")
62
87
  end
63
88
  end
64
89
  end
@@ -16,7 +16,7 @@
16
16
  module FFWD
17
17
  module Plugin
18
18
  module Statsd
19
- VERSION = "0.1.6"
19
+ VERSION = "0.1.7"
20
20
  end
21
21
  end
22
22
  end
@@ -28,16 +28,28 @@ module FFWD::Plugin::Statsd
28
28
  DEFAULT_HOST = "localhost"
29
29
  DEFAULT_PORT = 8125
30
30
 
31
+ INPUTS = {:tcp => Connection::TCP, :udp => Connection::UDP}
32
+
31
33
  def self.setup_input opts, core
32
34
  opts[:host] ||= DEFAULT_HOST
33
35
  opts[:port] ||= DEFAULT_PORT
34
36
  protocol = FFWD.parse_protocol(opts[:protocol] || "udp")
35
- protocol.bind opts, core, log, Connection
37
+
38
+ unless connection = INPUTS[protocol.family]
39
+ raise "No connection for protocol family: #{protocol.family}"
40
+ end
41
+
42
+ protocol.bind opts, core, log, connection
36
43
  end
37
44
 
38
45
  def self.setup_tunnel opts, core, tunnel
39
46
  opts[:port] ||= DEFAULT_PORT
40
47
  protocol = FFWD.parse_protocol(opts[:protocol] || "tcp")
41
- protocol.tunnel opts, core, tunnel, log, Connection
48
+
49
+ unless connection = INPUTS[protocol.family]
50
+ raise "No connection for protocol family: #{protocol.family}"
51
+ end
52
+
53
+ protocol.tunnel opts, core, tunnel, log, connection
42
54
  end
43
55
  end
metadata CHANGED
@@ -1,32 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffwd-statsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - John-John Tedro
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-04-29 00:00:00.000000000 Z
12
+ date: 2014-05-30 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: ffwd
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - ! '>='
19
+ - - '='
18
20
  - !ruby/object:Gem::Version
19
- version: '0'
21
+ version: 0.1.7
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - ! '>='
27
+ - - '='
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: 0.1.7
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rspec
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rspec-mocks
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ! '>='
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
@@ -59,32 +66,33 @@ executables: []
59
66
  extensions: []
60
67
  extra_rdoc_files: []
61
68
  files:
69
+ - lib/ffwd/plugin/statsd.rb
62
70
  - lib/ffwd/plugin/statsd/version.rb
63
71
  - lib/ffwd/plugin/statsd/parser.rb
64
72
  - lib/ffwd/plugin/statsd/connection.rb
65
- - lib/ffwd/plugin/statsd.rb
66
73
  homepage: https://github.com/spotify/ffwd
67
74
  licenses:
68
75
  - Apache 2.0
69
- metadata: {}
70
76
  post_install_message:
71
77
  rdoc_options: []
72
78
  require_paths:
73
79
  - lib
74
80
  required_ruby_version: !ruby/object:Gem::Requirement
81
+ none: false
75
82
  requirements:
76
83
  - - ! '>='
77
84
  - !ruby/object:Gem::Version
78
85
  version: '0'
79
86
  required_rubygems_version: !ruby/object:Gem::Requirement
87
+ none: false
80
88
  requirements:
81
89
  - - ! '>='
82
90
  - !ruby/object:Gem::Version
83
91
  version: '0'
84
92
  requirements: []
85
93
  rubyforge_project:
86
- rubygems_version: 2.0.3
94
+ rubygems_version: 1.8.23
87
95
  signing_key:
88
- specification_version: 4
96
+ specification_version: 3
89
97
  summary: StatsD support for FFWD.
90
98
  test_files: []
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MTQ4OGUwYzIwMDE0ZWYwNDA3NzkxYmQwNWI4NDEyYTM2NTQ2MzUzMA==
5
- data.tar.gz: !binary |-
6
- ODcwY2UwZjU5Y2Q5MTJmMWYzNDk2Yjc2MDBiMDYzM2U4OGNhY2E3NA==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZWUyMzc5MDRlZTE0YWE5YWRmYmFjNWVlY2MzZjkxNDdmZWRmY2MyMGFkYjc5
10
- MDUzMjA5MDU0MDhmMmI5MWNlMTBjNDE4NzRjYTU1YjZhZTViMDBlY2QxMWI0
11
- NDk3MTdhYjJjOWIwZTM0NmMzMjkwZmNiYmY2OWYxZmUwNTBjOWU=
12
- data.tar.gz: !binary |-
13
- ZTJlZGExNDA0MjAyOGFlZWY1NTVjMGViYzBiYmQ3YTAwNjVkNDU3NTM2NTY5
14
- YjJlZGJlOTQwZTgzYzk5YjM1OGNmMjFkYWRmZjFmOWViMDNlZDliZjdhYTli
15
- Nzc0MDVmMDZiODlmMzdiYTc0YzAyYWIxMjBhZWM2Y2Y4MTI0OTg=