fluent-plugin-sqs-check-size 0.1.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: 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