fluent-plugin-azuresearch 0.1.2 → 0.2.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.
- checksums.yaml +4 -4
- data/ChangeLog.md +17 -0
- data/README.md +11 -0
- data/VERSION +1 -1
- data/examples/createindex-messages.sh +20 -0
- data/examples/fluent.conf +14 -0
- data/examples/send-event.sh +4 -0
- data/fluent-plugin-azuresearch.gemspec +1 -2
- data/lib/fluent/plugin/azuresearch/client.rb +3 -3
- data/lib/fluent/plugin/out_azuresearch.rb +33 -17
- data/test/helper.rb +3 -0
- data/test/plugin/test_azuresearch.rb +36 -37
- metadata +9 -6
- data/ChangeLog +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76f573ed22cba02133e8bebf6c70a5f70710c636
|
4
|
+
data.tar.gz: 8d5e301c6c5bf5f0ea36b890c21029cbfee95182
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02b7facbaaf3dd9694fd146953c91638326d67c4c41508db7b4571f490145c201027c8e44f2b0d98e2b76cbe85c3148b8364879ece9cc0209906f3dfd264677c
|
7
|
+
data.tar.gz: 7478e66492a848353d8e3b0dce39a4e77b19ab5ed4dc212c8f5b003e67706fe99534a06be961454ec2d69f79c126e17abdafb289cb43d94b74c12f71d17ab2dc
|
data/ChangeLog.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
## 0.2.0
|
2
|
+
|
3
|
+
* Migrate to use fluentd v0.14 API - [PR#3](https://github.com/yokawasa/fluent-plugin-azuresearch/pull/3)
|
4
|
+
* Support plugin specific log level - [PR#2](https://github.com/yokawasa/fluent-plugin-azuresearch/pull/2)
|
5
|
+
* Added example script and configuration
|
6
|
+
|
7
|
+
## 0.1.2
|
8
|
+
|
9
|
+
* Change gem package dependency option for rest-client from add_development_dependency to add_dependency
|
10
|
+
|
11
|
+
## 0.1.1
|
12
|
+
|
13
|
+
* Security enhanced option: Added secret option to api_key
|
14
|
+
|
15
|
+
## 0.1.0
|
16
|
+
|
17
|
+
* Inital Release
|
data/README.md
CHANGED
@@ -20,6 +20,7 @@ To use Microsoft Azure Search, you must create an Azure Search service in the Az
|
|
20
20
|
|
21
21
|
<match azuresearch.*>
|
22
22
|
@type azuresearch
|
23
|
+
@log_level info
|
23
24
|
endpoint https://AZURE_SEARCH_ACCOUNT.search.windows.net
|
24
25
|
api_key AZURE_SEARCH_API_KEY
|
25
26
|
search_index messages
|
@@ -33,6 +34,8 @@ To use Microsoft Azure Search, you must create an Azure Search service in the Az
|
|
33
34
|
* **column\_names (required)** - Column names in a target Azure search index. Each column needs to be separated by a comma.
|
34
35
|
* **key\_names (optional)** - Default:nil. Key names in incomming record to insert. Each key needs to be separated by a comma. ${time} is placeholder for Time.at(time).strftime("%Y-%m-%dT%H:%M:%SZ"), and ${tag} is placeholder for tag. By default, **key\_names** is as same as **column\_names**
|
35
36
|
|
37
|
+
[note] @log_level is a fluentd built-in parameter (optional) that controls verbosity of logging: fatal|error|warn|info|debug|trace (See also [Logging of Fluentd](http://docs.fluentd.org/articles/logging#log-level))
|
38
|
+
|
36
39
|
## Sample Configurations
|
37
40
|
### Case1 - column_names is as same as key_names
|
38
41
|
|
@@ -197,6 +200,14 @@ Please don't forget that you need forward input configuration to receive the mes
|
|
197
200
|
## TODOs
|
198
201
|
* Input validation for Azure Search - check total size of columns to add
|
199
202
|
|
203
|
+
## Change log
|
204
|
+
* [Changelog](ChangeLog.md)
|
205
|
+
|
206
|
+
## Links
|
207
|
+
|
208
|
+
* http://yokawasa.github.io/fluent-plugin-azuresearch
|
209
|
+
* https://rubygems.org/gems/fluent-plugin-azuresearch
|
210
|
+
|
200
211
|
## Contributing
|
201
212
|
|
202
213
|
Bug reports and pull requests are welcome on GitHub at https://github.com/yokawasa/fluent-plugin-azuresearch.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
SERVICE_NAME='Azure Search Service Name'
|
4
|
+
ADMIN_KEY='Azure Search API Admin Key'
|
5
|
+
API_VER='2015-02-28-Preview'
|
6
|
+
CONTENT_TYPE='application/json'
|
7
|
+
URL="https://${SERVICE_NAME}.search.windows.net/indexes?api-version=${API_VER}"
|
8
|
+
|
9
|
+
curl -s\
|
10
|
+
-H "Content-Type: ${CONTENT_TYPE}"\
|
11
|
+
-H "api-key: ${ADMIN_KEY}"\
|
12
|
+
-XPOST ${URL} -d'{
|
13
|
+
"name": "messages",
|
14
|
+
"fields": [
|
15
|
+
{ "name":"id", "type":"Edm.String", "key": true, "searchable": false },
|
16
|
+
{ "name":"user_name", "type":"Edm.String" },
|
17
|
+
{ "name":"message", "type":"Edm.String", "filterable":false, "sortable":false, "facetable":false, "analyzer":"en.lucene" },
|
18
|
+
{ "name":"created_at", "type":"Edm.DateTimeOffset", "facetable":false}
|
19
|
+
]
|
20
|
+
}'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<source>
|
2
|
+
@type forward
|
3
|
+
@id forward_input
|
4
|
+
</source>
|
5
|
+
|
6
|
+
<match azuresearch.*>
|
7
|
+
@type azuresearch
|
8
|
+
@log_level info
|
9
|
+
endpoint https://<AzureSearchServiceName>.search.windows.net
|
10
|
+
api_key <Azure Search API Admin Key>
|
11
|
+
search_index messages
|
12
|
+
column_names id,user_name,message,created_at
|
13
|
+
key_names postid,user,content,posttime
|
14
|
+
</match>
|
@@ -18,10 +18,9 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_dependency "fluentd", [">= 0.
|
21
|
+
gem.add_dependency "fluentd", [">= 0.14.15", "< 2"]
|
22
22
|
gem.add_dependency "rest-client"
|
23
23
|
gem.add_development_dependency "bundler", "~> 1.11"
|
24
24
|
gem.add_development_dependency "rake", "~> 10.0"
|
25
25
|
gem.add_development_dependency "test-unit"
|
26
26
|
end
|
27
|
-
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Fluent
|
1
|
+
module Fluent::Plugin
|
2
2
|
module AzureSearch
|
3
3
|
class Client
|
4
4
|
|
@@ -16,8 +16,8 @@ module Fluent
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def add_documents(index_name, documents, merge=true)
|
19
|
-
raise ConfigError, 'no index_name' if index_name.empty?
|
20
|
-
raise ConfigError, 'no documents' if documents.empty?
|
19
|
+
raise Fluent::ConfigError, 'no index_name' if index_name.empty?
|
20
|
+
raise Fluent::ConfigError, 'no documents' if documents.empty?
|
21
21
|
action = merge ? 'mergeOrUpload' : 'upload'
|
22
22
|
for document in documents
|
23
23
|
document['@search.action'] = action
|
@@ -1,15 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require 'fluent/plugin/output'
|
4
|
+
require 'msgpack'
|
5
|
+
require 'time'
|
6
|
+
require 'fluent/plugin/azuresearch/client'
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
module Fluent::Plugin
|
9
|
+
class AzureSearchOutput < Output
|
10
|
+
Fluent::Plugin.register_output('azuresearch', self)
|
11
|
+
|
12
|
+
helpers :compat_parameters
|
13
|
+
|
14
|
+
DEFAULT_BUFFER_TYPE = "memory"
|
13
15
|
|
14
16
|
config_param :endpoint, :string,
|
15
17
|
:desc => "Azure Search Endpoint URL"
|
@@ -26,23 +28,29 @@ ${time} is placeholder for Time.at(time).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
26
28
|
and ${tag} is placeholder for tag
|
27
29
|
DESC
|
28
30
|
|
31
|
+
config_section :buffer do
|
32
|
+
config_set_default :@type, DEFAULT_BUFFER_TYPE
|
33
|
+
config_set_default :chunk_keys, ['tag']
|
34
|
+
end
|
35
|
+
|
29
36
|
def configure(conf)
|
37
|
+
compat_parameters_convert(conf, :buffer)
|
30
38
|
super
|
31
|
-
raise ConfigError, 'no endpoint' if @endpoint.empty?
|
32
|
-
raise ConfigError, 'no api_key' if @api_key.empty?
|
33
|
-
raise ConfigError, 'no search_index' if @search_index.empty?
|
34
|
-
raise ConfigError, 'no column_names' if @column_names.empty?
|
35
|
-
|
39
|
+
raise Fluent::ConfigError, 'no endpoint' if @endpoint.empty?
|
40
|
+
raise Fluent::ConfigError, 'no api_key' if @api_key.empty?
|
41
|
+
raise Fluent::ConfigError, 'no search_index' if @search_index.empty?
|
42
|
+
raise Fluent::ConfigError, 'no column_names' if @column_names.empty?
|
43
|
+
|
36
44
|
@column_names = @column_names.split(',')
|
37
45
|
@key_names = @key_names.nil? ? @column_names : @key_names.split(',')
|
38
|
-
raise ConfigError, 'NOT match keys number: column_names and key_names' \
|
46
|
+
raise Fluent::ConfigError, 'NOT match keys number: column_names and key_names' \
|
39
47
|
if @key_names.length != @column_names.length
|
40
48
|
end
|
41
49
|
|
42
50
|
def start
|
43
51
|
super
|
44
52
|
# start
|
45
|
-
@client=Fluent::AzureSearch::Client::new( @endpoint, @api_key )
|
53
|
+
@client=Fluent::Plugin::AzureSearch::Client::new( @endpoint, @api_key )
|
46
54
|
end
|
47
55
|
|
48
56
|
def shutdown
|
@@ -65,6 +73,14 @@ DESC
|
|
65
73
|
[tag, time, values].to_msgpack
|
66
74
|
end
|
67
75
|
|
76
|
+
def formatted_to_msgpack_binary?
|
77
|
+
true
|
78
|
+
end
|
79
|
+
|
80
|
+
def multi_workers_ready?
|
81
|
+
true
|
82
|
+
end
|
83
|
+
|
68
84
|
def write(chunk)
|
69
85
|
documents = []
|
70
86
|
chunk.msgpack_each do |tag, time, values|
|
@@ -79,7 +95,7 @@ DESC
|
|
79
95
|
res = @client.add_documents(@search_index, documents)
|
80
96
|
puts res
|
81
97
|
rescue Exception => ex
|
82
|
-
|
98
|
+
log.fatal "UnknownError: '#{ex}'"
|
83
99
|
+ ", data=>" + (documents.to_json).to_s
|
84
100
|
end
|
85
101
|
end
|
data/test/helper.rb
CHANGED
@@ -18,57 +18,57 @@ class AzureSearchOutputTest < Test::Unit::TestCase
|
|
18
18
|
# utc
|
19
19
|
# ]
|
20
20
|
|
21
|
-
def create_driver(conf = CONFIG
|
22
|
-
Fluent::Test::
|
21
|
+
def create_driver(conf = CONFIG)
|
22
|
+
Fluent::Test::Driver::Output.new(Fluent::Plugin::AzureSearchOutput).configure(conf)
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_configure
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# assert_equal 'test_path', d.instance.path
|
33
|
-
# assert_equal :gz, d.instance.compress
|
26
|
+
d = create_driver
|
27
|
+
|
28
|
+
assert_equal 'https://AZURE_SEARCH_ACCOUNT.search.windows.net', d.instance.endpoint
|
29
|
+
assert_equal 'AZURE_SEARCH_API_KEY', d.instance.api_key
|
30
|
+
assert_equal 'messages', d.instance.search_index
|
31
|
+
assert_equal ["id", "user_name", "message", "tag", "created_at"], d.instance.column_names
|
34
32
|
end
|
35
33
|
|
36
34
|
def test_format
|
37
35
|
d = create_driver
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# d.expect_format %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n]
|
37
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
38
|
+
d.run(default_tag: 'documentdb.test') do
|
39
|
+
d.feed(time, {"a"=>1})
|
40
|
+
d.feed(time, {"a"=>2})
|
41
|
+
end
|
45
42
|
|
46
|
-
# d.
|
43
|
+
# assert_equal EXPECTED1, d.formatted[0]
|
44
|
+
# assert_equal EXPECTED2, d.formatted[1]
|
47
45
|
end
|
48
46
|
|
49
47
|
def test_write
|
50
48
|
d = create_driver
|
51
49
|
|
52
|
-
time =
|
53
|
-
d.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
50
|
+
time = event_time("2016-01-28 13:14:15 UTC")
|
51
|
+
data = d.run(default_tag: 'azuresearch.test') do
|
52
|
+
d.feed(
|
53
|
+
time,
|
54
|
+
{
|
55
|
+
"postid" => "10001",
|
56
|
+
"user"=> "ladygaga",
|
57
|
+
"content" => "post by ladygaga",
|
58
|
+
"tag" => "azuresearch.msg",
|
59
|
+
"posttime" =>"2016-01-31T00:00:00Z"
|
60
|
+
})
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
62
|
+
d.feed(
|
63
|
+
time,
|
64
|
+
{
|
65
|
+
"postid" => "10002",
|
66
|
+
"user"=> "katyperry",
|
67
|
+
"content" => "post by katyperry",
|
68
|
+
"tag" => "azuresearch.msg",
|
69
|
+
"posttime" => "2016-01-31T00:00:00Z"
|
70
|
+
})
|
71
|
+
end
|
72
72
|
puts data
|
73
73
|
# ### FileOutput#write returns path
|
74
74
|
# path = d.run
|
@@ -76,4 +76,3 @@ class AzureSearchOutputTest < Test::Unit::TestCase
|
|
76
76
|
# assert_equal expect_path, path
|
77
77
|
end
|
78
78
|
end
|
79
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-azuresearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoichi Kawasaki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.14.15
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '2'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.14.15
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '2'
|
@@ -94,11 +94,14 @@ extensions: []
|
|
94
94
|
extra_rdoc_files: []
|
95
95
|
files:
|
96
96
|
- ".gitignore"
|
97
|
-
- ChangeLog
|
97
|
+
- ChangeLog.md
|
98
98
|
- Gemfile
|
99
99
|
- README.md
|
100
100
|
- Rakefile
|
101
101
|
- VERSION
|
102
|
+
- examples/createindex-messages.sh
|
103
|
+
- examples/fluent.conf
|
104
|
+
- examples/send-event.sh
|
102
105
|
- fluent-plugin-azuresearch.gemspec
|
103
106
|
- lib/fluent/plugin/azuresearch/client.rb
|
104
107
|
- lib/fluent/plugin/out_azuresearch.rb
|
@@ -124,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
127
|
version: '0'
|
125
128
|
requirements: []
|
126
129
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.5.
|
130
|
+
rubygems_version: 2.5.2
|
128
131
|
signing_key:
|
129
132
|
specification_version: 4
|
130
133
|
summary: Azure Search output plugin for Fluentd
|
data/ChangeLog
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
Release 0.1.2 - 2016/02/20
|
2
|
-
|
3
|
-
* Change gem package dependency option for rest-client from add_development_dependency to add_dependency
|
4
|
-
|
5
|
-
Release 0.1.1 - 2016/02/20
|
6
|
-
|
7
|
-
* Security enhanced option: Added secret option to api_key
|
8
|
-
|
9
|
-
Release 0.1.0 - 2016/02/11
|
10
|
-
|
11
|
-
* Inital Release
|