fluent-plugin-buffered-resque 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,5 @@
1
+ /fluent/
2
+ /pkg/
3
+ /coverage/
4
+ /vendor/
5
+ Gemfile.lock
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
4
+
5
+ script: bundle exec rake test
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Yuichi Tateno <hotchpotch _at_ gmail.com>
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ gem "simplecov", :require => false
@@ -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
@@ -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
@@ -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