fluent-plugin-couch 0.8.1 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acb484385a0c998eb5db741426d6b995c96d4cb4
4
- data.tar.gz: 32e42a695872fe528b992454f09360fea9425f06
3
+ metadata.gz: d2265d0d8be3afe5dc1f6cd28ba5549074e3f0ae
4
+ data.tar.gz: 50019c927b4c3c10c3720f28a1968ee66df77631
5
5
  SHA512:
6
- metadata.gz: d1aec6b4edcd69d35db70378fc0038816ccc033d79f95c69f5ca54419bee6dc12889f461518d756098dc4b921bfe5a758770d22645fd988057e23eaa13757f91
7
- data.tar.gz: 3c183818960750ee2d7133cab300476aa27862d214e828f218908b45e0c7a55cc3cc21b3bea3e095d38c9f76ae7ef51ca6778ff381fa40d584726e47870b2356
6
+ metadata.gz: 11c2d55d39f2c4c7deaa9d40ca7fb6d80a5c2f09ce16005fae476e48fb4ba8ed903391a8bdab2f53e4f6ea7c9bb3349c2f45150e686f89c95561c6330d47e873
7
+ data.tar.gz: 8babbc84df2b416d688862fdde07eed04503610d702b4d61ead825c41e86cd50c6f4a6f55eed6e4748fb78331fd0025bbbaff642de1d877e2e8d6b2d265fe0e2
@@ -31,8 +31,8 @@ Store fluent-event as CouchDB Document to CouchDB database.
31
31
  protocol https #default:http
32
32
 
33
33
  update_docs true #default:false
34
- doc_key_field doc_id #default:nil
35
- doc_key_jsonpath $.event.key #default:nil
34
+ doc_key_field doc_id #default:nil. ${tag} will be replaced with actual event's tag.
35
+ doc_key_jsonpath $.event.key #default:nil. ${tag} will be replaced with actual event's tag.
36
36
 
37
37
  refresh_view_index viewname #default:nil
38
38
 
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ begin
12
12
  gemspec.homepage = "http://github.com/ixixi/fluent-plugin-couch"
13
13
  gemspec.has_rdoc = false
14
14
  gemspec.require_paths = ["lib"]
15
- gemspec.add_dependency "fluentd", [">= 0.10.0", "< 2"]
15
+ gemspec.add_dependency "fluentd", [">= 0.14.0", "< 2"]
16
16
  gemspec.add_dependency "couchrest", "~> 1.1.2"
17
17
  gemspec.add_dependency "jsonpath", "~> 0.4.2"
18
18
  gemspec.test_files = Dir["test/**/*.rb"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.9.1
@@ -1,46 +1,55 @@
1
- module Fluent
2
- class CouchOutput < BufferedOutput
1
+ require "fluent/plugin/output"
2
+
3
+ module Fluent::Plugin
4
+ class CouchOutput < Output
3
5
  attr_reader :db # for tests
4
6
 
5
- include SetTagKeyMixin
7
+ DEFAULT_BUFFER_TYPE = "memory"
8
+
9
+ helpers :compat_parameters, :inject
10
+
6
11
  config_set_default :include_tag_key, false
7
-
8
- include SetTimeKeyMixin
9
12
  config_set_default :include_time_key, true
10
-
13
+
11
14
  Fluent::Plugin.register_output('couch', self)
12
-
15
+
13
16
  config_param :database, :string
14
-
17
+
15
18
  config_param :host, :string, :default => 'localhost'
16
19
  config_param :port, :string, :default => '5984'
17
20
  config_param :protocol, :string, :default => 'http'
18
-
21
+
19
22
  config_param :refresh_view_index , :string, :default => nil
20
-
23
+
21
24
  config_param :user, :string, :default => nil
22
25
  config_param :password, :string, :default => nil, :secret => true
23
-
26
+
24
27
  config_param :update_docs, :bool, :default => false
25
28
  config_param :doc_key_field, :string, :default => nil
26
29
  config_param :doc_key_jsonpath, :string, :default => nil
27
-
30
+
31
+ config_section :buffer do
32
+ config_set_default :@type, DEFAULT_BUFFER_TYPE
33
+ config_set_default :chunk_keys, ['tag']
34
+ end
35
+
28
36
  def initialize
29
37
  super
30
-
38
+
31
39
  require 'msgpack'
32
40
  require 'jsonpath'
33
41
  Encoding.default_internal = 'UTF-8'
34
42
  require 'couchrest'
35
43
  Encoding.default_internal = 'ASCII-8BIT'
36
44
  end
37
-
45
+
38
46
  def configure(conf)
47
+ compat_parameters_convert(conf, :buffer, :inject)
39
48
  super
40
49
  account = "#{@user}:#{@password}@" if @user && @password
41
50
  @db = CouchRest.database!("#{@protocol}://#{account}#{@host}:#{@port}/#{@database}")
42
51
  end
43
-
52
+
44
53
  def start
45
54
  super
46
55
  @views = []
@@ -50,25 +59,31 @@ module Fluent
50
59
  @views.push([@refresh_view_index,view_name])
51
60
  end
52
61
  rescue
53
- $log.error 'design document not found!'
62
+ log.error 'design document not found!'
54
63
  end
55
64
  end
56
65
  end
57
-
66
+
58
67
  def shutdown
59
68
  super
60
69
  end
61
-
70
+
62
71
  def format(tag, time, record)
72
+ record = inject_values_to_record(tag, time, record)
63
73
  record.to_msgpack
64
74
  end
65
-
75
+
76
+ def formatted_to_msgpack_binary
77
+ true
78
+ end
79
+
66
80
  def write(chunk)
67
81
  records = []
82
+ doc_key_field, doc_key_jsonpath = expand_placeholders(chunk.metadata)
68
83
  chunk.msgpack_each {|record|
69
-
70
- id = record[@doc_key_field]
71
- id = JsonPath.new(@doc_key_jsonpath).first(record) if id.nil? && !@doc_key_jsonpath.nil?
84
+
85
+ id = record[doc_key_field]
86
+ id = JsonPath.new(doc_key_jsonpath).first(record) if id.nil? && !doc_key_jsonpath.nil?
72
87
  record['_id'] = id unless id.nil?
73
88
  records << record
74
89
  }
@@ -79,7 +94,7 @@ module Fluent
79
94
  end
80
95
  update_view_index
81
96
  end
82
-
97
+
83
98
  def update_docs(records)
84
99
  if records.length > 0
85
100
  records.each{|record|
@@ -89,16 +104,25 @@ module Fluent
89
104
  rescue
90
105
  end
91
106
  record['_rev']=doc['_rev'] unless doc.nil?
92
- $log.debug record
93
- @db.save_doc(record)
107
+ log.debug record
108
+ @db.save_doc(record)
94
109
  }
95
110
  end
96
111
  end
97
-
112
+
98
113
  def update_view_index()
99
114
  @views.each do |design,view|
100
115
  @db.view("#{design}/#{view}",{"limit"=>"0"})
101
116
  end
102
117
  end
118
+
119
+ private
120
+
121
+ def expand_placeholders(metadata)
122
+ field = jsonpath = nil
123
+ field = extract_placeholders(@doc_key_field, metadata) if @doc_key_field
124
+ jsonpath = extract_placeholders(@doc_key_jsonpath, metadata) if @doc_key_jsonpath
125
+ return field, jsonpath
126
+ end
103
127
  end
104
128
  end
@@ -1,7 +1,11 @@
1
1
  require "fluent/test"
2
+ require "fluent/test/driver/output"
3
+ require "fluent/test/helpers"
2
4
  require "fluent/plugin/out_couch"
3
5
 
4
6
  class CouchOutputTest < Test::Unit::TestCase
7
+ include Fluent::Test::Helpers
8
+
5
9
  def setup
6
10
  Fluent::Test.setup
7
11
  end
@@ -19,12 +23,24 @@ class CouchOutputTest < Test::Unit::TestCase
19
23
  update_docs true
20
24
  ]
21
25
 
26
+ CONFIG_UPDATE_DOC_WITH_TAG_PLACEHOLDER = %[
27
+ database #{DATABASE_NAME}
28
+ doc_key_field ${tag}
29
+ update_docs true
30
+ ]
31
+
22
32
  CONFIG_JSONPATH = %[
23
33
  database #{DATABASE_NAME}
24
34
  doc_key_field key
25
35
  doc_key_jsonpath $.nested.key
26
36
  ]
27
37
 
38
+ CONFIG_JSONPATH_WITH_TAG_PLACEHOLDER = %[
39
+ database #{DATABASE_NAME}
40
+ doc_key_field key
41
+ doc_key_jsonpath $.${tag}.key
42
+ ]
43
+
28
44
  CONFIG_DESIGN = %[
29
45
  database #{DATABASE_NAME}
30
46
  doc_key_field key
@@ -39,7 +55,7 @@ class CouchOutputTest < Test::Unit::TestCase
39
55
  end
40
56
 
41
57
  def create_driver(config = CONFIG)
42
- Fluent::Test::BufferedOutputTestDriver.new(Fluent::CouchOutput).configure(config)
58
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::CouchOutput).configure(config)
43
59
  end
44
60
 
45
61
  def test_configure
@@ -68,9 +84,10 @@ class CouchOutputTest < Test::Unit::TestCase
68
84
 
69
85
  def test_write
70
86
  previous_rows = @d.instance.db.all_docs["total_rows"]
71
- time = Time.now.to_i
72
- @d.emit({"message" => "record"}, time)
73
- @d.run
87
+ time = event_time
88
+ @d.run(default_tag: "tag") do
89
+ @d.feed(time, {"message" => "record"})
90
+ end
74
91
  rows = @d.instance.db.all_docs["total_rows"]
75
92
  assert_equal(rows, previous_rows + 1)
76
93
  end
@@ -87,19 +104,46 @@ class CouchOutputTest < Test::Unit::TestCase
87
104
  end
88
105
 
89
106
  def test_write
90
- time = Time.now.to_i
91
- @d.emit({"key" => "record-1", "message" => "record"}, time)
92
- @d.run
93
- previous_rows = @d.instance.db.all_docs["total_rows"]
94
- @d.emit({"key" => "record-1", "message" => "record-mod"}, time)
95
- @d.run
96
- rows = @d.instance.db.all_docs["total_rows"]
107
+ time = event_time
108
+ previous_rows = rows = 0
109
+ @d.run(default_tag: "test") do
110
+ @d.feed(time, {"key" => "record-1", "message" => "record"})
111
+ previous_rows = @d.instance.db.all_docs["total_rows"]
112
+ @d.feed(time, {"key" => "record-1", "message" => "record-mod"})
113
+ rows = @d.instance.db.all_docs["total_rows"]
114
+ end
97
115
  record = @d.instance.db.get("record-1")
98
116
  assert_equal(rows, previous_rows)
99
117
  assert_equal("record-mod", record["message"])
100
118
  end
101
119
  end
102
120
 
121
+ class WriteWithUpdateDocWithTagPlaceHolderTest < self
122
+ def setup
123
+ @d = create_driver(CONFIG_UPDATE_DOC_WITH_TAG_PLACEHOLDER)
124
+ prepare_db
125
+ end
126
+
127
+ def teardown
128
+ @db.delete!
129
+ end
130
+
131
+ def test_write
132
+ time = event_time
133
+ tag = "replace.placeholder"
134
+ previous_rows = rows = 0
135
+ @d.run(default_tag: tag) do
136
+ @d.feed(time, {tag => "record-placeholder", "message" => "record"})
137
+ previous_rows = @d.instance.db.all_docs["total_rows"]
138
+ @d.feed(time, {tag => "record-placeholder", "message" => "record-placeholder"})
139
+ rows = @d.instance.db.all_docs["total_rows"]
140
+ end
141
+ assert_equal(rows, previous_rows)
142
+ record = @d.instance.db.get("record-placeholder")
143
+ assert_equal("record-placeholder", record["message"])
144
+ end
145
+ end
146
+
103
147
  class WriteWithJsonpathTest < self
104
148
  def setup
105
149
  @d = create_driver(CONFIG_JSONPATH)
@@ -111,14 +155,36 @@ class CouchOutputTest < Test::Unit::TestCase
111
155
  end
112
156
 
113
157
  def test_write
114
- time = Time.now.to_i
115
- @d.emit({"nested" => {"key" => "record-nested", "message" => "record"}}, time)
116
- @d.run
158
+ time = event_time
159
+ @d.run(default_tag: "test") do
160
+ @d.feed(time, {"nested" => {"key" => "record-nested", "message" => "record"}})
161
+ end
117
162
  record = @d.instance.db.get("record-nested")
118
163
  assert_equal({"key" => "record-nested", "message" => "record"}, record["nested"])
119
164
  end
120
165
  end
121
166
 
167
+ class WriteWithJsonpathWithTagPlaceholderTest < self
168
+ def setup
169
+ @d = create_driver(CONFIG_JSONPATH_WITH_TAG_PLACEHOLDER)
170
+ prepare_db
171
+ end
172
+
173
+ def teardown
174
+ @db.delete!
175
+ end
176
+
177
+ def test_write
178
+ time = event_time
179
+ tag = "couchrecord"
180
+ @d.run(default_tag: tag) do
181
+ @d.feed(time, {tag => {"key" => "record-nested", "message" => "record"}})
182
+ end
183
+ record = @d.instance.db.get("record-nested")
184
+ assert_equal({"key" => "record-nested", "message" => "record"}, record["couchrecord"])
185
+ end
186
+ end
187
+
122
188
  class WriteWithDesignTest < self
123
189
  def setup
124
190
  @d = create_driver(CONFIG_DESIGN)
@@ -148,9 +214,10 @@ class CouchOutputTest < Test::Unit::TestCase
148
214
  end
149
215
 
150
216
  def test_write
151
- time = Time.now.to_i
152
- @d.emit({"key" => "record-design", "message" => "record"}, time)
153
- @d.run
217
+ time = event_time
218
+ @d.run(default_tag: "test") do
219
+ @d.feed(time, {"key" => "record-design", "message" => "record"})
220
+ end
154
221
  record = @d.instance.db.get("record-design")
155
222
  assert_equal("record", record["message"])
156
223
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-couch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuri Odagiri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-07 00:00:00.000000000 Z
11
+ date: 2017-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '2'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.10.0
22
+ version: 0.14.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '2'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.10.0
32
+ version: 0.14.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: couchrest
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  requirements: []
92
92
  rubyforge_project:
93
- rubygems_version: 2.5.2
93
+ rubygems_version: 2.4.1
94
94
  signing_key:
95
95
  specification_version: 4
96
96
  summary: CouchDB output plugin for Fluentd event collector