fluent-plugin-couch-sharded 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Yudai Odagiri <ixixizko _at_ gmail.com>
data/README.rdoc ADDED
@@ -0,0 +1,58 @@
1
+ = CouchDB output plugin for Fluentd
2
+
3
+ fluent-plugin-couch provides output plugins for {Fluentd}[http://fluentd.org/].
4
+
5
+ = Installation
6
+
7
+ == Gems
8
+
9
+ The gem is hosted at {Rubygems.org}[http://rubygems.org]. You can install the gem as follows:
10
+
11
+ $ fluent-gem install fluent-plugin-couch-sharded
12
+
13
+ == Component
14
+
15
+ === CouchDBOutput
16
+
17
+ Store fluent-event as CouchDB Document to CouchDB database.
18
+
19
+ This is a forked version to add extra features.
20
+
21
+ == Configuration
22
+
23
+ === CouchOutput
24
+
25
+ <match couch.**>
26
+ type couch
27
+ database fluent
28
+
29
+ # following attibutes are optional
30
+
31
+ host fluenter #default:localhost
32
+ port 10000 #default:5984
33
+ protocol https #default:http
34
+
35
+ update_docs true #default:false
36
+ doc_key_field doc_id #default:nil
37
+ doc_key_jsonpath $.event.key #default:nil
38
+
39
+ refresh_view_index viewname #default:nil
40
+
41
+ # for Basic Authentication (optional)
42
+ user odagiri
43
+ password yudai
44
+
45
+ # Other buffer configurations here
46
+ </match>
47
+
48
+ == TODO
49
+ === More configuration
50
+ === Feature
51
+ *
52
+
53
+ == Tool
54
+
55
+ == Copyright
56
+
57
+ Copyright:: Copyright (c) 2011- Yudai Odagiri
58
+ License:: Apache License, Version 2.0
data/Rakefile ADDED
@@ -0,0 +1,33 @@
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-couch-sharded"
9
+ gemspec.summary = "CouchDB output plugin for Fluentd event collector, forked to add 'sharding' features"
10
+ gemspec.author = "Yudai Odagiri,James Birmingham"
11
+ gemspec.email = "ixixizko@gmail.com"
12
+ gemspec.homepage = "http://github.com/ixixi/fluent-plugin-couch"
13
+ gemspec.has_rdoc = false
14
+ gemspec.require_paths = ["lib"]
15
+ gemspec.add_dependency "fluentd", "~> 0.10.0"
16
+ gemspec.add_dependency "couchrest", "~> 1.1.2"
17
+ gemspec.add_dependency "jsonpath", "~> 0.4.2"
18
+ gemspec.test_files = Dir["test/**/*.rb"]
19
+ gemspec.files = Dir["lib/**/*", "test/**/*.rb"] + %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
+
33
+ task :default => [:build]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.6.0
@@ -0,0 +1,208 @@
1
+ module Fluent
2
+ class CouchOutput < BufferedOutput
3
+ include SetTagKeyMixin
4
+ config_set_default :include_tag_key, false
5
+
6
+ include SetTimeKeyMixin
7
+ config_set_default :include_time_key, true
8
+
9
+ Fluent::Plugin.register_output('couch', self)
10
+
11
+ config_param :database, :string
12
+
13
+ config_param :host, :string, :default => 'localhost'
14
+ config_param :port, :string, :default => '5984'
15
+ config_param :protocol, :string, :default => 'http'
16
+
17
+ config_param :refresh_view_index, :string, :default => nil
18
+
19
+ config_param :user, :string, :default => nil
20
+ config_param :password, :string, :default => nil
21
+
22
+ config_param :update_docs, :bool, :default => false
23
+ config_param :doc_key_field, :string, :default => nil
24
+ config_param :doc_key_jsonpath, :string, :default => nil
25
+ config_param :db_key, :string, :default => nil
26
+ config_param :db_per, :string, :default => nil
27
+ config_param :w, :integer, :default => 1 #need to add support to couchrest for this
28
+ #
29
+ #
30
+ def initialize
31
+ super
32
+
33
+ require 'msgpack'
34
+ require 'jsonpath'
35
+ Encoding.default_internal = 'UTF-8'
36
+ require 'couchrest'
37
+ Encoding.default_internal = 'ASCII-8BIT'
38
+ end
39
+ #
40
+ #
41
+ def configure(conf)
42
+ super
43
+ end
44
+ #
45
+ #
46
+ def start
47
+ super
48
+
49
+ if @db_key or @db_per
50
+ raise "update_docs is not compatible with db_key or db_per yet!" if @update_docs
51
+ raise "refresh_view_index is not compatible with db_key or db_per yet!" if @refresh_view_index
52
+ end
53
+
54
+ @account = "#{@user}:#{@password}@" if @user && @password
55
+
56
+ @db = {}
57
+
58
+ #
59
+ # todo : doesn't work
60
+ #
61
+ if @db_per and @db_key
62
+ @write = self.method :write_by_key_per
63
+ elsif @db_per
64
+ raise "todo: do not currenty support db_per without db_key"
65
+ elsif @db_key
66
+ @write = self.method :write_by_key
67
+ else
68
+ @write = self.method :write_default
69
+ end
70
+
71
+ if not @db_key or @db_per
72
+ @db[:default] = CouchRest.database!("#{@protocol}://#{@account}#{@host}:#{@port}/#{@database}")
73
+ end
74
+
75
+ @views = []
76
+
77
+ if @refresh_view_index
78
+ begin
79
+ @db[:default].get("_design/#{@refresh_view_index}")['views'].each do |view_name, func|
80
+ @views.push([@refresh_view_index, view_name])
81
+ end
82
+ rescue
83
+ $log.error 'design document not found!'
84
+ end
85
+ end
86
+ end
87
+ #
88
+ #
89
+ def shutdown
90
+ super
91
+ end
92
+ #
93
+ #
94
+ def format(tag, time, record)
95
+ record.to_msgpack
96
+ end
97
+ #
98
+ # todo : this sucks
99
+ #
100
+ def write(chunk)
101
+ if @db_per and @db_key
102
+ write_by_key_per chunk
103
+ elsif @db_per
104
+ raise "todo: do not currenty support db_per without db_key"
105
+ elsif @db_key
106
+ write_by_key chunk
107
+ else
108
+ write_default chunk
109
+ end
110
+ end
111
+ def write_default(chunk)
112
+ records = []
113
+
114
+ chunk.msgpack_each do |record|
115
+
116
+ id = record[@doc_key_field]
117
+ id = JsonPath.new(@doc_key_jsonpath).first(record) if id.nil? && !@doc_key_jsonpath.nil?
118
+ record['_id'] = id unless id.nil?
119
+ records << record
120
+ end
121
+
122
+ if @update_docs
123
+ update_docs(records)
124
+ else
125
+ @db[:default].bulk_save(records)
126
+ end
127
+
128
+ update_view_index
129
+ end
130
+ #
131
+ #
132
+ def write_by_key_per(chunk)
133
+ records = {}
134
+
135
+ chunk.msgpack_each do |record|
136
+ id = record[@doc_key_field]
137
+ id = JsonPath.new(@doc_key_jsonpath).first(record) if id.nil? && !@doc_key_jsonpath.nil?
138
+ record['_id'] = id unless id.nil?
139
+
140
+ date = record['dt']
141
+
142
+ key = "#{record[@db_key].downcase}_#{date[0]}#{date[1].to_s.rjust(2, '0')}#{date[2].to_s.rjust(2, '0')}"
143
+
144
+ records[key] = [] unless records[key]
145
+ records[key] << record
146
+ end
147
+
148
+ records.each_pair do |key, data|
149
+ if not @db[key]
150
+ @db[key] = CouchRest.database!("#{@protocol}://#{@account}#{@host}:#{@port}/#{@database+"_"+key}")
151
+ end
152
+
153
+ @db[key].bulk_save(data)
154
+ end
155
+
156
+ end
157
+ #
158
+ #
159
+ def write_by_key(chunk)
160
+ records ={}
161
+
162
+ chunk.msgpack_each do |record|
163
+ id = record[@doc_key_field]
164
+ id = JsonPath.new(@doc_key_jsonpath).first(record) if id.nil? && !@doc_key_jsonpath.nil?
165
+ record['_id'] = id unless id.nil?
166
+
167
+ key = record[@db_key]
168
+ records[key] = [] unless records[key]
169
+ records[key] << record
170
+ end
171
+
172
+ records.each_pair do |key, data|
173
+ if not @db[key]
174
+ @db[key] = CouchRest.database!("#{@protocol}://#{@account}#{@host}:#{@port}/#{@database+"_"+key}")
175
+ end
176
+
177
+ @db[key].bulk_save(data)
178
+ end
179
+
180
+ end
181
+ #
182
+ #
183
+ def update_docs(records)
184
+
185
+ if records.length > 0
186
+ records.each do |record|
187
+ doc = nil
188
+
189
+ begin
190
+ doc = @db[:default].get(record['_id'])
191
+ rescue
192
+ end
193
+
194
+ record['_rev']=doc['_rev'] unless doc.nil?
195
+ $log.debug record
196
+ @db[:default].save_doc(record)
197
+ end
198
+ end
199
+ end
200
+ #
201
+ #
202
+ def update_view_index()
203
+ @views.each do |design, view|
204
+ @db[:default].view("#{design}/#{view}", {'limit' => '0'})
205
+ end
206
+ end
207
+ end
208
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-couch-sharded
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Yudai Odagiri,James Birmingham
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-05-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fluent-plugin-couch-sharded
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: jeweler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: fluentd
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.10.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.10.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: couchrest
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.1.2
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.1.2
110
+ - !ruby/object:Gem::Dependency
111
+ name: jsonpath
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.4.2
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.4.2
126
+ description:
127
+ email: ixixizko@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files:
131
+ - README.rdoc
132
+ files:
133
+ - AUTHORS
134
+ - Rakefile
135
+ - VERSION
136
+ - lib/fluent/plugin/out_couch.rb
137
+ - README.rdoc
138
+ homepage: http://github.com/ixixi/fluent-plugin-couch
139
+ licenses: []
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ segments:
151
+ - 0
152
+ hash: 4573471804670427138
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 1.8.25
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: CouchDB output plugin for Fluentd event collector, forked to add 'sharding'
165
+ features
166
+ test_files: []