fluent-plugin-sqs-check-size 0.1.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: ece7c9d08385f16b07165fa5eff29ac03ad3cb96
4
+ data.tar.gz: ab459560bad394c5c842e296761c8abe6abddace
5
+ SHA512:
6
+ metadata.gz: f33c92c6f95331ecfe50fea093bbfcc124cccb08fc756f6d539a1c9c78c41151a869921925805cf8a81c70b671f59f55c5a7dabb784b71ed97b4523912148d4c
7
+ data.tar.gz: ec3e43ef1f58a3a3130733e27c7f1d3cfa2d3bea53a68956ad27c2ea9bd7634a1cf782ec7a5abfb8ac655ddb6b8e2c12ee4e34cba3e030e16d5ed05c6706b9fb
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Yuri Odagiri <ixixizko _at_ gmail.com>
@@ -0,0 +1,92 @@
1
+ = Amazon SQS output plugin for Fluent
2
+
3
+ == Install
4
+ $ gem install fluent-plugin-sqs
5
+
6
+ == Component
7
+
8
+ === SQSOutput
9
+
10
+ Store fluent-event as queue message to amazon SQS.
11
+
12
+ === SQSInput
13
+
14
+ Read events from from amazon SQS.
15
+
16
+ == Configuratin
17
+
18
+ === SQSOutput
19
+
20
+ <match sqs.**>
21
+
22
+ type sqs
23
+
24
+ # following attibutes are required
25
+
26
+ queue_name {queue_instance_key}
27
+
28
+ # following attibutes are required if you don't use IAM Role nor export credentials to ENV
29
+
30
+ aws_key_id {your_aws_key_id}
31
+ aws_sec_key {your_aws_secret_key}
32
+
33
+ # following attibutes are optional
34
+  
35
+ create_queue {boolean}
36
+ sqs_endpoint {endpointURL}
37
+
38
+ ### endpoint list ###
39
+ # Asia Pacific (Tokyo) [Default] : sqs.ap-northeast-1.amazonaws.com
40
+ # Asia Pacific (Singapore) : sqs.ap-southeast-1.amazonaws.com
41
+ # US-East (Virginia) : sqs.us-east-1.amazonaws.com
42
+ # US-West (Oregon) : sqs.us-west-2.amazonaws.com
43
+ # US-West (N.California) : sqs.us-west-1.amazonaws.com
44
+ # EU-West (Ireland) : sqs.eu-west-1.amazonaws.com
45
+ # South America (São Paulo) : sns.sa-east-1.amazonaws.com
46
+
47
+ delay_seconds {delivery_deley_seconds}
48
+
49
+ include_tag {boolean}
50
+ tag_property_name {tag's property name in json}
51
+
52
+
53
+ </match>
54
+
55
+ === SQSInput
56
+
57
+ <source>
58
+
59
+ type sqs
60
+
61
+ # following attibutes are required
62
+
63
+ sqs_url {queue_url}
64
+
65
+ # following attibutes are required if you don't use IAM Role nor export credentials to ENV
66
+
67
+ aws_key_id {your_aws_key_id}
68
+ aws_sec_key {your_aws_secret_key}
69
+
70
+ # following attibutes are optional
71
+  
72
+ sqs_endpoint {endpointURL}
73
+
74
+ ### endpoint list ###
75
+ # Asia Pacific (Tokyo) [Default] : sqs.ap-northeast-1.amazonaws.com
76
+ # Asia Pacific (Singapore) : sqs.ap-southeast-1.amazonaws.com
77
+ # US-East (Virginia) : sqs.us-east-1.amazonaws.com
78
+ # US-West (Oregon) : sqs.us-west-2.amazonaws.com
79
+ # US-West (N.California) : sqs.us-west-1.amazonaws.com
80
+ # EU-West (Ireland) : sqs.eu-west-1.amazonaws.com
81
+ # South America (São Paulo) : sns.sa-east-1.amazonaws.com
82
+
83
+ receive_interval {receive_interval_seconds}
84
+
85
+ </source>
86
+
87
+ == Tool
88
+
89
+ == Copyright
90
+
91
+ Copyright:: Copyright (c) 2011- Yuri Odagiri
92
+ License:: Apache License, Version 2.0
@@ -0,0 +1,12 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/clean'
4
+ require "bundler/gem_tasks"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.test_files = Dir['test/*_test.rb']
8
+ t.ruby_opts = ['-rubygems'] if defined? Gem
9
+ t.ruby_opts << '-I.'
10
+ end
11
+
12
+ task :default => [:build]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.6.0
@@ -0,0 +1,68 @@
1
+ module Fluent
2
+
3
+ require 'aws-sdk'
4
+
5
+ class SQSInput < Input
6
+ Plugin.register_input('sqs', self)
7
+
8
+ def initialize
9
+ super
10
+ end
11
+
12
+ config_param :aws_key_id, :string, :default => nil, :secret => true
13
+ config_param :aws_sec_key, :string, :default => nil, :secret => true
14
+ config_param :tag, :string
15
+ config_param :sqs_endpoint, :string, :default => 'sqs.ap-northeast-1.amazonaws.com'
16
+ config_param :sqs_url, :string
17
+ config_param :receive_interval, :time, :default => 1
18
+ config_param :max_number_of_messages, :integer, :default => 1
19
+
20
+ def configure(conf)
21
+ super
22
+
23
+ end
24
+
25
+ def start
26
+ super
27
+
28
+ AWS.config(
29
+ :access_key_id => @aws_key_id,
30
+ :secret_access_key => @aws_sec_key
31
+ )
32
+
33
+ @queue = AWS::SQS.new(:sqs_endpoint => @sqs_endpoint).queues[@sqs_url]
34
+
35
+ @finished = false
36
+ @thread = Thread.new(&method(:run_periodic))
37
+ end
38
+
39
+ def shutdown
40
+ super
41
+
42
+ @finished = true
43
+ @thread.join
44
+ end
45
+
46
+ def run_periodic
47
+ until @finished
48
+ begin
49
+ sleep @receive_interval
50
+ @queue.receive_message(:limit => @max_number_of_messages) do |message|
51
+ record = {}
52
+ record['body'] = message.body.to_s
53
+ record['handle'] = message.handle.to_s
54
+ record['id'] = message.id.to_s
55
+ record['md5'] = message.md5.to_s
56
+ record['url'] = message.queue.url.to_s
57
+ record['sender_id'] = message.sender_id.to_s
58
+
59
+ Engine.emit(@tag, Time.now.to_i, record)
60
+ end
61
+ rescue
62
+ $log.error "failed to emit or receive", :error => $!.to_s, :error_class => $!.class.to_s
63
+ $log.warn_backtrace $!.backtrace
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,72 @@
1
+ module Fluent
2
+
3
+ require 'aws-sdk'
4
+ require 'objspace'
5
+
6
+ class SQSOutput < BufferedOutput
7
+
8
+ Fluent::Plugin.register_output('sqs', self)
9
+
10
+ include SetTagKeyMixin
11
+ config_set_default :include_tag_key, false
12
+
13
+ include SetTimeKeyMixin
14
+ config_set_default :include_time_key, true
15
+
16
+ config_param :aws_key_id, :string, :default => nil, :secret => true
17
+ config_param :aws_sec_key, :string, :default => nil, :secret => true
18
+ config_param :queue_name, :string
19
+ config_param :create_queue, :bool, :default => true
20
+ config_param :sqs_endpoint, :string, :default => 'sqs.ap-northeast-1.amazonaws.com'
21
+ config_param :delay_seconds, :integer, :default => 0
22
+ config_param :include_tag, :bool, :default => true
23
+ config_param :tag_property_name, :string, :default => '__tag'
24
+ config_param :max_size, :integer, :default => 256000
25
+
26
+ def configure(conf)
27
+ super
28
+ end
29
+
30
+ def start
31
+ super
32
+
33
+ AWS.config(
34
+ :access_key_id => @aws_key_id,
35
+ :secret_access_key => @aws_sec_key)
36
+
37
+ @sqs = AWS::SQS.new(
38
+ :sqs_endpoint => @sqs_endpoint)
39
+ if @create_queue then
40
+ @queue = @sqs.queues.create(@queue_name)
41
+ else
42
+ @queue = @sqs.queues.named(@queue_name)
43
+ end
44
+ end
45
+
46
+ def shutdown
47
+ super
48
+ end
49
+
50
+ def format(tag, time, record)
51
+ if @include_tag then
52
+ record[@tag_property_name] = tag
53
+ end
54
+
55
+ record.to_msgpack
56
+ end
57
+
58
+ def write(chunk)
59
+ records = []
60
+ chunk.msgpack_each {|record|
61
+ if ObjectSpace.memsize_of(record) < @max_size
62
+ records << { :message_body => Yajl.dump(record), :delay_seconds => @delay_seconds }
63
+ else
64
+ log.info "Could not send log to SQS: the size of log exceeded max_size"
65
+ end
66
+ }
67
+ until records.length <= 0 do
68
+ @queue.batch_send(records.slice!(0..9))
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe do
4
+ let(:driver) {
5
+ AWS.stub!
6
+ Fluent::Test.setup
7
+ Fluent::Test::InputTestDriver.new(Fluent::SQSInput).configure(config)
8
+ }
9
+ let(:instance) {driver.instance}
10
+
11
+ describe 'config' do
12
+ let(:config) {
13
+ %[
14
+ aws_key_id AWS_KEY_ID
15
+ aws_sec_key AWS_SEC_KEY
16
+ tag TAG
17
+ sqs_url SQS_URL
18
+ max_number_of_messages 10
19
+ ]
20
+ }
21
+
22
+ context do
23
+ subject {instance.aws_key_id}
24
+ it{should == 'AWS_KEY_ID'}
25
+ end
26
+
27
+ context do
28
+ subject {instance.aws_sec_key}
29
+ it{should == 'AWS_SEC_KEY'}
30
+ end
31
+
32
+ context do
33
+ subject {instance.tag}
34
+ it{should == 'TAG'}
35
+ end
36
+
37
+ context do
38
+ subject {instance.sqs_url}
39
+ it{should == 'SQS_URL'}
40
+ end
41
+
42
+ context do
43
+ subject {instance.receive_interval}
44
+ it{should == 1}
45
+ end
46
+
47
+ context do
48
+ subject {instance.max_number_of_messages}
49
+ it{should == 10}
50
+ end
51
+ end
52
+
53
+ describe 'emit' do
54
+ let(:message) do
55
+ { 'body' => 'body',
56
+ 'handle' => 'handle',
57
+ 'id' => 'id',
58
+ 'md5' => 'md5',
59
+ 'url' => 'url',
60
+ 'sender_id' => 'sender_id'
61
+ }
62
+ end
63
+ let(:emmits) {
64
+ allow(Time).to receive(:now).and_return(0)
65
+
66
+ class AWS::SQS::Queue
67
+ def receive_message(opts)
68
+ yield OpenStruct.new(
69
+ { 'body' => 'body',
70
+ 'handle' => 'handle',
71
+ 'id' => 'id',
72
+ 'md5' => 'md5',
73
+ 'queue' => OpenStruct.new(:url => 'url'),
74
+ 'sender_id' => 'sender_id',
75
+ 'sent_at' => 0
76
+ })
77
+ end
78
+ end
79
+ expect_any_instance_of(AWS::SQS::Queue).to receive(:receive_message).with({:limit => 10}).at_least(:once).and_call_original
80
+
81
+ d = driver
82
+ d.run do
83
+ sleep 2
84
+ end
85
+
86
+ d.emits
87
+ }
88
+
89
+ context do
90
+ let(:config) {
91
+ %[
92
+ aws_key_id AWS_KEY_ID
93
+ aws_sec_key AWS_SEC_KEY
94
+ tag TAG
95
+ sqs_url SQS_URL
96
+ max_number_of_messages 10
97
+ ]
98
+ }
99
+
100
+ subject {emmits.first}
101
+ it{should == ['TAG', 0, message]}
102
+ end
103
+
104
+ end
105
+
106
+ end
@@ -0,0 +1,25 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+
18
+ require 'fluent/load'
19
+ require 'fluent/test'
20
+
21
+ require 'fluent/plugin/in_sqs'
22
+ require 'ostruct'
23
+ require 'pry'
24
+ require 'rr'
25
+ end
metadata ADDED
@@ -0,0 +1,193 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-sqs-check-size
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nao Akechi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-17 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.12.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.12.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.9.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.9.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: yajl-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: jeweler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: test-unit
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: 3.0.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: 3.0.0
153
+ description:
154
+ email: nao.akechi@gmail.com
155
+ executables: []
156
+ extensions: []
157
+ extra_rdoc_files:
158
+ - README.rdoc
159
+ files:
160
+ - AUTHORS
161
+ - Rakefile
162
+ - VERSION
163
+ - lib/fluent/plugin/in_sqs.rb
164
+ - lib/fluent/plugin/out_sqs.rb
165
+ - spec/lib/fluent/plugin/in_sqs_spec.rb
166
+ - spec/spec_helper.rb
167
+ - README.rdoc
168
+ homepage: https://github.com/nakc/fluent-plugin-sqs
169
+ licenses: []
170
+ metadata: {}
171
+ post_install_message:
172
+ rdoc_options: []
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ required_rubygems_version: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ requirements: []
186
+ rubyforge_project:
187
+ rubygems_version: 2.0.14
188
+ signing_key:
189
+ specification_version: 3
190
+ summary: Amazon SQS input/output plugin for Fluent event collector
191
+ test_files:
192
+ - spec/lib/fluent/plugin/in_sqs_spec.rb
193
+ - spec/spec_helper.rb