fluent-plugin-couch-sharded 0.6.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.
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: []