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 +1 -0
- data/README.rdoc +58 -0
- data/Rakefile +33 -0
- data/VERSION +1 -0
- data/lib/fluent/plugin/out_couch.rb +208 -0
- metadata +166 -0
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: []
|