fluent-plugin-s3 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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