ffwd-protobuf 0.1.6

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
+ NTFmZTlmNTgzODA5NGQ3Yjc0Y2M0ZTE4OTFlNWI4ZTFlZWU1NzQyZg==
5
+ data.tar.gz: !binary |-
6
+ ZTM4MTYxMWI1MzgwY2Q5NDAxMzFjNGJkZTkzNTQ5NTAwY2JlODVkNQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZjBhZDYxZGZjN2ExY2IwZWY1NDFjODk1MDQwN2NlNjM5MmMyODYwY2IyYjk1
10
+ YjU4ZDU3NjY2ZTljMmQ0OTQ2NjJmYjY2MmM1OGJiY2Y4NWY1ZmNmNzViYWVh
11
+ NzQ2MzlmMjA1NDg4MDc4MDYzMWM3YTIwNzcwODc3MmY3MTk3ZTg=
12
+ data.tar.gz: !binary |-
13
+ YzU3MTY2Y2Q5MmNmMmUyYTA0Y2U4NWI4NzllMDIzMTRiOTgxNTRhYmM4OTBm
14
+ NWY0ZjZjM2FlMGU1NWFiNjI4MDkxYjZkMTk5ZjRmMTU0MmE4N2E4NGM3Mzhk
15
+ MWE4YjY3NTcwYTg0MjliYjgxMDJjMmQ3OTVjMWIwZjUxMThhMDM=
@@ -0,0 +1,105 @@
1
+ ### Generated by rprotoc. DO NOT EDIT!
2
+ ### <proto file: ./proto/protocol.proto>
3
+ # package FFWD.Plugin.Protobuf.Protocol;
4
+ #
5
+ # option java_package = "com.spotify.ffwd";
6
+ # option java_outer_classname = "Protocol";
7
+ #
8
+ # message Metric {
9
+ # // time in ms when metric was generated.
10
+ # optional int64 time = 1;
11
+ # // key of metric.
12
+ # optional string key = 2;
13
+ # // value of metric.
14
+ # optional double value = 3;
15
+ # // host where metric originated.
16
+ # optional string host = 4;
17
+ # // source metric of the metric.
18
+ # optional string source = 5;
19
+ # // tags associated to metric.
20
+ # repeated string tags = 6;
21
+ # // attributes associated to metric.
22
+ # repeated Attribute attributes = 7;
23
+ # }
24
+ #
25
+ # message Event {
26
+ # // time in ms when the event was generated.
27
+ # optional int64 time = 1;
28
+ # // key of event.
29
+ # optional string key = 2;
30
+ # // value of event.
31
+ # optional double value = 3;
32
+ # // host where event originated.
33
+ # optional string host = 4;
34
+ # // source event (if any).
35
+ # optional string source = 5;
36
+ # // indicated state of this event.
37
+ # optional string state = 6;
38
+ # // description of event.
39
+ # optional string description = 7;
40
+ # // time this event should be considered valid in seconds.
41
+ # optional int64 ttl = 8;
42
+ # // tags associated to event.
43
+ # repeated string tags = 9;
44
+ # // attributes associated to event.
45
+ # repeated Attribute attributes = 10;
46
+ # }
47
+ #
48
+ # message Attribute {
49
+ # required string key = 1;
50
+ # optional string value = 2;
51
+ # }
52
+ #
53
+ # message Message {
54
+ # optional Metric metric = 1;
55
+ # optional Event event = 2;
56
+ # }
57
+
58
+ require 'protobuf/message/message'
59
+ require 'protobuf/message/enum'
60
+ require 'protobuf/message/service'
61
+ require 'protobuf/message/extend'
62
+
63
+ module FFWD
64
+ module Plugin
65
+ module Protobuf
66
+ module Protocol
67
+ ::Protobuf::OPTIONS[:"java_package"] = "com.spotify.ffwd"
68
+ ::Protobuf::OPTIONS[:"java_outer_classname"] = "Protocol"
69
+ class Metric < ::Protobuf::Message
70
+ defined_in __FILE__
71
+ optional :int64, :time, 1
72
+ optional :string, :key, 2
73
+ optional :double, :value, 3
74
+ optional :string, :host, 4
75
+ optional :string, :source, 5
76
+ repeated :string, :tags, 6
77
+ repeated :Attribute, :attributes, 7
78
+ end
79
+ class Event < ::Protobuf::Message
80
+ defined_in __FILE__
81
+ optional :int64, :time, 1
82
+ optional :string, :key, 2
83
+ optional :double, :value, 3
84
+ optional :string, :host, 4
85
+ optional :string, :source, 5
86
+ optional :string, :state, 6
87
+ optional :string, :description, 7
88
+ optional :int64, :ttl, 8
89
+ repeated :string, :tags, 9
90
+ repeated :Attribute, :attributes, 10
91
+ end
92
+ class Attribute < ::Protobuf::Message
93
+ defined_in __FILE__
94
+ required :string, :key, 1
95
+ optional :string, :value, 2
96
+ end
97
+ class Message < ::Protobuf::Message
98
+ defined_in __FILE__
99
+ optional :Metric, :metric, 1
100
+ optional :Event, :event, 2
101
+ end
102
+ end
103
+ end
104
+ end
105
+ 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 Protobuf
19
+ VERSION = "0.1.6"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,244 @@
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 'em/protocols/frame_object_protocol'
18
+
19
+ require 'ffwd/connection'
20
+ require 'ffwd/handler'
21
+ require 'ffwd/logging'
22
+ require 'ffwd/plugin'
23
+ require 'ffwd/protocol'
24
+ require 'ffwd/event'
25
+ require 'ffwd/metric'
26
+
27
+ require_relative 'protobuf/protocol.pb'
28
+
29
+ module FFWD::Plugin::Protobuf
30
+ include FFWD::Plugin
31
+ include FFWD::Logging
32
+
33
+ P = ::FFWD::Plugin::Protobuf::Protocol
34
+
35
+ register_plugin "protobuf"
36
+
37
+ module Serializer
38
+ def self.dump m
39
+ m.serialize_to_string
40
+ end
41
+
42
+ def self.load string
43
+ m = P::Message.new
44
+ m.parse_from_string string
45
+ return m
46
+ end
47
+ end
48
+
49
+ class Output < FFWD::Handler
50
+ include EM::Protocols::ObjectProtocol
51
+ include Serializer
52
+
53
+ def self.plugin_type
54
+ "protobuf_out"
55
+ end
56
+
57
+ def serializer
58
+ Serializer
59
+ end
60
+
61
+ def send_all events, metrics
62
+ events.each do |event|
63
+ send_event event
64
+ end
65
+
66
+ metrics.each do |metric|
67
+ send_metric metric
68
+ end
69
+ end
70
+
71
+ def send_event event
72
+ message = P::Message.new
73
+ e = P::Event.new
74
+ e.time = (event.time.to_f * 1000).to_i if event.time
75
+ e.key = event.key if event.key
76
+ e.value = to_value event.value if event.value
77
+ e.host = event.host if event.host
78
+ e.source = event.source if event.source
79
+ e.state = event.state if event.state
80
+ e.description = event.description if event.description
81
+ e.ttl = event.ttl if event.ttl
82
+ e.tags = to_tags event.tags if event.tags
83
+ e.attributes = to_attributes event.attributes if event.attributes
84
+ message.event = e
85
+ send_object message
86
+ end
87
+
88
+ def send_metric metric
89
+ message = P::Message.new
90
+ m = P::Metric.new
91
+ m.time = (metric.time.to_f * 1000).to_i if metric.time
92
+ m.key = metric.key if metric.key
93
+ m.value = to_value metric.value if metric.value
94
+ m.host = metric.host if metric.host
95
+ m.source = metric.source if metric.source
96
+ m.tags = to_tags metric.tags if metric.tags
97
+ m.attributes = to_attributes metric.attributes if metric.attributes
98
+ message.metric = m
99
+ send_object message
100
+ end
101
+
102
+ private
103
+
104
+ def to_value value
105
+ v = P::Value.new
106
+ v.value_d = value
107
+ return v
108
+ end
109
+
110
+ def to_attributes attributes
111
+ attributes.map do |key, value|
112
+ P::Attribute.new(:key => key, :value => value)
113
+ end
114
+ end
115
+
116
+ def to_tags tags
117
+ Array.new tags
118
+ end
119
+ end
120
+
121
+ class Input < FFWD::Connection
122
+ include FFWD::Logging
123
+ include EM::Protocols::FrameObjectProtocol
124
+
125
+ def initialize bind, core, log
126
+ @bind = bind
127
+ @core = core
128
+ @log = log
129
+ end
130
+
131
+ def self.plugin_type
132
+ "protobuf_in"
133
+ end
134
+
135
+ def serializer
136
+ Serializer
137
+ end
138
+
139
+ def receive_object message
140
+ if message.has_field?(:event)
141
+ receive_event message.event
142
+ end
143
+
144
+ if message.has_field?(:metric)
145
+ receive_metric message.metric
146
+ end
147
+ end
148
+
149
+ def handle_exception datagram, e
150
+ @log.error("Failed to decode protobuf object", e)
151
+ if @log.debug?
152
+ @log.debug("FRAME: " + FFWD.dump2hex(datagram))
153
+ end
154
+ end
155
+
156
+ def receive_event e
157
+ d = {}
158
+ d[:time] = Time.at(e.time.to_f / 1000) if e.has_field?(:time)
159
+ d[:key] = e.key if e.has_field?(:key)
160
+ d[:value] = e.value if e.has_field?(:value)
161
+ d[:host] = e.host if e.has_field?(:host)
162
+ d[:source] = e.source if e.has_field?(:source)
163
+ d[:state] = e.state if e.has_field?(:state)
164
+ d[:description] = e.description if e.has_field?(:description)
165
+ d[:ttl] = e.ttl if e.has_field?(:ttl)
166
+ d[:tags] = from_tags m.tags if m.tags
167
+ d[:attributes] = from_attributes m.attributes if m.attributes
168
+ @core.input.event d
169
+ @bind.increment :received_events
170
+ rescue => e
171
+ @log.error "Failed to receive event", e
172
+ @bind.increment :failed_events
173
+ end
174
+
175
+ def receive_metric m
176
+ d = {}
177
+ d[:time] = Time.at(m.time.to_f / 1000) if m.has_field?(:time)
178
+ d[:key] = m.key if m.has_field?(:key)
179
+ d[:value] = m.value if m.has_field?(:value)
180
+ d[:host] = m.host if m.has_field?(:host)
181
+ d[:source] = m.source if m.has_field?(:source)
182
+ d[:tags] = from_tags m.tags if m.tags
183
+ d[:attributes] = from_attributes m.attributes if m.attributes
184
+ @core.input.metric d
185
+ @bind.increment :received_metrics
186
+ rescue => e
187
+ @log.error "Failed to receive event", e
188
+ @bind.increment :failed_metrics
189
+ end
190
+
191
+ private
192
+
193
+ def from_attributes attributes
194
+ Hash[attributes.map{|a| [a.key, a.value]}]
195
+ end
196
+
197
+ def from_tags tags
198
+ Array.new tags
199
+ end
200
+ end
201
+
202
+ DEFAULT_HOST = "localhost"
203
+ DEFAULT_PORT = 19091
204
+ DEFAULT_PROTOCOL = 'udp'
205
+
206
+ OUTPUTS = {:udp => Output}
207
+ INPUTS = {:udp => Input}
208
+
209
+ def self.setup_output opts, core
210
+ opts[:host] ||= DEFAULT_HOST
211
+ opts[:port] ||= DEFAULT_PORT
212
+
213
+ protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
214
+
215
+ unless type = OUTPUTS[protocol.family]
216
+ raise "No type for protocol family: #{protocol.family}"
217
+ end
218
+
219
+ protocol.connect opts, core, log, type
220
+ end
221
+
222
+ def self.setup_input opts, core
223
+ opts[:host] ||= DEFAULT_HOST
224
+ opts[:port] ||= DEFAULT_PORT
225
+ protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
226
+
227
+ unless connection = INPUTS[protocol.family]
228
+ raise "No connection for protocol family: #{protocol.family}"
229
+ end
230
+
231
+ protocol.bind opts, core, log, connection, log
232
+ end
233
+
234
+ def self.setup_tunnel opts, core, tunnel
235
+ opts[:port] ||= DEFAULT_PORT
236
+ protocol = FFWD.parse_protocol(opts[:protocol] || DEFAULT_PROTOCOL)
237
+
238
+ unless connection = INPUTS[protocol.family]
239
+ raise "No connection for protocol family: #{protocol.family}"
240
+ end
241
+
242
+ protocol.tunnel opts, core, tunnel, log, connection, log
243
+ end
244
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ffwd-protobuf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - John-John Tedro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ruby_protobuf
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/protobuf.rb
77
+ - lib/ffwd/plugin/protobuf/version.rb
78
+ - lib/ffwd/plugin/protobuf/protocol.pb.rb
79
+ homepage: https://github.com/spotify/ffwd
80
+ licenses:
81
+ - Apache 2.0
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.0.3
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: protobuf reference protocol support for FFWD.
103
+ test_files: []