fluent-plugin-buffered-resque 1.0.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/.gitignore +5 -0
- data/.travis.yml +5 -0
- data/AUTHORS +1 -0
- data/Gemfile +5 -0
- data/README.rdoc +26 -0
- data/Rakefile +17 -0
- data/VERSION +1 -0
- data/fluent-plugin-buffered-resque.gemspec +25 -0
- data/lib/fluent/plugin/out_buffered_resque.rb +107 -0
- data/test/plugin/out_resque.rb +73 -0
- data/test/test_helper.rb +20 -0
- metadata +142 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3a22892fefa524a310d6c88abebba487cd95617a
|
4
|
+
data.tar.gz: 14a1cb1c2d1140a28ebcb95049ed23948f50327f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 393fc7b84dc4b6cb880a54153246e8a11274814a8d575e7d20974c72777daf148701beaba07e03eef4dc4f664209f582fb691818f9b6158ff47bc81c1c2332a9
|
7
|
+
data.tar.gz: 8bff4e477eebf3c08312cddde26b0669085c6a3d7b7271e6f47954798c416e41266be0f69e5132a39229bf5e5d6dc4a2373cdefc74caf61bd882a08d5c0e7285
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/AUTHORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Yuichi Tateno <hotchpotch _at_ gmail.com>
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= Fluent event to Resque queue plugin
|
2
|
+
|
3
|
+
= Installation
|
4
|
+
|
5
|
+
$ fluent-gem install fluent-plugin-buffered-resque
|
6
|
+
|
7
|
+
= Usage
|
8
|
+
|
9
|
+
<match resque>
|
10
|
+
type resque
|
11
|
+
redis hostname:port/namespace
|
12
|
+
queue file_serve
|
13
|
+
worker_class MyClass
|
14
|
+
bulk_queuing true
|
15
|
+
</match>
|
16
|
+
|
17
|
+
fluent_logger.post('resque', {
|
18
|
+
:user_id => xxx,
|
19
|
+
:body => yyy
|
20
|
+
})
|
21
|
+
#=> enqueue ('file_serve', 'MyClass', {:user_id => xxx, :body => yyy})
|
22
|
+
|
23
|
+
= Copyright
|
24
|
+
|
25
|
+
Copyright:: Copyright (c) 2012- Yuichi Tateno
|
26
|
+
License:: Apache License, Version 2.0
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
Rake::TestTask.new(:test) do |test|
|
7
|
+
test.libs << 'lib' << 'test'
|
8
|
+
test.test_files = FileList['test/plugin/*.rb']
|
9
|
+
test.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task :coverage do |t|
|
13
|
+
ENV['SIMPLE_COV'] = '1'
|
14
|
+
Rake::Task["test"].invoke
|
15
|
+
end
|
16
|
+
|
17
|
+
task :default => [:build]
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "fluent-plugin-buffered-resque"
|
6
|
+
gem.description = "Resque output plugin for fluent event collector. Has extra features like buffering and setting a worker class in the config."
|
7
|
+
gem.homepage = "https://github.com/hfwang/fluent-plugin-buffered-resque"
|
8
|
+
gem.summary = gem.description
|
9
|
+
gem.version = File.read("VERSION").strip
|
10
|
+
gem.authors = ["Hsiu-Fan Wang", "Yuichi Tateno"]
|
11
|
+
gem.email = "hfwang@porkbuns.net"
|
12
|
+
gem.has_rdoc = false
|
13
|
+
gem.files = `git ls-files`.split("\n")
|
14
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
gem.require_paths = ['lib']
|
17
|
+
|
18
|
+
gem.add_dependency "fluentd", ">= 0.10.8"
|
19
|
+
gem.add_dependency "multi_json", "~> 1.0"
|
20
|
+
gem.add_dependency "redis-namespace", ">= 1.0.2"
|
21
|
+
|
22
|
+
gem.add_development_dependency "rake", ">= 0.9.2"
|
23
|
+
gem.add_development_dependency "simplecov", ">= 0.5.4"
|
24
|
+
gem.add_development_dependency "rr", ">= 1.0.0"
|
25
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
|
2
|
+
module Fluent
|
3
|
+
class BufferedResqueOutput < BufferedOutput
|
4
|
+
Fluent::Plugin.register_output('buffered_resque', self)
|
5
|
+
|
6
|
+
include SetTagKeyMixin
|
7
|
+
config_set_default :include_tag_key, false
|
8
|
+
|
9
|
+
include SetTimeKeyMixin
|
10
|
+
config_set_default :include_time_key, true
|
11
|
+
|
12
|
+
config_param :queue, :string
|
13
|
+
config_param :redis, :string, :default => nil
|
14
|
+
config_param :worker_class_name_tag, :string, :default => 'class'
|
15
|
+
config_param :worker_class, :string, :default => nil
|
16
|
+
config_param :bulk_queueing, :bool, :default => false
|
17
|
+
|
18
|
+
# Define `log` method for v0.10.42 or earlier
|
19
|
+
unless method_defined?(:log)
|
20
|
+
define_method("log") { $log }
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
super
|
25
|
+
require 'multi_json'
|
26
|
+
require 'redis'
|
27
|
+
require 'redis-namespace'
|
28
|
+
end
|
29
|
+
|
30
|
+
def configure(conf)
|
31
|
+
super
|
32
|
+
|
33
|
+
@worker_class_name_tag = conf['worker_class_name_tag'] || 'class'
|
34
|
+
@worker_class = conf['worker_class']
|
35
|
+
self.redis = conf['redis'] if conf['redis']
|
36
|
+
end
|
37
|
+
|
38
|
+
# code from resque.rb
|
39
|
+
def redis=(server)
|
40
|
+
case server
|
41
|
+
when String
|
42
|
+
if server =~ /redis\:\/\//
|
43
|
+
redis = Redis.connect(:url => server, :thread_safe => true)
|
44
|
+
else
|
45
|
+
server, namespace = server.split('/', 2)
|
46
|
+
host, port, db = server.split(':')
|
47
|
+
redis = Redis.new(:host => host, :port => port,
|
48
|
+
:thread_safe => true, :db => db)
|
49
|
+
end
|
50
|
+
namespace ||= :resque
|
51
|
+
|
52
|
+
@redis = Redis::Namespace.new(namespace, :redis => redis)
|
53
|
+
when Redis::Namespace
|
54
|
+
@redis = server
|
55
|
+
else
|
56
|
+
@redis = Redis::Namespace.new(:resque, :redis => server)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def redis
|
61
|
+
return @redis if @redis && !@redis.kind_of?(String)
|
62
|
+
self.redis = Redis.respond_to?(:connect) ? Redis.connect : "localhost:6379"
|
63
|
+
self.redis
|
64
|
+
end
|
65
|
+
|
66
|
+
def enqueue(queue, klass, args)
|
67
|
+
redis.sadd(:queues, queue.to_s)
|
68
|
+
redis.rpush("queue:#{queue}", ::MultiJson.encode(:class => klass, :args => [args]))
|
69
|
+
end
|
70
|
+
|
71
|
+
def start
|
72
|
+
super
|
73
|
+
end
|
74
|
+
|
75
|
+
def shutdown
|
76
|
+
super
|
77
|
+
end
|
78
|
+
|
79
|
+
def format(tag, time, record)
|
80
|
+
[tag, time, record].to_msgpack
|
81
|
+
end
|
82
|
+
|
83
|
+
def write(chunk)
|
84
|
+
queue_name = @queue_mapped ? chunk.key : @queue
|
85
|
+
|
86
|
+
if klass = @worker_class and @bulk_queueing
|
87
|
+
records = []
|
88
|
+
chunk.msgpack_each {|tag, time, record|
|
89
|
+
record.delete(@worker_class_name_tag)
|
90
|
+
records << record
|
91
|
+
}
|
92
|
+
log.debug("Flushing #{records.size} records to #{queue_name}:#{klass}")
|
93
|
+
enqueue(queue_name, klass, records)
|
94
|
+
else
|
95
|
+
chunk.msgpack_each {|tag, time, record|
|
96
|
+
klass = @worker_class || record.delete(@worker_class_name_tag)
|
97
|
+
if klass && !klass.empty?
|
98
|
+
log.debug("Enqueuing one record to #{queue_name}:#{klass}")
|
99
|
+
enqueue(queue_name, klass, record)
|
100
|
+
else
|
101
|
+
log.error("Neither worker_class param nor #{@worker_class_name_tag} record key was supplied.")
|
102
|
+
end
|
103
|
+
}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'fluent/plugin/out_resque'
|
3
|
+
require 'multi_json'
|
4
|
+
|
5
|
+
class ResqueOutputTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
Fluent::Test.setup
|
9
|
+
@subject = Object.new
|
10
|
+
any_instance_of(Fluent::ResqueOutput, :redis= => lambda {}, :redis => @subject)
|
11
|
+
end
|
12
|
+
|
13
|
+
CONFIG = %[
|
14
|
+
type resque
|
15
|
+
queue test_queue
|
16
|
+
time_format %y-%m-%d %H:%M:%S
|
17
|
+
]
|
18
|
+
|
19
|
+
def create_driver(conf = CONFIG)
|
20
|
+
Fluent::Test::BufferedOutputTestDriver.new(Fluent::ResqueOutput) {
|
21
|
+
}.configure(conf)
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_enqueue(queue, klass, args)
|
25
|
+
mock(@subject).sadd(:queues, "test_queue").any_times
|
26
|
+
mock(@subject).rpush("queue:#{queue}", ::MultiJson.encode(:class => klass, :args => [args]))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_write
|
30
|
+
d = create_driver
|
31
|
+
time = Time.at(Time.now.to_i).utc
|
32
|
+
d.emit({'a' => 1, "class" => "WorkerTest"}, time)
|
33
|
+
d.emit({'b' => 2, "class" => "WorkerTest"}, time)
|
34
|
+
check_enqueue("test_queue", "WorkerTest", {"a" => 1, "time" => time.strftime("%y-%m-%d %H:%M:%S")})
|
35
|
+
check_enqueue("test_queue", "WorkerTest", {"b" => 2, "time" => time.strftime("%y-%m-%d %H:%M:%S")})
|
36
|
+
d.run
|
37
|
+
assert_equal true, true
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_write_with_bulk_queueing
|
41
|
+
d = create_driver(CONFIG + "\nworker_class WorkerTest\nbulk_queueing true")
|
42
|
+
time = Time.at(Time.now.to_i).utc
|
43
|
+
d.emit({'a' => 1, "class" => "WorkerTest"}, time)
|
44
|
+
d.emit({'b' => 2, "class" => "WorkerTest"}, time)
|
45
|
+
check_enqueue("test_queue", "WorkerTest", [{"a" => 1, "time" => time.strftime("%y-%m-%d %H:%M:%S")}, {"b" => 2, "time" => time.strftime("%y-%m-%d %H:%M:%S")}])
|
46
|
+
d.run
|
47
|
+
assert_equal true, true
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_write_except_time_key
|
51
|
+
d = create_driver(CONFIG + "\ninclude_time_key false")
|
52
|
+
time = Time.at(Time.now.to_i).utc
|
53
|
+
d.emit({'a' => 1, 'class' => 'WorkerTest'}, time)
|
54
|
+
check_enqueue("test_queue", "WorkerTest", {"a" => 1})
|
55
|
+
d.run
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_write_include_tag_key
|
59
|
+
d = create_driver(CONFIG + "\ninclude_tag_key true")
|
60
|
+
time = Time.at(Time.now.to_i).utc
|
61
|
+
d.emit({'a' => 1, 'class' => 'WorkerTest'}, time)
|
62
|
+
check_enqueue("test_queue", "WorkerTest", {"a" => 1, "tag" => 'test', "time" => time.strftime("%y-%m-%d %H:%M:%S")})
|
63
|
+
d.run
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_write_change_worker_class_name_tag
|
67
|
+
d = create_driver(CONFIG + "\nworker_class_name_tag klass")
|
68
|
+
time = Time.at(Time.now.to_i).utc
|
69
|
+
d.emit({'a' => 1, 'klass' => 'WorkerTest::Test'}, time)
|
70
|
+
check_enqueue("test_queue", "WorkerTest::Test", {"a" => 1, "time" => time.strftime("%y-%m-%d %H:%M:%S")})
|
71
|
+
d.run
|
72
|
+
end
|
73
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'rr'
|
5
|
+
require 'test/unit'
|
6
|
+
class Test::Unit::TestCase
|
7
|
+
include RR::Adapters::TestUnit
|
8
|
+
end
|
9
|
+
|
10
|
+
if ENV['SIMPLE_COV']
|
11
|
+
require 'simplecov'
|
12
|
+
SimpleCov.start do
|
13
|
+
add_filter 'test/'
|
14
|
+
add_filter 'pkg/'
|
15
|
+
add_filter 'vendor/'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'test/unit'
|
20
|
+
require 'fluent/test'
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-buffered-resque
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hsiu-Fan Wang
|
8
|
+
- Yuichi Tateno
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-10-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: fluentd
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.10.8
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.10.8
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: multi_json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: redis-namespace
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.0.2
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.0.2
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.9.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.2
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: simplecov
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.5.4
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.5.4
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rr
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.0.0
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.0.0
|
98
|
+
description: Resque output plugin for fluent event collector. Has extra features like
|
99
|
+
buffering and setting a worker class in the config.
|
100
|
+
email: hfwang@porkbuns.net
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- ".travis.yml"
|
107
|
+
- AUTHORS
|
108
|
+
- Gemfile
|
109
|
+
- README.rdoc
|
110
|
+
- Rakefile
|
111
|
+
- VERSION
|
112
|
+
- fluent-plugin-buffered-resque.gemspec
|
113
|
+
- lib/fluent/plugin/out_buffered_resque.rb
|
114
|
+
- test/plugin/out_resque.rb
|
115
|
+
- test/test_helper.rb
|
116
|
+
homepage: https://github.com/hfwang/fluent-plugin-buffered-resque
|
117
|
+
licenses: []
|
118
|
+
metadata: {}
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.2.2
|
136
|
+
signing_key:
|
137
|
+
specification_version: 4
|
138
|
+
summary: Resque output plugin for fluent event collector. Has extra features like
|
139
|
+
buffering and setting a worker class in the config.
|
140
|
+
test_files:
|
141
|
+
- test/plugin/out_resque.rb
|
142
|
+
- test/test_helper.rb
|