fluent-plugin-s3 0.2.0 → 0.2.1

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.
data/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ Release 0.2.1 - 2011/10/24
3
+
4
+ * Add sequential number to the file to avoid overwriting
5
+ * Use bundler instead of jeweler for packaging
6
+ * Updated README
7
+
8
+
2
9
  Release 0.2.0 - 2011/10/16
3
10
 
4
11
  * Updated to fluentd-0.10.0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -1,2 +1,55 @@
1
1
  = Amazon S3 output plugin for Fluent event collector
2
2
 
3
+ == Overview
4
+
5
+ *s3* output plugin buffers event logs in local file and upload it to S3 periodically.
6
+
7
+ This plugin splits files exactly by using the time of event logs (not the time when the logs are received). For example, a log '2011-01-02 message B' is reached, and then another log '2011-01-03 message B' is reached in this order, the former one is stored in "20110102.gz" file, and latter one in "20110103.gz" file.
8
+
9
+
10
+ == Installation
11
+
12
+ Simply use RubyGems:
13
+
14
+ gem install fluent-plugin-s3
15
+
16
+ == Configuration
17
+
18
+ <match pattern>
19
+ type s3
20
+
21
+ aws_key_id YOUR_AWS_KEY_ID
22
+ aws_sec_key YOUR_AWS_SECRET/KEY
23
+ s3_bucket YOUR_S3_BUCKET_NAME
24
+ path logs/
25
+ buffer_path /var/log/fluent/s3
26
+
27
+ time_slice_format %Y%m%d-%H
28
+ time_slice_wait 10m
29
+ utc
30
+ </match>
31
+
32
+ [aws_key_id (required)] AWS access key id.
33
+
34
+ [aws_sec_key (required)] AWS secret key.
35
+
36
+ [s3_bucket (required)] S3 bucket name.
37
+
38
+ [path] path prefix of the files on S3. Default is "" (no prefix).
39
+
40
+ [buffer_path (required)] path prefix of the files to buffer logs.
41
+
42
+ [time_slice_format] Format of the time used as the file name. Default is '%Y%m%d'. Use '%Y%m%d%H' to split files hourly.
43
+
44
+ [time_slice_wait] The time to wait old logs. Default is 10 minutes. Specify larger value if old logs may reache.
45
+
46
+ [utc] Use UTC instead of local time.
47
+
48
+ The actual path on S3 will be: "{path}{time_slice_format}_{sequential_number}.gz"
49
+
50
+
51
+ == Copyright
52
+
53
+ Copyright:: Copyright (c) 2011 Sadayuki Furuhashi
54
+ License:: Apache License, Version 2.0
55
+
data/Rakefile CHANGED
@@ -1,60 +1,14 @@
1
- require 'rake'
2
- require 'rake/testtask'
3
- require 'rake/clean'
4
-
5
- begin
6
- require 'jeweler'
7
- Jeweler::Tasks.new do |gemspec|
8
- gemspec.name = "fluent-plugin-s3"
9
- gemspec.summary = "Amazon S3 output plugin for Fluent event collector"
10
- gemspec.author = "Sadayuki Furuhashi"
11
- gemspec.email = "frsyuki@gmail.com"
12
- gemspec.homepage = "http://fluent.github.com/"
13
- gemspec.has_rdoc = false
14
- gemspec.require_paths = ["lib"]
15
- gemspec.add_dependency "fluentd", "~> 0.10.0"
16
- gemspec.add_dependency "aws-sdk", "~> 1.1.3"
17
- gemspec.test_files = Dir["test/**/*.rb"]
18
- gemspec.files = Dir["bin/**/*", "lib/**/*", "test/**/*.rb"] +
19
- %w[VERSION AUTHORS Rakefile]
20
- gemspec.executables = []
21
- end
22
- Jeweler::GemcutterTasks.new
23
- rescue LoadError
24
- puts "Jeweler not available. Install it with: gem install jeweler"
25
- end
26
-
27
- Rake::TestTask.new(:test) do |t|
28
- t.test_files = Dir['test/*_test.rb']
29
- t.ruby_opts = ['-rubygems'] if defined? Gem
30
- t.ruby_opts << '-I.'
31
- end
32
1
 
33
- #VERSION_FILE = "lib/fluent/version.rb"
34
- #
35
- #file VERSION_FILE => ["VERSION"] do |t|
36
- # version = File.read("VERSION").strip
37
- # File.open(VERSION_FILE, "w") {|f|
38
- # f.write <<EOF
39
- #module Fluent
40
- #
41
- #VERSION = '#{version}'
42
- #
43
- #end
44
- #EOF
45
- # }
46
- #end
47
- #
48
- #task :default => [VERSION_FILE, :build]
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
49
4
 
50
- task :default => [:build]
5
+ require 'rake/testtask'
51
6
 
52
- Rake::TestTask.new(:test) do |t|
53
- t.libs << "test"
54
- t.test_files = Dir["test/*.rb"].sort
55
- t.verbose = true
56
- #t.warning = true
7
+ Rake::TestTask.new(:test) do |test|
8
+ test.libs << 'lib' << 'test'
9
+ test.test_files = FileList['test/*.rb']
10
+ test.verbose = true
57
11
  end
58
12
 
59
- task :default => [:build, :gemspec]
13
+ task :default => [:build]
60
14
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "fluent-plugin-s3"
6
+ gem.description = "Amazon S3 output plugin for Fluent event collector"
7
+ gem.homepage = "https://github.com/fluent/fluent-plugin-s3"
8
+ gem.summary = gem.description
9
+ gem.version = File.read("VERSION").strip
10
+ gem.authors = ["Sadayuki Furuhashi"]
11
+ gem.email = "frsyuki@gmail.com"
12
+ gem.has_rdoc = false
13
+ #gem.platform = Gem::Platform::RUBY
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_dependency "fluentd", "~> 0.10.0"
20
+ gem.add_dependency "aws-sdk", "~> 1.1.3"
21
+ end
@@ -9,50 +9,20 @@ class S3Output < Fluent::TimeSlicedOutput
9
9
  require 'aws-sdk'
10
10
  require 'zlib'
11
11
  require 'time'
12
+ require 'tempfile'
12
13
  end
13
14
 
14
- attr_accessor :aws_key_id, :aws_sec_key, :s3_bucket, :path
15
+ config_param :path, :string, :default => ""
16
+ config_param :time_format, :string, :default => nil
17
+
18
+ config_param :aws_key_id, :string
19
+ config_param :aws_sec_key, :string
20
+ config_param :s3_bucket, :string
15
21
 
16
22
  def configure(conf)
17
23
  super
18
24
 
19
- if aws_key_id = conf['aws_key_id']
20
- @aws_key_id = aws_key_id
21
- end
22
- unless @aws_key_id
23
- raise ConfigError, "'aws_key_id' parameter is required on s3 output"
24
- end
25
-
26
- if aws_sec_key = conf['aws_sec_key']
27
- @aws_sec_key = aws_sec_key
28
- end
29
- unless @aws_sec_key
30
- raise ConfigError, "'aws_sec_key' parameter is required on s3 output"
31
- end
32
-
33
- if s3_bucket = conf['s3_bucket']
34
- @s3_bucket = s3_bucket
35
- end
36
- unless @s3_bucket
37
- raise ConfigError, "'s3_bucket' parameter is required on s3 output"
38
- end
39
-
40
- if path = conf['path']
41
- @path = path
42
- end
43
- unless @path
44
- @path = ''
45
- end
46
-
47
- if @localtime
48
- @formatter = Proc.new {|tag,time,record|
49
- "#{Time.at(time).iso8601}\t#{tag}\t#{record.to_json}\n"
50
- }
51
- else
52
- @formatter = Proc.new {|tag,time,record|
53
- "#{Time.at(time).utc.iso8601}\t#{tag}\t#{record.to_json}\n"
54
- }
55
- end
25
+ @timef = TimeFormatter.new(@time_format, @localtime)
56
26
  end
57
27
 
58
28
  def start
@@ -64,17 +34,22 @@ class S3Output < Fluent::TimeSlicedOutput
64
34
  end
65
35
 
66
36
  def format(tag, time, record)
67
- @formatter.call(tag, time, record)
37
+ time_str = @timef.format(time)
38
+ "#{time_str}\t#{tag}\t#{record.to_json}\n"
68
39
  end
69
40
 
70
41
  def write(chunk)
71
- s3path = "#{@path}#{chunk.key}.gz"
42
+ i = 0
43
+ begin
44
+ s3path = "#{@path}#{chunk.key}_#{i}.gz"
45
+ i += 1
46
+ end while @bucket.objects[s3path].exists?
72
47
 
73
48
  tmp = Tempfile.new("s3-")
74
49
  w = Zlib::GzipWriter.new(tmp)
75
50
  begin
76
51
  chunk.write_to(w)
77
- w.finish
52
+ w.close
78
53
  @bucket.objects[s3path].write(Pathname.new(tmp.path))
79
54
  ensure
80
55
  w.close rescue nil
metadata CHANGED
@@ -1,105 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-s3
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 2
9
- - 0
10
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Sadayuki Furuhashi
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-10-16 00:00:00 +09:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-11-20 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: fluentd
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70187303391020 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
18
+ requirements:
27
19
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 55
30
- segments:
31
- - 0
32
- - 10
33
- - 0
20
+ - !ruby/object:Gem::Version
34
21
  version: 0.10.0
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: aws-sdk
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70187303391020
25
+ - !ruby/object:Gem::Dependency
26
+ name: aws-sdk
27
+ requirement: &70187303539040 !ruby/object:Gem::Requirement
41
28
  none: false
42
- requirements:
29
+ requirements:
43
30
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 21
46
- segments:
47
- - 1
48
- - 1
49
- - 3
31
+ - !ruby/object:Gem::Version
50
32
  version: 1.1.3
51
33
  type: :runtime
52
- version_requirements: *id002
53
- description:
34
+ prerelease: false
35
+ version_requirements: *70187303539040
36
+ description: Amazon S3 output plugin for Fluent event collector
54
37
  email: frsyuki@gmail.com
55
38
  executables: []
56
-
57
39
  extensions: []
58
-
59
- extra_rdoc_files:
40
+ extra_rdoc_files: []
41
+ files:
42
+ - AUTHORS
60
43
  - ChangeLog
44
+ - Gemfile
61
45
  - README.rdoc
62
- files:
63
- - AUTHORS
64
46
  - Rakefile
65
47
  - VERSION
48
+ - fluent-plugin-s3.gemspec
66
49
  - lib/fluent/plugin/out_s3.rb
67
50
  - test/out_s3.rb
68
- - ChangeLog
69
- - README.rdoc
70
- has_rdoc: true
71
- homepage: http://fluent.github.com/
51
+ homepage: https://github.com/fluent/fluent-plugin-s3
72
52
  licenses: []
73
-
74
53
  post_install_message:
75
- rdoc_options:
76
- - --charset=UTF-8
77
- require_paths:
54
+ rdoc_options: []
55
+ require_paths:
78
56
  - lib
79
- required_ruby_version: !ruby/object:Gem::Requirement
57
+ required_ruby_version: !ruby/object:Gem::Requirement
80
58
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ segments:
86
64
  - 0
87
- version: "0"
88
- required_rubygems_version: !ruby/object:Gem::Requirement
65
+ hash: -2936927257322544690
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
67
  none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- hash: 3
94
- segments:
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ segments:
95
73
  - 0
96
- version: "0"
74
+ hash: -2936927257322544690
97
75
  requirements: []
98
-
99
76
  rubyforge_project:
100
- rubygems_version: 1.3.7
77
+ rubygems_version: 1.8.10
101
78
  signing_key:
102
79
  specification_version: 3
103
80
  summary: Amazon S3 output plugin for Fluent event collector
104
- test_files:
81
+ test_files:
105
82
  - test/out_s3.rb