ffwd-riemann 0.1.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.
- checksums.yaml +7 -0
- data/lib/ffwd/plugin/riemann/connection.rb +63 -0
- data/lib/ffwd/plugin/riemann/output.rb +48 -0
- data/lib/ffwd/plugin/riemann/shared.rb +146 -0
- data/lib/ffwd/plugin/riemann/version.rb +22 -0
- data/lib/ffwd/plugin/riemann.rb +142 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c2536975d8be4dd026413d399842e78f686fa39
|
4
|
+
data.tar.gz: d198e325793a91f8488f1aff2f30ae50e2a18556
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bf98c1b2cf932d36e151cc49a9e665c53ebaef35a86a626a1e0e67c4ca878b6a622ac35046a1fcab0b86cb6d64b8d5f727398f8602df68a4d14e9ce13b4c6907
|
7
|
+
data.tar.gz: d5665c0d9498140a154f47baa2ff810010e23b691ecd0dd5c4c597d9432ee62d9c74b7405d1aeed4756626f8001640401292c2f409929033e24f31286246d801
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# $LICENSE
|
2
|
+
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
+
#
|
4
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module FFWD::Plugin::Riemann
|
17
|
+
module Connection
|
18
|
+
module Serializer
|
19
|
+
def self.dump(m)
|
20
|
+
m.encode.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.load(data)
|
24
|
+
::Riemann::Message.decode(data)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def serializer
|
29
|
+
FFWD::Plugin::Riemann::Connection::Serializer
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize bind, core, log
|
33
|
+
@bind = bind
|
34
|
+
@core = core
|
35
|
+
@log = log
|
36
|
+
end
|
37
|
+
|
38
|
+
def receive_object(m)
|
39
|
+
# handle no events in object.
|
40
|
+
if m.events.nil?
|
41
|
+
send_ok
|
42
|
+
return
|
43
|
+
end
|
44
|
+
|
45
|
+
unless m.events.nil? or m.events.empty?
|
46
|
+
events = m.events.map{|e| read_event(e)}
|
47
|
+
events.each{|e| @core.input.event e}
|
48
|
+
end
|
49
|
+
|
50
|
+
@bind.increment :received_events, m.events.size
|
51
|
+
send_ok
|
52
|
+
rescue => e
|
53
|
+
@bind.increment :failed_events, m.events.size
|
54
|
+
@log.error "Failed to receive object", e
|
55
|
+
send_error e
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def send_ok; end
|
61
|
+
def send_error(e); end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# $LICENSE
|
2
|
+
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
+
#
|
4
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
require_relative 'shared'
|
17
|
+
|
18
|
+
module FFWD::Plugin::Riemann
|
19
|
+
module Output
|
20
|
+
def send_all events, metrics
|
21
|
+
all_events = []
|
22
|
+
all_events += events.map{|e| make_event e} unless events.empty?
|
23
|
+
all_events += metrics.map{|m| make_metric m} unless metrics.empty?
|
24
|
+
return if all_events.empty?
|
25
|
+
m = make_message :events => all_events
|
26
|
+
send_data encode(m)
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_event event
|
30
|
+
e = make_event event
|
31
|
+
m = make_message :events => [e]
|
32
|
+
send_data encode(m)
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_metric metric
|
36
|
+
e = make_metric metric
|
37
|
+
m = make_message :events => [e]
|
38
|
+
send_data encode(m)
|
39
|
+
end
|
40
|
+
|
41
|
+
def receive_data data
|
42
|
+
message = read_message data
|
43
|
+
return if message.ok
|
44
|
+
@bad_acks = (@bad_acks || 0) + 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# $LICENSE
|
2
|
+
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
+
#
|
4
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
require 'beefcake'
|
17
|
+
|
18
|
+
require 'riemann/query'
|
19
|
+
require 'riemann/attribute'
|
20
|
+
require 'riemann/state'
|
21
|
+
require 'riemann/event'
|
22
|
+
require 'riemann/message'
|
23
|
+
|
24
|
+
module FFWD::Plugin::Riemann
|
25
|
+
MAPPING = [
|
26
|
+
[:key, :service, :service=],
|
27
|
+
[:value, :metric, :metric=],
|
28
|
+
[:host, :host, :host=],
|
29
|
+
]
|
30
|
+
|
31
|
+
METRIC_MAPPING = MAPPING
|
32
|
+
|
33
|
+
EVENT_MAPPING = [
|
34
|
+
[:state, :state, :state=],
|
35
|
+
[:description, :description, :description=],
|
36
|
+
[:ttl, :ttl, :ttl=],
|
37
|
+
] + MAPPING
|
38
|
+
|
39
|
+
module Shared
|
40
|
+
def read_attributes e, source
|
41
|
+
return if source.nil? or source.empty?
|
42
|
+
|
43
|
+
attributes = {}
|
44
|
+
|
45
|
+
source.each do |a|
|
46
|
+
attributes[a.key] = a.value
|
47
|
+
end
|
48
|
+
|
49
|
+
e[:attributes] = attributes
|
50
|
+
end
|
51
|
+
|
52
|
+
def write_attributes e, source
|
53
|
+
return if source.nil? or source.empty?
|
54
|
+
|
55
|
+
e.attributes = source.map{|k, v|
|
56
|
+
k = k.to_s.dup unless k.nil?
|
57
|
+
v = v.dup unless v.nil?
|
58
|
+
::Riemann::Attribute.new(:key => k, :value => v)
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def read_tags e, source
|
63
|
+
return if source.nil? or source.empty?
|
64
|
+
e[:tags] = source.to_a
|
65
|
+
end
|
66
|
+
|
67
|
+
def write_tags e, source
|
68
|
+
return if source.nil? or source.empty?
|
69
|
+
e.tags = source.map{|v| v.dup}
|
70
|
+
end
|
71
|
+
|
72
|
+
def read_time e, source
|
73
|
+
return if source.nil?
|
74
|
+
e[:time] = Time.at source
|
75
|
+
end
|
76
|
+
|
77
|
+
def write_time e, source
|
78
|
+
return if source.nil?
|
79
|
+
e.time = source.to_i
|
80
|
+
end
|
81
|
+
|
82
|
+
def make_event event
|
83
|
+
e = ::Riemann::Event.new
|
84
|
+
|
85
|
+
write_attributes e, event.attributes
|
86
|
+
write_tags e, event.tags
|
87
|
+
write_time e, event.time
|
88
|
+
|
89
|
+
EVENT_MAPPING.each do |key, reader, writer|
|
90
|
+
if (v = event.send(key)).nil?
|
91
|
+
next
|
92
|
+
end
|
93
|
+
|
94
|
+
v = v.to_s if v.is_a? Symbol
|
95
|
+
e.send writer, v
|
96
|
+
end
|
97
|
+
|
98
|
+
e
|
99
|
+
end
|
100
|
+
|
101
|
+
def make_metric metric
|
102
|
+
e = ::Riemann::Event.new
|
103
|
+
|
104
|
+
write_attributes e, metric.attributes
|
105
|
+
write_tags e, metric.tags
|
106
|
+
write_time e, metric.time
|
107
|
+
|
108
|
+
METRIC_MAPPING.each do |key, reader, writer|
|
109
|
+
if (v = metric.send(key)).nil?
|
110
|
+
next
|
111
|
+
end
|
112
|
+
|
113
|
+
v = v.to_s if v.is_a? Symbol
|
114
|
+
e.send writer, v
|
115
|
+
end
|
116
|
+
|
117
|
+
e
|
118
|
+
end
|
119
|
+
|
120
|
+
def read_event event
|
121
|
+
e = {}
|
122
|
+
|
123
|
+
read_attributes e, event.attributes
|
124
|
+
read_tags e, event.tags
|
125
|
+
read_time e, event.time
|
126
|
+
|
127
|
+
EVENT_MAPPING.each do |key, reader, writer|
|
128
|
+
if (v = event.send(reader)).nil?
|
129
|
+
next
|
130
|
+
end
|
131
|
+
|
132
|
+
e[key] = v
|
133
|
+
end
|
134
|
+
|
135
|
+
e
|
136
|
+
end
|
137
|
+
|
138
|
+
def make_message(message)
|
139
|
+
::Riemann::Message.new(message)
|
140
|
+
end
|
141
|
+
|
142
|
+
def read_message(data)
|
143
|
+
::Riemann::Message.decode data
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# $LICENSE
|
2
|
+
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
+
#
|
4
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module FFWD
|
17
|
+
module Plugin
|
18
|
+
module Riemann
|
19
|
+
VERSION = "0.1.0"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# $LICENSE
|
2
|
+
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
+
#
|
4
|
+
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
require 'eventmachine'
|
17
|
+
require 'beefcake'
|
18
|
+
|
19
|
+
require 'riemann/query'
|
20
|
+
require 'riemann/attribute'
|
21
|
+
require 'riemann/state'
|
22
|
+
require 'riemann/event'
|
23
|
+
require 'riemann/message'
|
24
|
+
|
25
|
+
require 'ffwd/connection'
|
26
|
+
require 'ffwd/handler'
|
27
|
+
require 'ffwd/logging'
|
28
|
+
require 'ffwd/plugin'
|
29
|
+
require 'ffwd/protocol'
|
30
|
+
|
31
|
+
require_relative 'riemann/connection'
|
32
|
+
require_relative 'riemann/shared'
|
33
|
+
require_relative 'riemann/output'
|
34
|
+
|
35
|
+
module FFWD::Plugin::Riemann
|
36
|
+
include FFWD::Plugin
|
37
|
+
include FFWD::Logging
|
38
|
+
|
39
|
+
register_plugin "riemann"
|
40
|
+
|
41
|
+
class OutputTCP < FFWD::Handler
|
42
|
+
include FFWD::Plugin::Riemann::Shared
|
43
|
+
include FFWD::Plugin::Riemann::Output
|
44
|
+
|
45
|
+
def self.plugin_type
|
46
|
+
"riemann_out"
|
47
|
+
end
|
48
|
+
|
49
|
+
def encode m
|
50
|
+
m.encode_with_length
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class OutputUDP < FFWD::Handler
|
55
|
+
include FFWD::Plugin::Riemann::Shared
|
56
|
+
include FFWD::Plugin::Riemann::Output
|
57
|
+
|
58
|
+
def self.plugin_type
|
59
|
+
"riemann_out"
|
60
|
+
end
|
61
|
+
|
62
|
+
def encode m
|
63
|
+
m.encode
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class InputTCP < FFWD::Connection
|
68
|
+
include EM::Protocols::ObjectProtocol
|
69
|
+
include FFWD::Plugin::Riemann::Shared
|
70
|
+
include FFWD::Plugin::Riemann::Connection
|
71
|
+
|
72
|
+
def self.plugin_type
|
73
|
+
"riemann_in"
|
74
|
+
end
|
75
|
+
|
76
|
+
def send_ok
|
77
|
+
send_object(::Riemann::Message.new(
|
78
|
+
:ok => true))
|
79
|
+
end
|
80
|
+
|
81
|
+
def send_error(e)
|
82
|
+
send_object(::Riemann::Message.new(
|
83
|
+
:ok => false, :error => e.to_s))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class InputUDP < FFWD::Connection
|
88
|
+
include FFWD::Plugin::Riemann::Shared
|
89
|
+
include FFWD::Plugin::Riemann::Connection
|
90
|
+
|
91
|
+
def self.plugin_type
|
92
|
+
"riemann_in"
|
93
|
+
end
|
94
|
+
|
95
|
+
def receive_data(data)
|
96
|
+
receive_object serializer.load(data)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
DEFAULT_HOST = "localhost"
|
101
|
+
DEFAULT_PORT = 5555
|
102
|
+
DEFAULT_PROTOCOL = 'tcp'
|
103
|
+
|
104
|
+
OUTPUTS = {:tcp => OutputTCP, :udp => OutputUDP}
|
105
|
+
INPUTS = {:tcp => InputTCP, :udp => InputUDP}
|
106
|
+
|
107
|
+
def self.setup_output opts, core
|
108
|
+
opts[:host] ||= DEFAULT_HOST
|
109
|
+
opts[:port] ||= DEFAULT_PORT
|
110
|
+
|
111
|
+
protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
|
112
|
+
|
113
|
+
unless type = OUTPUTS[protocol.family]
|
114
|
+
raise "No type for protocol family: #{protocol.family}"
|
115
|
+
end
|
116
|
+
|
117
|
+
protocol.connect opts, core, log, type
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.setup_input opts, core
|
121
|
+
opts[:host] ||= DEFAULT_HOST
|
122
|
+
opts[:port] ||= DEFAULT_PORT
|
123
|
+
protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
|
124
|
+
|
125
|
+
unless connection = INPUTS[protocol.family]
|
126
|
+
raise "No connection for protocol family: #{protocol.family}"
|
127
|
+
end
|
128
|
+
|
129
|
+
protocol.bind opts, core, log, connection, log
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.setup_tunnel opts, core, tunnel
|
133
|
+
opts[:port] ||= DEFAULT_PORT
|
134
|
+
protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
|
135
|
+
|
136
|
+
unless connection = INPUTS[protocol.family]
|
137
|
+
raise "No connection for protocol family: #{protocol.family}"
|
138
|
+
end
|
139
|
+
|
140
|
+
protocol.tunnel opts, core, tunnel, log, connection, log
|
141
|
+
end
|
142
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ffwd-riemann
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John-John Tedro
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: riemann-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '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'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ffwd
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
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-mocks
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- udoprog@spotify.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/ffwd/plugin/riemann.rb
|
77
|
+
- lib/ffwd/plugin/riemann/output.rb
|
78
|
+
- lib/ffwd/plugin/riemann/shared.rb
|
79
|
+
- lib/ffwd/plugin/riemann/connection.rb
|
80
|
+
- lib/ffwd/plugin/riemann/version.rb
|
81
|
+
homepage: https://github.com/spotify/ffwd
|
82
|
+
licenses:
|
83
|
+
- Apache 2.0
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.0.3
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Riemann support for FFWD.
|
105
|
+
test_files: []
|