recognizer 0.1.6 → 0.2.0
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.
- data/README.org +2 -0
- data/lib/recognizer.rb +28 -11
- data/lib/recognizer/cli.rb +0 -1
- data/lib/recognizer/config.rb +9 -5
- data/lib/recognizer/inputs/amqp.rb +70 -0
- data/lib/recognizer/inputs/tcp.rb +61 -0
- data/lib/recognizer/librato.rb +91 -63
- data/lib/recognizer/patches/openssl.rb +7 -5
- data/lib/recognizer/version.rb +3 -1
- data/recognizer.gemspec +3 -3
- metadata +18 -20
- data/lib/recognizer/amqp.rb +0 -56
- data/lib/recognizer/patches/hash.rb +0 -10
- data/lib/recognizer/tcp.rb +0 -46
data/README.org
CHANGED
data/lib/recognizer.rb
CHANGED
@@ -1,20 +1,37 @@
|
|
1
1
|
require "recognizer/cli"
|
2
2
|
require "recognizer/config"
|
3
3
|
require "recognizer/librato"
|
4
|
-
require "recognizer/tcp"
|
5
|
-
require "recognizer/amqp"
|
4
|
+
require "recognizer/inputs/tcp"
|
5
|
+
require "recognizer/inputs/amqp"
|
6
6
|
|
7
7
|
module Recognizer
|
8
8
|
def self.run
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
logger = Logger.new(STDOUT)
|
10
|
+
input_queue = Queue.new
|
11
|
+
cli = Recognizer::CLI.new
|
12
|
+
config = Recognizer::Config.new(cli.read)
|
13
|
+
|
14
|
+
librato = Recognizer::Librato.new(
|
15
|
+
:logger => logger,
|
16
|
+
:options => config.read,
|
17
|
+
:input_queue => input_queue
|
18
|
+
)
|
19
|
+
librato.run
|
20
|
+
|
21
|
+
tcp = Recognizer::Input::TCP.new(
|
22
|
+
:logger => logger,
|
23
|
+
:options => config.read,
|
24
|
+
:input_queue => input_queue
|
25
|
+
)
|
26
|
+
tcp.run
|
27
|
+
|
28
|
+
amqp = Recognizer::Input::AMQP.new(
|
29
|
+
:logger => logger,
|
30
|
+
:options => config.read,
|
31
|
+
:input_queue => input_queue
|
32
|
+
)
|
33
|
+
amqp.run
|
34
|
+
|
18
35
|
loop do
|
19
36
|
sleep 30
|
20
37
|
end
|
data/lib/recognizer/cli.rb
CHANGED
data/lib/recognizer/config.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
require "rubygems"
|
2
1
|
require "json"
|
3
2
|
|
4
|
-
require File.join(File.dirname(__FILE__), "patches", "hash")
|
5
|
-
|
6
3
|
module Recognizer
|
7
4
|
class Config
|
8
5
|
def initialize(options={})
|
@@ -12,17 +9,24 @@ module Recognizer
|
|
12
9
|
if File.readable?(options[:config_file])
|
13
10
|
config_file_contents = File.open(options[:config_file], "r").read
|
14
11
|
begin
|
15
|
-
@config = JSON.parse(config_file_contents)
|
12
|
+
@config = JSON.parse(config_file_contents, :symbolize_names => true)
|
16
13
|
rescue JSON::ParserError => error
|
17
14
|
raise "Config file must be valid JSON: #{error}"
|
18
15
|
end
|
19
16
|
else
|
20
17
|
raise "Config file does not exist or is not readable: #{options[:config_file]}"
|
21
18
|
end
|
19
|
+
validate
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate
|
23
|
+
unless @config[:librato][:email] && @config[:librato][:api_key]
|
24
|
+
raise "You must provide a Librato Metrics account email and API key"
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
def read
|
25
|
-
@config
|
29
|
+
@config
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "recognizer/patches/openssl"
|
2
|
+
require "thread"
|
3
|
+
require "bunny"
|
4
|
+
|
5
|
+
module Recognizer
|
6
|
+
module Input
|
7
|
+
class AMQP
|
8
|
+
def initialize(options={})
|
9
|
+
@logger = options[:logger]
|
10
|
+
@options = options[:options]
|
11
|
+
@input_queue = options[:input_queue]
|
12
|
+
|
13
|
+
Thread.abort_on_exception = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
if @options.has_key?(:amqp)
|
18
|
+
set_default_options
|
19
|
+
setup_consumer
|
20
|
+
else
|
21
|
+
@logger.warn("AMQP -- Not configured")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def set_default_options
|
28
|
+
@options[:amqp][:exchange] ||= Hash.new
|
29
|
+
@options[:amqp][:exchange][:name] ||= "graphite"
|
30
|
+
@options[:amqp][:exchange][:durable] ||= false
|
31
|
+
@options[:amqp][:exchange][:routing_key] ||= "#"
|
32
|
+
@options[:amqp][:exchange][:type] ||= (@options[:amqp][:exchange][:type] || "topic").to_sym
|
33
|
+
end
|
34
|
+
|
35
|
+
def setup_consumer
|
36
|
+
amqp = Bunny.new(@options[:amqp].reject { |key, value| key == :exchange })
|
37
|
+
amqp.start
|
38
|
+
|
39
|
+
exchange = amqp.exchange(@options[:amqp][:exchange][:name], {
|
40
|
+
:type => @options[:amqp][:exchange][:type],
|
41
|
+
:durable => @options[:amqp][:exchange][:durable]
|
42
|
+
})
|
43
|
+
|
44
|
+
queue = amqp.queue("recognizer")
|
45
|
+
queue.bind(exchange, {
|
46
|
+
:key => @options[:amqp][:exchange][:routing_key]
|
47
|
+
})
|
48
|
+
|
49
|
+
Thread.new do
|
50
|
+
@logger.info("AMQP -- Awaiting metrics with impatience ...")
|
51
|
+
queue.subscribe do |message|
|
52
|
+
msg_routing_key = message[:routing_key] || message[:delivery_details][:routing_key]
|
53
|
+
lines = message[:payload].split("\n")
|
54
|
+
lines.each do |line|
|
55
|
+
line = line.strip
|
56
|
+
case line.split("\s").count
|
57
|
+
when 3
|
58
|
+
@input_queue.push(line)
|
59
|
+
when 2
|
60
|
+
@input_queue.push("#{msg_routing_key} #{line}")
|
61
|
+
else
|
62
|
+
@logger.warn("AMQP -- Received malformed metric :: #{msg_routing_key} :: #{line}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "thread"
|
2
|
+
require "socket"
|
3
|
+
|
4
|
+
module Recognizer
|
5
|
+
module Input
|
6
|
+
class TCP
|
7
|
+
def initialize(options={})
|
8
|
+
@logger = options[:logger]
|
9
|
+
@options = options[:options]
|
10
|
+
@input_queue = options[:input_queue]
|
11
|
+
|
12
|
+
@options[:tcp] ||= Hash.new
|
13
|
+
@tcp_connections = Queue.new
|
14
|
+
|
15
|
+
Thread.abort_on_exception = true
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
setup_server
|
20
|
+
setup_thread_pool
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def setup_server
|
26
|
+
port = @options[:tcp][:port] || 2003
|
27
|
+
tcp_server = TCPServer.new("0.0.0.0", port)
|
28
|
+
Thread.new do
|
29
|
+
@logger.info("TCP -- Awaiting metrics with impatience ...")
|
30
|
+
loop do
|
31
|
+
@tcp_connections.push(tcp_server.accept)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_server_thread
|
37
|
+
Thread.new do
|
38
|
+
loop do
|
39
|
+
if connection = @tcp_connections.shift
|
40
|
+
while line = connection.gets
|
41
|
+
line = line.strip
|
42
|
+
if line.split("\s").count == 3
|
43
|
+
@input_queue.push(line)
|
44
|
+
else
|
45
|
+
@logger.warn("TCP -- Received malformed metric :: #{line}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def setup_thread_pool
|
54
|
+
threads = @options[:tcp][:threads] || 20
|
55
|
+
threads.times do
|
56
|
+
create_server_thread
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/recognizer/librato.rb
CHANGED
@@ -1,96 +1,124 @@
|
|
1
|
-
require "rubygems"
|
2
1
|
require "recognizer/version"
|
2
|
+
require "recognizer/patches/float"
|
3
|
+
require "recognizer/patches/openssl"
|
3
4
|
require "thread"
|
4
5
|
require "librato/metrics"
|
5
6
|
|
6
|
-
require File.join(File.dirname(__FILE__), "patches", "float")
|
7
|
-
|
8
|
-
if RUBY_PLATFORM == "java"
|
9
|
-
require File.join(File.dirname(__FILE__), "patches", "openssl")
|
10
|
-
end
|
11
|
-
|
12
7
|
module Recognizer
|
13
8
|
class Librato
|
14
|
-
def initialize(
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
unless options[:librato][:email] && options[:librato][:api_key]
|
19
|
-
raise "You must provide a Librato Metrics account email and API key"
|
20
|
-
end
|
9
|
+
def initialize(options={})
|
10
|
+
@logger = options[:logger]
|
11
|
+
@options = options[:options]
|
12
|
+
@input_queue = options[:input_queue]
|
21
13
|
|
22
|
-
::Librato::Metrics.authenticate(options[:librato][:email], options[:librato][:api_key])
|
14
|
+
::Librato::Metrics.authenticate(@options[:librato][:email], @options[:librato][:api_key])
|
23
15
|
::Librato::Metrics.agent_identifier("recognizer", Recognizer::VERSION, "portertech")
|
24
|
-
|
16
|
+
@librato_queue = ::Librato::Metrics::Queue.new
|
17
|
+
@librato_mutex = Mutex.new
|
25
18
|
|
26
|
-
mutex = Mutex.new
|
27
19
|
Thread.abort_on_exception = true
|
20
|
+
end
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
22
|
+
def run
|
23
|
+
setup_publisher
|
24
|
+
setup_consumer
|
25
|
+
end
|
26
|
+
|
27
|
+
def invalid_metric(metric, message)
|
28
|
+
@logger.warn("Invalid metric :: #{metric.inspect} :: #{message}")
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
def valid_carbon_metric?(carbon_formatted)
|
33
|
+
parts = carbon_formatted.split("\s")
|
34
|
+
if parts[0] !~ /^[A-Za-z0-9\._-]*$/
|
35
|
+
invalid_metric(carbon_formatted, "Metric name must only consist of alpha-numeric characters, periods, underscores, and dashes")
|
36
|
+
elsif parts[1] !~ /^[0-9]*\.?[0-9]*$/
|
37
|
+
invalid_metric(carbon_formatted, "Metric value must be an integer or float")
|
38
|
+
elsif parts[2] !~ /^[0-9]{10}$/
|
39
|
+
invalid_metric(carbon_formatted, "Metric timestamp must be epoch, 10 digits")
|
40
|
+
else
|
41
|
+
true
|
44
42
|
end
|
43
|
+
end
|
45
44
|
|
46
|
-
|
45
|
+
def metric_source(path)
|
46
|
+
@metric_source ||= case @options[:librato][:metric_source]
|
47
47
|
when String
|
48
|
-
if options[:librato][:metric_source].match("^/.*/$")
|
49
|
-
@source_pattern = Regexp.new(options[:librato][:metric_source].delete("/"))
|
48
|
+
if @options[:librato][:metric_source].match("^/.*/$")
|
49
|
+
@source_pattern = Regexp.new(@options[:librato][:metric_source].delete("/"))
|
50
50
|
Proc.new { |path| (matched = path.grep(@source_pattern).first) ? matched : "recognizer" }
|
51
51
|
else
|
52
|
-
Proc.new { options[:librato][:metric_source] }
|
52
|
+
Proc.new { @options[:librato][:metric_source] }
|
53
53
|
end
|
54
54
|
when Integer
|
55
|
-
Proc.new { |path| path.slice(options[:librato][:metric_source]) }
|
55
|
+
Proc.new { |path| path.slice(@options[:librato][:metric_source]) || "recognizer" }
|
56
56
|
else
|
57
57
|
Proc.new { "recognizer" }
|
58
58
|
end
|
59
|
+
@metric_source.call(path)
|
60
|
+
end
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
begin
|
64
|
-
parts = graphite_formated.split("\s")
|
62
|
+
def create_metric(carbon_formatted)
|
63
|
+
if valid_carbon_metric?(carbon_formatted)
|
64
|
+
parts = carbon_formatted.split("\s")
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
raise "metric timestamp must be epoch, 10 digits"
|
71
|
-
end
|
66
|
+
path = parts.shift.split(".")
|
67
|
+
value = Float(parts.shift).pretty
|
68
|
+
timestamp = Float(parts.shift).pretty
|
69
|
+
source = metric_source(path)
|
72
70
|
|
73
|
-
|
74
|
-
value = Float(parts.shift).pretty
|
75
|
-
timestamp = Float(parts.shift).pretty
|
76
|
-
source = get_source.call(path)
|
71
|
+
path.delete(source)
|
77
72
|
|
78
|
-
|
73
|
+
name = path.join(".")
|
79
74
|
|
80
|
-
|
75
|
+
metric = {
|
76
|
+
name => {
|
77
|
+
:value => value,
|
78
|
+
:measure_time => timestamp,
|
79
|
+
:source => source
|
80
|
+
}
|
81
|
+
}
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
83
|
+
unless name.size <= 63
|
84
|
+
invalid_metric(metric, "Metric name must be 63 or fewer characters")
|
85
|
+
else
|
86
|
+
metric
|
87
|
+
end
|
88
|
+
else
|
89
|
+
false
|
90
|
+
end
|
91
|
+
end
|
85
92
|
|
86
|
-
|
93
|
+
private
|
94
|
+
|
95
|
+
def setup_publisher
|
96
|
+
Thread.new do
|
97
|
+
loop do
|
98
|
+
sleep(@options[:librato][:flush_interval] || 10)
|
99
|
+
unless @librato_queue.empty?
|
100
|
+
@logger.info("Attempting to flush metrics to Librato")
|
101
|
+
@librato_mutex.synchronize do
|
102
|
+
begin
|
103
|
+
@librato_queue.submit
|
104
|
+
@logger.info("Successfully flushed metrics to Librato")
|
105
|
+
rescue => error
|
106
|
+
@logger.error("Encountered an error when flushing metrics to Librato :: #{error}")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
87
113
|
|
88
|
-
|
89
|
-
|
90
|
-
|
114
|
+
def setup_consumer
|
115
|
+
Thread.new do
|
116
|
+
loop do
|
117
|
+
if metric = create_metric(@input_queue.shift)
|
118
|
+
@logger.info("Adding metric to Librato queue :: #{metric.inspect}")
|
119
|
+
@librato_mutex.synchronize do
|
120
|
+
@librato_queue.add(metric)
|
91
121
|
end
|
92
|
-
rescue => error
|
93
|
-
logger.info("Invalid metric :: #{graphite_formated} :: #{error}")
|
94
122
|
end
|
95
123
|
end
|
96
124
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
if RUBY_PLATFORM == "java"
|
2
|
+
require "openssl"
|
2
3
|
|
3
|
-
module OpenSSL
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
module OpenSSL
|
5
|
+
module SSL
|
6
|
+
remove_const(:VERIFY_PEER)
|
7
|
+
const_set(:VERIFY_PEER, VERIFY_NONE)
|
8
|
+
end
|
7
9
|
end
|
8
10
|
end
|
data/lib/recognizer/version.rb
CHANGED
data/recognizer.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
20
|
s.add_dependency("json")
|
21
|
-
s.add_dependency("mixlib-cli", "
|
22
|
-
s.add_dependency("bunny", "0.
|
23
|
-
s.add_dependency("librato-metrics", "0.
|
21
|
+
s.add_dependency("mixlib-cli", "1.2.2")
|
22
|
+
s.add_dependency("bunny", "0.8.0")
|
23
|
+
s.add_dependency("librato-metrics", "0.7.0")
|
24
24
|
end
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sean Porter
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-08-03 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -38,14 +38,14 @@ dependencies:
|
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- - "
|
41
|
+
- - "="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
43
|
+
hash: 27
|
44
44
|
segments:
|
45
45
|
- 1
|
46
|
-
-
|
47
|
-
-
|
48
|
-
version: 1.
|
46
|
+
- 2
|
47
|
+
- 2
|
48
|
+
version: 1.2.2
|
49
49
|
type: :runtime
|
50
50
|
version_requirements: *id002
|
51
51
|
- !ruby/object:Gem::Dependency
|
@@ -56,12 +56,12 @@ dependencies:
|
|
56
56
|
requirements:
|
57
57
|
- - "="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
hash:
|
59
|
+
hash: 63
|
60
60
|
segments:
|
61
61
|
- 0
|
62
|
-
-
|
63
|
-
-
|
64
|
-
version: 0.
|
62
|
+
- 8
|
63
|
+
- 0
|
64
|
+
version: 0.8.0
|
65
65
|
type: :runtime
|
66
66
|
version_requirements: *id003
|
67
67
|
- !ruby/object:Gem::Dependency
|
@@ -72,13 +72,12 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
75
|
+
hash: 3
|
76
76
|
segments:
|
77
77
|
- 0
|
78
|
-
-
|
78
|
+
- 7
|
79
79
|
- 0
|
80
|
-
|
81
|
-
version: 0.6.0.pre3
|
80
|
+
version: 0.7.0
|
82
81
|
type: :runtime
|
83
82
|
version_requirements: *id004
|
84
83
|
description: A drop-in replacement for Graphite Carbon (TCP & AMQP), sending metrics to Librato Metrics.
|
@@ -92,14 +91,13 @@ extra_rdoc_files: []
|
|
92
91
|
|
93
92
|
files:
|
94
93
|
- bin/recognizer
|
95
|
-
- lib/recognizer/amqp.rb
|
96
94
|
- lib/recognizer/cli.rb
|
97
95
|
- lib/recognizer/config.rb
|
96
|
+
- lib/recognizer/inputs/amqp.rb
|
97
|
+
- lib/recognizer/inputs/tcp.rb
|
98
98
|
- lib/recognizer/librato.rb
|
99
99
|
- lib/recognizer/patches/float.rb
|
100
|
-
- lib/recognizer/patches/hash.rb
|
101
100
|
- lib/recognizer/patches/openssl.rb
|
102
|
-
- lib/recognizer/tcp.rb
|
103
101
|
- lib/recognizer/version.rb
|
104
102
|
- lib/recognizer.rb
|
105
103
|
- recognizer.gemspec
|
data/lib/recognizer/amqp.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "thread"
|
3
|
-
require "bunny"
|
4
|
-
|
5
|
-
if RUBY_PLATFORM == "java"
|
6
|
-
require File.join(File.dirname(__FILE__), "patches", "openssl")
|
7
|
-
end
|
8
|
-
|
9
|
-
module Recognizer
|
10
|
-
class AMQP
|
11
|
-
def initialize(carbon_queue, logger, options)
|
12
|
-
unless carbon_queue && options.is_a?(Hash)
|
13
|
-
raise "You must provide a thread queue and options"
|
14
|
-
end
|
15
|
-
|
16
|
-
if options.has_key?(:amqp)
|
17
|
-
options[:amqp][:exchange] ||= Hash.new
|
18
|
-
|
19
|
-
exchange_name = options[:amqp][:exchange][:name] || "graphite"
|
20
|
-
durable = options[:amqp][:exchange][:durable] || false
|
21
|
-
routing_key = options[:amqp][:exchange][:routing_key] || "#"
|
22
|
-
exchange_type = options[:amqp][:exchange][:type] || :topic
|
23
|
-
|
24
|
-
amqp = Bunny.new(options[:amqp].reject { |key, value| key == :exchange })
|
25
|
-
amqp.start
|
26
|
-
|
27
|
-
exchange = amqp.exchange(exchange_name, :type => exchange_type.to_sym, :durable => durable)
|
28
|
-
queue = amqp.queue("recognizer")
|
29
|
-
queue.bind(exchange, :key => routing_key)
|
30
|
-
|
31
|
-
Thread.abort_on_exception = true
|
32
|
-
|
33
|
-
Thread.new do
|
34
|
-
logger.info("AMQP -- Awaiting metrics with impatience ...")
|
35
|
-
queue.subscribe do |message|
|
36
|
-
payload = message[:payload]
|
37
|
-
msg_routing_key = message[:routing_key] || message[:delivery_details][:routing_key]
|
38
|
-
|
39
|
-
lines = payload.split("\n")
|
40
|
-
lines.each do |line|
|
41
|
-
line = line.strip
|
42
|
-
case line.split("\s").count
|
43
|
-
when 3
|
44
|
-
carbon_queue.push(line)
|
45
|
-
when 2
|
46
|
-
carbon_queue.push("#{msg_routing_key} #{line}")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
else
|
52
|
-
logger.warn("AMQP -- Not configured")
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/lib/recognizer/tcp.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "timeout"
|
3
|
-
require "thread"
|
4
|
-
require "socket"
|
5
|
-
|
6
|
-
module Recognizer
|
7
|
-
class TCP
|
8
|
-
def initialize(carbon_queue, logger, options)
|
9
|
-
unless carbon_queue && options.is_a?(Hash)
|
10
|
-
raise "You must provide a thread queue and options"
|
11
|
-
end
|
12
|
-
|
13
|
-
options[:tcp] ||= Hash.new
|
14
|
-
|
15
|
-
threads = options[:tcp][:threads] || 20
|
16
|
-
port = options[:tcp][:port] || 2003
|
17
|
-
|
18
|
-
tcp_server = TCPServer.new("0.0.0.0", port)
|
19
|
-
tcp_connections = Queue.new
|
20
|
-
|
21
|
-
Thread.abort_on_exception = true
|
22
|
-
|
23
|
-
threads.times do
|
24
|
-
Thread.new do
|
25
|
-
loop do
|
26
|
-
if connection = tcp_connections.shift
|
27
|
-
while line = connection.gets
|
28
|
-
line = line.strip
|
29
|
-
if line.split("\s").count == 3
|
30
|
-
carbon_queue.push(line)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
Thread.new do
|
39
|
-
logger.info("TCP -- Awaiting metrics with impatience ...")
|
40
|
-
loop do
|
41
|
-
tcp_connections.push(tcp_server.accept)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|