fluent-plugin-out_rawtcp 0.0.1
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 +15 -0
- data/.gitignore +3 -0
- data/Gemfile +2 -0
- data/README.md +0 -0
- data/Rakefile +10 -0
- data/VERSION +1 -0
- data/fluent-plugin-out_rawtcp.gemspec +22 -0
- data/lib/fluent/plugin/out_rawtcp.rb +125 -0
- data/test/helper.rb +1 -0
- data/test/plugin/test_out_rawtcp.rb +41 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjhmYWYzYTY1NzlmMTVhM2UwYmFjMzExMmZhOTgyZGQ4YThjN2M5Zg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NjU5YmFlMGU4MDZhZjNlYTAwNmUzY2MwMDhmN2M5ZDgwOTk0ZDRjNw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OTE3MDI4ZWE2NTQzZjI4NTgxNDE3MjBkMjgyMmIxODM1MGEwMGJjZjRiMmU2
|
10
|
+
MzM0MDkwNmQ3ZjcyZjgzZGRlZTExNWVlNjMwYTdlYjEyYjk0ODY3NDIyZjg2
|
11
|
+
NjE2YTJlZmI4YTIxMjg1MTUyZTU3NjdjOGJmNTU1Zjc2ZTAxNTQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDE4YjM3NjU2ZDFhMjVkZGZmZjFkNjVhZjRlOWVmMzk3NzJlYzQ5NzYwYjA2
|
14
|
+
NTU5YmZhNTY0OGFmOWRiMjI5ZWM2YTgzYTFlMzYwODEwZWQ2ZDgyYjU4OTBj
|
15
|
+
YjhkMDNiMDNlMTc3YzYzMDc5YmJjNmUxZjViMDg2OTY0NzgwODE=
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
File without changes
|
data/Rakefile
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "fluent-plugin-out_rawtcp"
|
5
|
+
s.version = `cat VERSION`
|
6
|
+
s.authors = ["lxfontes"]
|
7
|
+
s.email = ["lxfontes+rawtcp@gmail.com"]
|
8
|
+
s.description = %q{Raw tcp output plugin for Fluentd}
|
9
|
+
s.summary = %q{output plugin for fluentd}
|
10
|
+
s.homepage = "https://github.com/lxfontes/fluent-plugin-out_rawtcp"
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split($/)
|
14
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
|
18
|
+
s.add_runtime_dependency "fluentd"
|
19
|
+
|
20
|
+
s.add_development_dependency "rake"
|
21
|
+
s.add_development_dependency "webmock"
|
22
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Fluent
|
3
|
+
class RawTcpOutput < BufferedOutput
|
4
|
+
Plugin.register_output('rawtcp', self)
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
require 'socket'
|
9
|
+
require 'timeout'
|
10
|
+
require 'fileutils'
|
11
|
+
@nodes = [] #=> [Node]
|
12
|
+
end
|
13
|
+
|
14
|
+
config_param :send_timeout, :time, :default => 60
|
15
|
+
config_param :connect_timeout, :time, :default => 5
|
16
|
+
attr_reader :nodes
|
17
|
+
|
18
|
+
def configure(conf)
|
19
|
+
super
|
20
|
+
|
21
|
+
conf.elements.each do |e|
|
22
|
+
next if e.name != "server"
|
23
|
+
|
24
|
+
host = e['host']
|
25
|
+
port = e['port']
|
26
|
+
port = port ? port.to_i : DEFAULT_LISTEN_PORT
|
27
|
+
|
28
|
+
name = e['name']
|
29
|
+
unless name
|
30
|
+
name = "#{host}:#{port}"
|
31
|
+
end
|
32
|
+
|
33
|
+
node_conf = RawNodeConfig.new(name, host, port)
|
34
|
+
@nodes << Node.new(log, node_conf)
|
35
|
+
log.info "adding forwarding server '#{name}'", :host=>host, :port=>port
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def start
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def shutdown
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def format(tag, time, record)
|
48
|
+
[tag, time, record].to_msgpack
|
49
|
+
end
|
50
|
+
|
51
|
+
def write(chunk)
|
52
|
+
return if chunk.empty?
|
53
|
+
|
54
|
+
error = nil
|
55
|
+
|
56
|
+
@nodes.each do |node|
|
57
|
+
begin
|
58
|
+
send_data(node, chunk)
|
59
|
+
return
|
60
|
+
rescue
|
61
|
+
error = $!
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
raise error if error
|
66
|
+
raise "No nodes available"
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def send_data(node, chunk)
|
71
|
+
sock = connect(node)
|
72
|
+
begin
|
73
|
+
opt = [1, @send_timeout.to_i].pack('I!I!') # { int l_onoff; int l_linger; }
|
74
|
+
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, opt)
|
75
|
+
|
76
|
+
opt = [@send_timeout.to_i, 0].pack('L!L!') # struct timeval
|
77
|
+
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, opt)
|
78
|
+
|
79
|
+
chunk.msgpack_each do |tag, time, record|
|
80
|
+
next unless record.is_a? Hash
|
81
|
+
sock.write([tag, time, record].to_msgpack)
|
82
|
+
end
|
83
|
+
ensure
|
84
|
+
sock.close
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def connect(node)
|
89
|
+
Timeout.timeout(@connect_timeout) do
|
90
|
+
return TCPSocket.new(node.resolved_host, node.port)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
RawNodeConfig = Struct.new("RawNodeConfig", :name, :host, :port)
|
95
|
+
|
96
|
+
class Node
|
97
|
+
def initialize(log, conf)
|
98
|
+
@log = log
|
99
|
+
@conf = conf
|
100
|
+
@name = @conf.name
|
101
|
+
@host = @conf.host
|
102
|
+
@port = @conf.port
|
103
|
+
resolved_host # check dns
|
104
|
+
end
|
105
|
+
|
106
|
+
attr_reader :conf
|
107
|
+
attr_reader :name, :host, :port
|
108
|
+
attr_accessor :failure, :available
|
109
|
+
|
110
|
+
def available?
|
111
|
+
@available
|
112
|
+
end
|
113
|
+
|
114
|
+
def standby?
|
115
|
+
@conf.standby
|
116
|
+
end
|
117
|
+
|
118
|
+
def resolved_host
|
119
|
+
@sockaddr = Socket.pack_sockaddr_in(@port, @host)
|
120
|
+
port, rhost = Socket.unpack_sockaddr_in(@sockaddr)
|
121
|
+
return rhost
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'minitest/pride'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'fluent/test'
|
4
|
+
require 'fluent/plugin/out_rawtcp'
|
5
|
+
|
6
|
+
require 'webmock/test_unit'
|
7
|
+
require 'date'
|
8
|
+
|
9
|
+
require 'helper'
|
10
|
+
|
11
|
+
$:.push File.expand_path("../lib", __FILE__)
|
12
|
+
$:.push File.dirname(__FILE__)
|
13
|
+
|
14
|
+
WebMock.disable_net_connect!
|
15
|
+
|
16
|
+
class TestRawTcpOutput < Test::Unit::TestCase
|
17
|
+
attr_accessor :index_cmds, :index_command_counts
|
18
|
+
|
19
|
+
def setup
|
20
|
+
Fluent::Test.setup
|
21
|
+
@driver = driver('test', "<server>
|
22
|
+
host 127.0.0.1
|
23
|
+
port 24225
|
24
|
+
</server>")
|
25
|
+
end
|
26
|
+
|
27
|
+
def driver(tag='test', conf='')
|
28
|
+
@driver ||= Fluent::Test::BufferedOutputTestDriver.new(Fluent::RawTcpOutput, tag).configure(conf)
|
29
|
+
end
|
30
|
+
|
31
|
+
def sample_record
|
32
|
+
{'age' => 26, 'request_id' => '42', 'parent_id' => 'parent', 'sub' => {'field'=>{'pos'=>15}}}
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_writes_to_default_index
|
36
|
+
100.times.each do |t|
|
37
|
+
@driver.emit(sample_record)
|
38
|
+
end
|
39
|
+
@driver.run
|
40
|
+
end
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-out_rawtcp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- lxfontes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fluentd
|
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: rake
|
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: webmock
|
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
|
+
description: Raw tcp output plugin for Fluentd
|
56
|
+
email:
|
57
|
+
- lxfontes+rawtcp@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- VERSION
|
67
|
+
- fluent-plugin-out_rawtcp.gemspec
|
68
|
+
- lib/fluent/plugin/out_rawtcp.rb
|
69
|
+
- test/helper.rb
|
70
|
+
- test/plugin/test_out_rawtcp.rb
|
71
|
+
homepage: https://github.com/lxfontes/fluent-plugin-out_rawtcp
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.3.0
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: output plugin for fluentd
|
95
|
+
test_files:
|
96
|
+
- test/helper.rb
|
97
|
+
- test/plugin/test_out_rawtcp.rb
|