fluent-plugin-flume 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4b78497ad732b1daed34f85264299c5f531b8862
4
- data.tar.gz: 01d60de145ffe1f44c682aa74ca6448e596d8a9e
3
+ metadata.gz: d92aa659b736a1e4228653bcf7089cf0844ed412
4
+ data.tar.gz: 74f103fa74799fdb9ee89debad3a3ce803c360ae
5
5
  SHA512:
6
- metadata.gz: 34fe016d453e36b285731ac4882ad4d2001702f56a65921017bef3c383bdf1894526520e7c869136d64d67ec9c43dcb5c0575e6630c8e216de3c754e23a441df
7
- data.tar.gz: 779f483c0eeae828af4b693df7d54a525277961cfb6f421a27a92d673664ee0873cd382b18f0754d4733770c775edd766df435995a05e435cf1b6952dd8ac6a0
6
+ metadata.gz: d1ec6c1fdd6ab7cd36acc3bdef637f4186c4464adec65839abeea0116a1e464240dccf2f88c414127cf88ec6dbea340347eac0fc7f6fbd9dee87012820b50ef6
7
+ data.tar.gz: fe24084964f0b71d51073c807ede72419dfde1faca46f824b5dbbc7b73875e6c67fba1392905f55cf0254749ae8ae0d1a08d898ce7eb998fb0670f30fe9601b7
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Release 0.2.0 - 2016/10/26
2
+
3
+ * Improve out_flume performance
4
+ * Deprecate in_flume for Flume-NG
5
+
1
6
  Release 0.1.3 - 2016/10/25
2
7
 
3
8
  * Add format parameter for formatter plugins support
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
@@ -19,175 +19,171 @@
19
19
  require 'fluent/input'
20
20
 
21
21
  module Fluent
22
+ class FlumeInput < Input
23
+ Plugin.register_input('flume', self)
24
+
25
+ config_param :port, :integer, :default => 56789
26
+ config_param :bind, :string, :default => '0.0.0.0'
27
+ config_param :server_type, :string, :default => 'simple'
28
+ config_param :is_framed, :bool, :default => false
29
+ config_param :body_size_limit, :size, :default => 32 * 1024 * 1024
30
+ config_param :tag_field, :string, :default => nil
31
+ config_param :default_tag, :string, :default => 'category'
32
+ config_param :add_prefix, :string, :default => nil
33
+ config_param :msg_format, :string, :default => 'text'
34
+
35
+ unless method_defined?(:log)
36
+ define_method(:log) { $log }
37
+ end
22
38
 
23
- class FlumeInput < Input
24
- Plugin.register_input('flume', self)
25
-
26
- config_param :port, :integer, :default => 56789
27
- config_param :bind, :string, :default => '0.0.0.0'
28
- config_param :server_type, :string, :default => 'simple'
29
- config_param :is_framed, :bool, :default => false
30
- config_param :body_size_limit, :size, :default => 32 * 1024 * 1024
31
- config_param :tag_field, :string, :default => nil
32
- config_param :default_tag, :string, :default => 'category'
33
- config_param :add_prefix, :string, :default => nil
34
- config_param :msg_format, :string, :default => 'text'
35
-
36
- unless method_defined?(:log)
37
- define_method(:log) { $log }
38
- end
39
-
40
- def initialize
41
- require 'thrift'
42
- $:.unshift File.join(File.dirname(__FILE__), 'thrift')
43
- require 'flume_types'
44
- require 'flume_constants'
45
- require 'thrift_flume_event_server'
39
+ def initialize
40
+ require 'thrift'
41
+ require 'fluent/plugin/old_thrift/flume_types'
42
+ $:.unshift File.join(File.dirname(__FILE__), 'old_thrift')
43
+ require 'flume_constants'
44
+ require 'thrift_flume_event_server'
45
+ super
46
+ end
46
47
 
47
- super
48
- end
48
+ def start
49
+ log.debug "listening flume on #{@bind}:#{@port}"
50
+ log.warn "[in_flume] This plugin is obsoleted for Flume NG. You should consider to use flume-ng-fluentd-sink."
51
+
52
+ handler = FluentFlumeHandler.new
53
+ handler.tag_field = @tag_field
54
+ handler.default_tag = @default_tag
55
+ handler.add_prefix = @add_prefix
56
+ handler.msg_format = @msg_format
57
+ handler.log = log
58
+ handler.router = router
59
+ processor = ThriftFlumeEventServer::Processor.new handler
60
+
61
+ @transport = Thrift::ServerSocket.new @bind, @port
62
+ unless @is_framed
63
+ transport_factory = Thrift::BufferedTransportFactory.new
64
+ else
65
+ raise ConfigError, "in_flume: unsupported is_framed '#{@is_framed}'"
66
+ end
49
67
 
50
- def configure(conf)
51
- super
52
- end
68
+ unless ['text', 'json'].include? @msg_format
69
+ raise 'Unknown format: msg_format=#{@msg_format}'
70
+ end
53
71
 
54
- def start
55
- log.debug "listening flume on #{@bind}:#{@port}"
56
-
57
- handler = FluentFlumeHandler.new
58
- handler.tag_field = @tag_field
59
- handler.default_tag = @default_tag
60
- handler.add_prefix = @add_prefix
61
- handler.msg_format = @msg_format
62
- handler.log = log
63
- processor = ThriftFlumeEventServer::Processor.new handler
64
-
65
- @transport = Thrift::ServerSocket.new @bind, @port
66
- unless @is_framed
67
- transport_factory = Thrift::BufferedTransportFactory.new
68
- else
69
- raise ConfigError, "in_flume: unsupported is_framed '#{@is_framed}'"
72
+ # 2011/09/29 Kazuki Ohta <kazuki.ohta@gmail.com>
73
+ # This section is a workaround to set strict_read and strict_write option.
74
+ # Ruby-Thrift 0.7 set them both 'true' in default, but Flume protocol set
75
+ # them both 'false'.
76
+ protocol_factory = Thrift::BinaryProtocolFactory.new
77
+ protocol_factory.instance_eval {|obj|
78
+ def get_protocol(trans) # override
79
+ return Thrift::BinaryProtocol.new(trans,
80
+ strict_read=false,
81
+ strict_write=false)
82
+ end
83
+ }
84
+
85
+ case @server_type
86
+ when 'simple'
87
+ @server = Thrift::SimpleServer.new processor, @transport, transport_factory, protocol_factory
88
+ when 'threaded'
89
+ @server = Thrift::ThreadedServer.new processor, @transport, transport_factory, protocol_factory
90
+ when 'thread_pool'
91
+ @server = Thrift::ThreadPoolServer.new processor, @transport, transport_factory, protocol_factory
92
+ else
93
+ raise ConfigError, "in_flume: unsupported server_type '#{@server_type}'"
94
+ end
95
+ @thread = Thread.new(&method(:run))
70
96
  end
71
97
 
72
- unless ['text', 'json'].include? @msg_format
73
- raise 'Unknown format: msg_format=#{@msg_format}'
98
+ def shutdown
99
+ @transport.close unless @transport.closed?
100
+ #@thread.join
74
101
  end
75
102
 
76
- # 2011/09/29 Kazuki Ohta <kazuki.ohta@gmail.com>
77
- # This section is a workaround to set strict_read and strict_write option.
78
- # Ruby-Thrift 0.7 set them both 'true' in default, but Flume protocol set
79
- # them both 'false'.
80
- protocol_factory = Thrift::BinaryProtocolFactory.new
81
- protocol_factory.instance_eval {|obj|
82
- def get_protocol(trans) # override
83
- return Thrift::BinaryProtocol.new(trans,
84
- strict_read=false,
85
- strict_write=false)
86
- end
87
- }
88
-
89
- case @server_type
90
- when 'simple'
91
- @server = Thrift::SimpleServer.new processor, @transport, transport_factory, protocol_factory
92
- when 'threaded'
93
- @server = Thrift::ThreadedServer.new processor, @transport, transport_factory, protocol_factory
94
- when 'thread_pool'
95
- @server = Thrift::ThreadPoolServer.new processor, @transport, transport_factory, protocol_factory
96
- else
97
- raise ConfigError, "in_flume: unsupported server_type '#{@server_type}'"
103
+ def run
104
+ log.debug "starting server: #{@server}"
105
+ @server.serve
106
+ rescue
107
+ log.error "unexpected error", :error=>$!.to_s
108
+ log.error_backtrace
98
109
  end
99
- @thread = Thread.new(&method(:run))
100
- end
101
110
 
102
- def shutdown
103
- @transport.close unless @transport.closed?
104
- #@thread.join
105
- end
106
-
107
- def run
108
- log.debug "starting server: #{@server}"
109
- @server.serve
110
- rescue
111
- log.error "unexpected error", :error=>$!.to_s
112
- log.error_backtrace
113
- end
114
-
115
- class FluentFlumeHandler
116
- attr_accessor :tag_field
117
- attr_accessor :default_tag
118
- attr_accessor :add_prefix
119
- attr_accessor :msg_format
120
- attr_accessor :log
121
-
122
- def append(evt)
123
- begin
124
- record = create_record(evt)
125
- if @tag_field
126
- tag = evt.fieldss[@tag_field] || @default_tag
127
- unless tag
128
- return # ignore
111
+ class FluentFlumeHandler
112
+ attr_accessor :tag_field
113
+ attr_accessor :default_tag
114
+ attr_accessor :add_prefix
115
+ attr_accessor :msg_format
116
+ attr_accessor :log
117
+ attr_accessor :router
118
+
119
+ def append(evt)
120
+ begin
121
+ record = create_record(evt)
122
+ if @tag_field
123
+ tag = evt.fieldss[@tag_field] || @default_tag
124
+ unless tag
125
+ return # ignore
126
+ end
127
+ else
128
+ tag = @default_tag
129
129
  end
130
- else
131
- tag = @default_tag
132
- end
133
- timestamp = evt.timestamp.to_i
134
- if @add_prefix
135
- Engine.emit(@add_prefix + '.' + tag, timestamp, record)
136
- else
137
- Engine.emit(tag, timestamp, record)
130
+ timestamp = evt.timestamp.to_i
131
+ if @add_prefix
132
+ router.emit(@add_prefix + '.' + tag, timestamp, record)
133
+ else
134
+ router.emit(tag, timestamp, record)
135
+ end
136
+ rescue => e
137
+ log.error "unexpected error", :error=>$!.to_s
138
+ log.error_backtrace
138
139
  end
139
- rescue => e
140
- log.error "unexpected error", :error=>$!.to_s
141
- log.error_backtrace
142
140
  end
143
- end
144
141
 
145
- def rawAppend(evt)
146
- log.error "rawAppend is not implemented yet: #{evt}"
147
- end
142
+ def rawAppend(evt)
143
+ log.error "rawAppend is not implemented yet: #{evt}"
144
+ end
148
145
 
149
- def ackedAppend(evt)
150
- begin
151
- record = create_record(evt)
152
- if @tag_field
153
- tag = evt.fieldss[@tag_field] || @default_tag
154
- unless tag
155
- return # ignore
146
+ def ackedAppend(evt)
147
+ begin
148
+ record = create_record(evt)
149
+ if @tag_field
150
+ tag = evt.fieldss[@tag_field] || @default_tag
151
+ unless tag
152
+ return # ignore
153
+ end
154
+ else
155
+ tag = @default_tag
156
156
  end
157
- else
158
- tag = @default_tag
159
- end
160
- timestamp = evt.timestamp.to_i
161
- if @add_prefix
162
- Engine.emit(@add_prefix + '.' + tag, timestamp, record)
163
- else
164
- Engine.emit(tag, timestamp, record)
157
+ timestamp = evt.timestamp.to_i
158
+ if @add_prefix
159
+ router.emit(@add_prefix + '.' + tag, timestamp, record)
160
+ else
161
+ router.emit(tag, timestamp, record)
162
+ end
163
+ return EventStatus::ACK
164
+ rescue => e
165
+ log.error "unexpected error", :error=>$!.to_s
166
+ log.error_backtrace
167
+ return EventStatus::ERR
165
168
  end
166
- return EventStatus::ACK
167
- rescue => e
168
- log.error "unexpected error", :error=>$!.to_s
169
- log.error_backtrace
170
- return EventStatus::ERR
171
169
  end
172
- end
173
170
 
174
- def close()
175
- end
171
+ def close()
172
+ end
176
173
 
177
- private
178
- def create_record(evt)
179
- case @msg_format
180
- when 'text'
181
- return {'message'=>evt.body.force_encoding('UTF-8')}
182
- when 'json'
183
- js = JSON.parse(evt.body.force_encoding('UTF-8'))
184
- raise 'body must be a Hash, if json_body=true' unless js.is_a?(Hash)
185
- return js
186
- else
187
- raise 'Invalid format: #{@msg_format}'
174
+ private
175
+ def create_record(evt)
176
+ case @msg_format
177
+ when 'text'
178
+ return {'message'=>evt.body.force_encoding('UTF-8')}
179
+ when 'json'
180
+ js = JSON.parse(evt.body.force_encoding('UTF-8'))
181
+ raise 'body must be a Hash, if json_body=true' unless js.is_a?(Hash)
182
+ return js
183
+ else
184
+ raise 'Invalid format: #{@msg_format}'
185
+ end
188
186
  end
189
187
  end
190
188
  end
191
189
  end
192
-
193
- end
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Licensed to Cloudera, Inc. under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. Cloudera, Inc. licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+ # flume.thrift
19
+ #
20
+ # This thrift interface and service defines a network transport mechanism to move events
21
+ # from one process/machine to another. At the moment this mirrors the fields of an event
22
+ # as defined in c.c.f.core.Event.java's code .
23
+ #
24
+ # This may change more fields are likely to be added, and the actual format is subject to change.
25
+
26
+ # The server has two rpc methods
27
+ # -- append: which sends an event to the server,
28
+ # -- close: shuts down this client's connection
29
+ #
30
+ # Currently append is oneway, requiring the thrift server to do flow control.
31
+
32
+ namespace java com.cloudera.flume.handlers.thrift
33
+
34
+ typedef i64 Timestamp
35
+
36
+ enum Priority {
37
+ FATAL = 0,
38
+ ERROR = 1,
39
+ WARN = 2,
40
+ INFO = 3,
41
+ DEBUG = 4,
42
+ TRACE = 5
43
+ }
44
+
45
+ enum EventStatus {
46
+ ACK = 0,
47
+ COMMITED = 1,
48
+ ERR = 2
49
+ }
50
+
51
+ struct ThriftFlumeEvent {
52
+ 1: Timestamp timestamp,
53
+ 2: Priority priority,
54
+ 3: binary body,
55
+ 4: i64 nanos,
56
+ 5: string host,
57
+ 6: map<string,binary> fieldss
58
+ }
59
+
60
+ # Instead of using thrift's serialization, we just assume the contents are serialized already.
61
+ struct RawEvent {
62
+ 1: binary raw
63
+ }
64
+
65
+ service ThriftFlumeEventServer {
66
+ oneway void append( 1:ThriftFlumeEvent evt ),
67
+ oneway void rawAppend( 1:RawEvent evt),
68
+ EventStatus ackedAppend( 1: ThriftFlumeEvent evt ),
69
+
70
+ void close(),
71
+ }
72
+
@@ -0,0 +1,8 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'flume_types'
@@ -0,0 +1,72 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+
9
+ module Priority
10
+ FATAL = 0
11
+ ERROR = 1
12
+ WARN = 2
13
+ INFO = 3
14
+ DEBUG = 4
15
+ TRACE = 5
16
+ VALUE_MAP = {0 => "FATAL", 1 => "ERROR", 2 => "WARN", 3 => "INFO", 4 => "DEBUG", 5 => "TRACE"}
17
+ VALID_VALUES = Set.new([FATAL, ERROR, WARN, INFO, DEBUG, TRACE]).freeze
18
+ end
19
+
20
+ module EventStatus
21
+ ACK = 0
22
+ COMMITED = 1
23
+ ERR = 2
24
+ VALUE_MAP = {0 => "ACK", 1 => "COMMITED", 2 => "ERR"}
25
+ VALID_VALUES = Set.new([ACK, COMMITED, ERR]).freeze
26
+ end
27
+
28
+ class ThriftFlumeEvent
29
+ include ::Thrift::Struct, ::Thrift::Struct_Union
30
+ TIMESTAMP = 1
31
+ PRIORITY = 2
32
+ BODY = 3
33
+ NANOS = 4
34
+ HOST = 5
35
+ FIELDSS = 6
36
+
37
+ FIELDS = {
38
+ TIMESTAMP => {:type => ::Thrift::Types::I64, :name => 'timestamp'},
39
+ PRIORITY => {:type => ::Thrift::Types::I32, :name => 'priority', :enum_class => ::Priority},
40
+ BODY => {:type => ::Thrift::Types::STRING, :name => 'body', :binary => true},
41
+ NANOS => {:type => ::Thrift::Types::I64, :name => 'nanos'},
42
+ HOST => {:type => ::Thrift::Types::STRING, :name => 'host'},
43
+ FIELDSS => {:type => ::Thrift::Types::MAP, :name => 'fieldss', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING, :binary => true}}
44
+ }
45
+
46
+ def struct_fields; FIELDS; end
47
+
48
+ def validate
49
+ unless @priority.nil? || ::Priority::VALID_VALUES.include?(@priority)
50
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field priority!')
51
+ end
52
+ end
53
+
54
+ ::Thrift::Struct.generate_accessors self
55
+ end
56
+
57
+ class RawEvent
58
+ include ::Thrift::Struct, ::Thrift::Struct_Union
59
+ RAW = 1
60
+
61
+ FIELDS = {
62
+ RAW => {:type => ::Thrift::Types::STRING, :name => 'raw', :binary => true}
63
+ }
64
+
65
+ def struct_fields; FIELDS; end
66
+
67
+ def validate
68
+ end
69
+
70
+ ::Thrift::Struct.generate_accessors self
71
+ end
72
+
@@ -0,0 +1,219 @@
1
+ #
2
+ # Autogenerated by Thrift Compiler (0.9.3)
3
+ #
4
+ # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
+ #
6
+
7
+ require 'thrift'
8
+ require 'flume_types'
9
+
10
+ module ThriftFlumeEventServer
11
+ class Client
12
+ include ::Thrift::Client
13
+
14
+ def append(evt)
15
+ send_append(evt)
16
+ end
17
+
18
+ def send_append(evt)
19
+ send_oneway_message('append', Append_args, :evt => evt)
20
+ end
21
+ def rawAppend(evt)
22
+ send_rawAppend(evt)
23
+ end
24
+
25
+ def send_rawAppend(evt)
26
+ send_oneway_message('rawAppend', RawAppend_args, :evt => evt)
27
+ end
28
+ def ackedAppend(evt)
29
+ send_ackedAppend(evt)
30
+ return recv_ackedAppend()
31
+ end
32
+
33
+ def send_ackedAppend(evt)
34
+ send_message('ackedAppend', AckedAppend_args, :evt => evt)
35
+ end
36
+
37
+ def recv_ackedAppend()
38
+ result = receive_message(AckedAppend_result)
39
+ return result.success unless result.success.nil?
40
+ raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'ackedAppend failed: unknown result')
41
+ end
42
+
43
+ def close()
44
+ send_close()
45
+ recv_close()
46
+ end
47
+
48
+ def send_close()
49
+ send_message('close', Close_args)
50
+ end
51
+
52
+ def recv_close()
53
+ result = receive_message(Close_result)
54
+ return
55
+ end
56
+
57
+ end
58
+
59
+ class Processor
60
+ include ::Thrift::Processor
61
+
62
+ def process_append(seqid, iprot, oprot)
63
+ args = read_args(iprot, Append_args)
64
+ @handler.append(args.evt)
65
+ return
66
+ end
67
+
68
+ def process_rawAppend(seqid, iprot, oprot)
69
+ args = read_args(iprot, RawAppend_args)
70
+ @handler.rawAppend(args.evt)
71
+ return
72
+ end
73
+
74
+ def process_ackedAppend(seqid, iprot, oprot)
75
+ args = read_args(iprot, AckedAppend_args)
76
+ result = AckedAppend_result.new()
77
+ result.success = @handler.ackedAppend(args.evt)
78
+ write_result(result, oprot, 'ackedAppend', seqid)
79
+ end
80
+
81
+ def process_close(seqid, iprot, oprot)
82
+ args = read_args(iprot, Close_args)
83
+ result = Close_result.new()
84
+ @handler.close()
85
+ write_result(result, oprot, 'close', seqid)
86
+ end
87
+
88
+ end
89
+
90
+ # HELPER FUNCTIONS AND STRUCTURES
91
+
92
+ class Append_args
93
+ include ::Thrift::Struct, ::Thrift::Struct_Union
94
+ EVT = 1
95
+
96
+ FIELDS = {
97
+ EVT => {:type => ::Thrift::Types::STRUCT, :name => 'evt', :class => ::ThriftFlumeEvent}
98
+ }
99
+
100
+ def struct_fields; FIELDS; end
101
+
102
+ def validate
103
+ end
104
+
105
+ ::Thrift::Struct.generate_accessors self
106
+ end
107
+
108
+ class Append_result
109
+ include ::Thrift::Struct, ::Thrift::Struct_Union
110
+
111
+ FIELDS = {
112
+
113
+ }
114
+
115
+ def struct_fields; FIELDS; end
116
+
117
+ def validate
118
+ end
119
+
120
+ ::Thrift::Struct.generate_accessors self
121
+ end
122
+
123
+ class RawAppend_args
124
+ include ::Thrift::Struct, ::Thrift::Struct_Union
125
+ EVT = 1
126
+
127
+ FIELDS = {
128
+ EVT => {:type => ::Thrift::Types::STRUCT, :name => 'evt', :class => ::RawEvent}
129
+ }
130
+
131
+ def struct_fields; FIELDS; end
132
+
133
+ def validate
134
+ end
135
+
136
+ ::Thrift::Struct.generate_accessors self
137
+ end
138
+
139
+ class RawAppend_result
140
+ include ::Thrift::Struct, ::Thrift::Struct_Union
141
+
142
+ FIELDS = {
143
+
144
+ }
145
+
146
+ def struct_fields; FIELDS; end
147
+
148
+ def validate
149
+ end
150
+
151
+ ::Thrift::Struct.generate_accessors self
152
+ end
153
+
154
+ class AckedAppend_args
155
+ include ::Thrift::Struct, ::Thrift::Struct_Union
156
+ EVT = 1
157
+
158
+ FIELDS = {
159
+ EVT => {:type => ::Thrift::Types::STRUCT, :name => 'evt', :class => ::ThriftFlumeEvent}
160
+ }
161
+
162
+ def struct_fields; FIELDS; end
163
+
164
+ def validate
165
+ end
166
+
167
+ ::Thrift::Struct.generate_accessors self
168
+ end
169
+
170
+ class AckedAppend_result
171
+ include ::Thrift::Struct, ::Thrift::Struct_Union
172
+ SUCCESS = 0
173
+
174
+ FIELDS = {
175
+ SUCCESS => {:type => ::Thrift::Types::I32, :name => 'success', :enum_class => ::EventStatus}
176
+ }
177
+
178
+ def struct_fields; FIELDS; end
179
+
180
+ def validate
181
+ unless @success.nil? || ::EventStatus::VALID_VALUES.include?(@success)
182
+ raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field success!')
183
+ end
184
+ end
185
+
186
+ ::Thrift::Struct.generate_accessors self
187
+ end
188
+
189
+ class Close_args
190
+ include ::Thrift::Struct, ::Thrift::Struct_Union
191
+
192
+ FIELDS = {
193
+
194
+ }
195
+
196
+ def struct_fields; FIELDS; end
197
+
198
+ def validate
199
+ end
200
+
201
+ ::Thrift::Struct.generate_accessors self
202
+ end
203
+
204
+ class Close_result
205
+ include ::Thrift::Struct, ::Thrift::Struct_Union
206
+
207
+ FIELDS = {
208
+
209
+ }
210
+
211
+ def struct_fields; FIELDS; end
212
+
213
+ def validate
214
+ end
215
+
216
+ ::Thrift::Struct.generate_accessors self
217
+ end
218
+
219
+ end
@@ -19,91 +19,90 @@
19
19
  require 'fluent/output'
20
20
 
21
21
  module Fluent
22
+ class FlumeOutput < BufferedOutput
23
+ Fluent::Plugin.register_output('flume', self)
24
+
25
+ config_param :host, :string, :default => 'localhost'
26
+ config_param :port, :integer, :default => 35863
27
+ config_param :timeout, :integer, :default => 30
28
+ config_param :remove_prefix, :string, :default => nil
29
+ config_param :default_category, :string, :default => 'unknown'
30
+ desc "The format of the thrift body. (default: json)"
31
+ config_param :format, :string, default: 'json'
32
+ config_param :trim_nl, :bool, default: true
33
+
34
+ unless method_defined?(:log)
35
+ define_method(:log) { $log }
36
+ end
22
37
 
23
- class FlumeOutput < BufferedOutput
24
- Fluent::Plugin.register_output('flume', self)
25
-
26
- config_param :host, :string, :default => 'localhost'
27
- config_param :port, :integer, :default => 35863
28
- config_param :timeout, :integer, :default => 30
29
- config_param :remove_prefix, :string, :default => nil
30
- config_param :default_category, :string, :default => 'unknown'
31
- desc "The format of the thrift body. (default: json)"
32
- config_param :format, :string, default: 'json'
33
- config_param :trim_nl, :bool, default: true
34
-
35
- unless method_defined?(:log)
36
- define_method(:log) { $log }
37
- end
38
-
39
- def initialize
40
- require 'thrift'
41
- $:.unshift File.join(File.dirname(__FILE__), 'thrift')
42
- require 'flume_types'
43
- require 'flume_constants'
44
- require 'thrift_source_protocol'
45
- super
46
- end
38
+ def initialize
39
+ require 'thrift'
40
+ require 'fluent/plugin/thrift/flume_types'
41
+ $:.unshift File.join(File.dirname(__FILE__), 'thrift')
42
+ require 'flume_constants'
43
+ require 'thrift_source_protocol'
44
+ super
45
+ end
47
46
 
48
- def configure(conf)
49
- # override default buffer_chunk_limit
50
- conf['buffer_chunk_limit'] ||= '1m'
47
+ def configure(conf)
48
+ # override default buffer_chunk_limit
49
+ conf['buffer_chunk_limit'] ||= '1m'
51
50
 
52
- super
51
+ super
53
52
 
54
- @formatter = Plugin.new_formatter(@format)
55
- @formatter.configure(conf)
56
- end
53
+ @formatter = Plugin.new_formatter(@format)
54
+ @formatter.configure(conf)
55
+ end
57
56
 
58
- def start
59
- super
57
+ def start
58
+ super
60
59
 
61
- if @remove_prefix
62
- @removed_prefix_string = @remove_prefix + '.'
63
- @removed_length = @removed_prefix_string.length
60
+ if @remove_prefix
61
+ @removed_prefix_string = @remove_prefix + '.'
62
+ @removed_length = @removed_prefix_string.length
63
+ end
64
64
  end
65
- end
66
-
67
- def shutdown
68
- super
69
- end
70
65
 
71
- def format(tag, time, record)
72
- if @remove_prefix and
73
- ((tag[0, @removed_length] == @removed_prefix_string and tag.length > @removed_length) or tag == @remove_prefix)
74
- tag = (tag[@removed_length..-1] || @default_category)
66
+ def emit(tag, es, chain)
67
+ if @remove_prefix and
68
+ ((tag[0, @removed_length] == @removed_prefix_string and tag.length > @removed_length) or tag == @remove_prefix)
69
+ tag = (tag[@removed_length..-1] || @default_category)
70
+ end
71
+ super(tag, es, chain, tag)
75
72
  end
76
- fr = @formatter.format(tag, time, record)
77
- fr.chomp! if @trim_nl
78
- [tag, time, fr].to_msgpack
79
- end
80
73
 
81
- def write(chunk)
82
- socket = Thrift::Socket.new @host, @port, @timeout
83
- transport = Thrift::FramedTransport.new socket
84
- #protocol = Thrift::BinaryProtocol.new transport, false, false
85
- protocol = Thrift::CompactProtocol.new transport
86
- client = ThriftSourceProtocol::Client.new protocol
74
+ def format(tag, time, record)
75
+ fr = @formatter.format(tag, time, record)
76
+ fr.chomp! if @trim_nl
77
+ [time, fr].to_msgpack
78
+ end
87
79
 
88
- count = 0
89
- header = {}
90
- transport.open
91
- log.debug "thrift client opened: #{client}"
92
- begin
93
- chunk.msgpack_each { |tag, time, record|
94
- header['timestamp'.freeze] = time.to_s
95
- header['tag'.freeze] = tag
96
- entry = ThriftFlumeEvent.new(:body => record.force_encoding('UTF-8'),
97
- :headers => header)
98
- client.append entry
99
- count += 1
100
- }
101
- log.debug "Writing #{count} entries to flume"
102
- ensure
103
- log.debug "thrift client closing: #{client}"
104
- transport.close
80
+ def write(chunk)
81
+ socket = Thrift::Socket.new @host, @port, @timeout
82
+ transport = Thrift::FramedTransport.new socket
83
+ #protocol = Thrift::BinaryProtocol.new transport, false, false
84
+ protocol = Thrift::CompactProtocol.new transport
85
+ client = ThriftSourceProtocol::Client.new protocol
86
+
87
+ tag = chunk.key
88
+ count = 0
89
+ header = {}
90
+ transport.open
91
+ log.debug "thrift client opened: #{client}"
92
+ begin
93
+ chunk.msgpack_each { |time, record|
94
+ header['timestamp'.freeze] = time.to_s
95
+ header['tag'.freeze] = tag
96
+ entry = ThriftFlumeEvent.new(:body => record.force_encoding('UTF-8'),
97
+ :headers => header)
98
+ client.append entry
99
+ count += 1
100
+ }
101
+ log.debug "Writing #{count} entries to flume"
102
+ ensure
103
+ log.debug "thrift client closing: #{client}"
104
+ transport.close
105
+ end
105
106
  end
106
107
  end
107
108
  end
108
-
109
- end
@@ -160,9 +160,9 @@ class FlumeInputTest < Test::Unit::TestCase
160
160
  def test_message_format_json
161
161
  d = create_driver(CONFIG + %[
162
162
  tag_field category
163
- message_format json
163
+ msg_format json
164
164
  ])
165
- assert_equal 'json', d.instance.message_format
165
+ assert_equal 'json', d.instance.msg_format
166
166
 
167
167
  time = Time.parse("2011-01-02 13:14:15 UTC").to_i
168
168
  Fluent::Engine.now = time
@@ -185,8 +185,6 @@ class FlumeInputTest < Test::Unit::TestCase
185
185
  end
186
186
 
187
187
  def setup
188
- omit("Latest flume thrift protocol does not have event server.")
189
-
190
188
  Fluent::FlumeInput.new
191
189
  Fluent::Test.setup
192
190
  end
@@ -41,9 +41,8 @@ class FlumeOutputTest < Test::Unit::TestCase
41
41
  d = create_driver
42
42
  d.emit({"k11"=>"v11", "k12"=>"v12"}, time)
43
43
  d.emit({"k21"=>"v21", "k22"=>"v22"}, time)
44
- puts ({"k11" => "v11", "k12" => "v12"}.to_json)
45
- d.expect_format [d.tag, time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
46
- d.expect_format [d.tag, time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
44
+ d.expect_format [time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
45
+ d.expect_format [time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
47
46
  d.run
48
47
 
49
48
  d = create_driver(CONFIG + %[
@@ -53,8 +52,8 @@ class FlumeOutputTest < Test::Unit::TestCase
53
52
 
54
53
  d.emit({"k11"=>"v11", "k12"=>"v12"}, time)
55
54
  d.emit({"k21"=>"v21", "k22"=>"v22"}, time)
56
- d.expect_format ['flumeplugin', time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
57
- d.expect_format ['flumeplugin', time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
55
+ d.expect_format [time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
56
+ d.expect_format [time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
58
57
  d.run
59
58
 
60
59
  d = create_driver(CONFIG + %[
@@ -62,7 +61,7 @@ class FlumeOutputTest < Test::Unit::TestCase
62
61
  ], 'xxx.test.flumeplugin')
63
62
  assert_equal 'xxx.test.flumeplugin', d.tag
64
63
  d.emit({"k11"=>"v11", "k12"=>"v12"}, time)
65
- d.expect_format ['xxx.test.flumeplugin', time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
64
+ d.expect_format [time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
66
65
  d.run
67
66
 
68
67
  d = create_driver(CONFIG + %[
@@ -70,7 +69,7 @@ class FlumeOutputTest < Test::Unit::TestCase
70
69
  ], 'test')
71
70
  assert_equal 'test', d.tag
72
71
  d.emit({"k11"=>"v11", "k12"=>"v12"}, time)
73
- d.expect_format ['unknown', time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
72
+ d.expect_format [time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
74
73
  d.run
75
74
 
76
75
  d = create_driver(CONFIG + %[
@@ -79,8 +78,8 @@ class FlumeOutputTest < Test::Unit::TestCase
79
78
  assert_equal 'test.flumeplugin', d.tag
80
79
  d.emit({"k11"=>"v11", "k12"=>"v12"}, time)
81
80
  d.emit({"k21"=>"v21", "k22"=>"v22"}, time)
82
- d.expect_format ['flumeplugin', time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
83
- d.expect_format ['flumeplugin', time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
81
+ d.expect_format [time, {"k11"=>"v11", "k12"=>"v12"}.to_json].to_msgpack
82
+ d.expect_format [time, {"k21"=>"v21", "k22"=>"v22"}.to_json].to_msgpack
84
83
  d.run
85
84
  end
86
85
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-flume
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muga Nishizawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-24 00:00:00.000000000 Z
11
+ date: 2016-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -86,6 +86,10 @@ files:
86
86
  - example-out-flume.conf
87
87
  - fluent-plugin-flume.gemspec
88
88
  - lib/fluent/plugin/in_flume.rb
89
+ - lib/fluent/plugin/old_thrift/flume.thrift
90
+ - lib/fluent/plugin/old_thrift/flume_constants.rb
91
+ - lib/fluent/plugin/old_thrift/flume_types.rb
92
+ - lib/fluent/plugin/old_thrift/thrift_flume_event_server.rb
89
93
  - lib/fluent/plugin/out_flume.rb
90
94
  - lib/fluent/plugin/thrift/flume.thrift
91
95
  - lib/fluent/plugin/thrift/flume.thrift.orig