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.
@@ -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