fluent-plugin-typetalk 0.0.1 → 0.0.2
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 +8 -8
- data/.travis.yml +3 -0
- data/README.md +26 -15
- data/fluent-plugin-typetalk.gemspec +3 -1
- data/lib/fluent/plugin/out_typetalk.rb +57 -5
- data/test/plugin/test_out_typetalk.rb +6 -4
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MzFhNThjMWE0NjIzNmIyZDNhMDk4ODg1OTM0OGQ3ZTNjOGIwYjUzOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YmE2Y2ZkM2ViZmNmNzg0MzRiMGFhYmI5MzU2N2IwODk0MTA4ZDdlOQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODQzZDBmMjc1Zjc4Njg1ZWY5NTczMjE3NDI5ODEzZTE0MzIyZDRlZGJiNzU2
|
10
|
+
NzhlNTljZmYyOWU3MDBjYjI5MmQwMGZiMmNiY2EyNjk3NWEwZGJhYmViNjM2
|
11
|
+
YmJlOGUzYjM1OWU0MzM4NTRjYTQ4NDA5YjVhMTY4ZDQ1ZDFhYWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjBkMjgyODJjZDgzY2E3NjA1YTI1ODRiMGI4MDlmNTA0NzhhZmUxY2Q0MzIz
|
14
|
+
ZTZkNmQzODE2NWI5YmVmMzQ0YTcyZGFiMWQ2NWRiYzJhYjMzYjljNjQ4MTQ3
|
15
|
+
NzFjMTE4OTVkNDhlOTYxYjFhOWQ1YzNiZjFlOWRkZTdiZTFhZDA=
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# fluent-plugin-typetalk
|
1
|
+
# fluent-plugin-typetalk [](https://travis-ci.org/tksmd/fluent-plugin-typetalk)
|
2
2
|
|
3
3
|
## Overview
|
4
4
|
|
5
|
-
[Fluentd](http://fluentd.org) plugin to emit notifications to Typetalk.
|
5
|
+
[Fluentd](http://fluentd.org) plugin to emit notifications to [Typetalk](http://typetalk.in/).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -27,29 +27,30 @@ This plugin uses client credentials for authentication. See [the developer docum
|
|
27
27
|
client_id YOUR_CLIENT_ID
|
28
28
|
client_secret YOUR_CLIENT_SECRET
|
29
29
|
topic_id YOUR_TOPIC_ID
|
30
|
+
message notice: %s [%s] %s errors found
|
31
|
+
out_keys tag,time,count
|
32
|
+
time_key time
|
33
|
+
time_format %Y/%m/%d %H:%M:%S
|
34
|
+
tag_key tag
|
30
35
|
</match>
|
31
36
|
```
|
32
37
|
|
33
|
-
The
|
34
|
-
```
|
35
|
-
test at 2014-05-13 01:21:30 0900
|
36
|
-
{"message":"test1"}
|
37
|
-
```
|
38
|
+
The notified message will look like this : `notice: count.service [2014/05/13 03:34:02] 200 errors found`. The meanings of out_keys,time_key,time_format and tag_key are equivalent to those of [fluent-plugin-ikachan](https://github.com/tagomoris/fluent-plugin-ikachan).
|
38
39
|
|
39
|
-
|
40
|
+
This plugin allows you to use special value namely $hostname in out_keys. By using it, you can include hostname within the notified message.
|
40
41
|
```
|
41
42
|
<match ...>
|
42
43
|
type typetalk
|
43
44
|
client_id YOUR_CLIENT_ID
|
44
45
|
client_secret YOUR_CLIENT_SECRET
|
45
46
|
topic_id YOUR_TOPIC_ID
|
46
|
-
|
47
|
+
message notice: %s [%s] %s errors found on %s
|
48
|
+
out_keys tag,time,count,$hostname
|
49
|
+
time_key time
|
50
|
+
time_format %Y/%m/%d %H:%M:%S
|
51
|
+
tag_key tag
|
47
52
|
</match>
|
48
53
|
```
|
49
|
-
Then you'll get the output like this:
|
50
|
-
```
|
51
|
-
Check! {"message":"test1"}
|
52
|
-
```
|
53
54
|
|
54
55
|
## TODO
|
55
56
|
|
@@ -57,12 +58,22 @@ Pull requests are very welcome!!
|
|
57
58
|
|
58
59
|
## For developers
|
59
60
|
|
61
|
+
You have to run the command below when starting development.
|
62
|
+
```
|
63
|
+
$ bundle install --path vendor/bundle
|
64
|
+
```
|
65
|
+
|
60
66
|
To run tests, do the following.
|
61
67
|
```
|
62
68
|
$ VERBOSE=1 bundle exec rake test
|
63
69
|
```
|
64
70
|
|
71
|
+
When releasing, call rake release as follows.
|
72
|
+
```
|
73
|
+
$ bundle exec rake release
|
74
|
+
```
|
75
|
+
|
65
76
|
## Copyright
|
66
77
|
|
67
|
-
|
68
|
-
|
78
|
+
* Copyright (c) 2014- Takashi Someda ([@tksmd](http://twitter.com/tksmd/))
|
79
|
+
* Apache License, Version 2.0
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "fluent-plugin-typetalk"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.2"
|
8
8
|
spec.authors = ["tksmd"]
|
9
9
|
spec.email = ["someda@isenshi.com"]
|
10
10
|
spec.description = %q{fluent plugin to send message to typetalk}
|
@@ -21,4 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "rake"
|
22
22
|
spec.add_development_dependency "rr", ">= 1.0.0"
|
23
23
|
spec.add_runtime_dependency "fluentd"
|
24
|
+
|
25
|
+
spec.required_ruby_version = '>= 1.9.3'
|
24
26
|
end
|
@@ -5,9 +5,14 @@ module Fluent
|
|
5
5
|
config_param :client_id, :string
|
6
6
|
config_param :client_secret, :string
|
7
7
|
config_param :topic_id, :integer
|
8
|
-
config_param :template, :string, :default => "<%= tag %> at <%= Time.at(time).localtime %>\n<%= record.to_json %>"
|
9
8
|
config_param :flush_interval, :time, :default => 1
|
10
9
|
|
10
|
+
config_param :message, :string
|
11
|
+
config_param :out_keys, :string, :default => ""
|
12
|
+
config_param :time_key, :string, :default => 'time'
|
13
|
+
config_param :time_format, :string, :default => nil
|
14
|
+
config_param :tag_key, :string, :default => 'tag'
|
15
|
+
|
11
16
|
attr_reader :typetalk
|
12
17
|
|
13
18
|
# Define `log` method for v0.10.42 or earlier
|
@@ -19,11 +24,32 @@ module Fluent
|
|
19
24
|
def initialize
|
20
25
|
super
|
21
26
|
require 'erb'
|
27
|
+
require 'socket'
|
22
28
|
end
|
23
29
|
|
24
30
|
def configure(conf)
|
25
31
|
super
|
26
32
|
@typetalk = Typetalk.new(conf['client_id'], conf['client_secret'])
|
33
|
+
@hostname = Socket.gethostname
|
34
|
+
|
35
|
+
@out_keys = @out_keys.split(',')
|
36
|
+
|
37
|
+
begin
|
38
|
+
@message % (['1'] * @out_keys.length)
|
39
|
+
rescue ArgumentError
|
40
|
+
raise Fluent::ConfigError, "string specifier '%s' and out_keys specification mismatch"
|
41
|
+
end
|
42
|
+
|
43
|
+
if @time_format
|
44
|
+
f = @time_format
|
45
|
+
tf = Fluent::TimeFormatter.new(f, true) # IRC notification is formmatted as localtime only...
|
46
|
+
@time_format_proc = tf.method(:format)
|
47
|
+
@time_parse_proc = Proc.new {|str| Time.strptime(str, f).to_i }
|
48
|
+
else
|
49
|
+
@time_format_proc = Proc.new {|time| time.to_s }
|
50
|
+
@time_parse_proc = Proc.new {|str| str.to_i }
|
51
|
+
end
|
52
|
+
|
27
53
|
end
|
28
54
|
|
29
55
|
def start
|
@@ -49,14 +75,34 @@ module Fluent
|
|
49
75
|
end
|
50
76
|
|
51
77
|
def send_message(tag, time, record)
|
52
|
-
message =
|
78
|
+
message = evaluate_message(tag, time, record)
|
53
79
|
@typetalk.post(@topic_id, message)
|
54
80
|
end
|
55
81
|
|
82
|
+
def evaluate_message(tag, time, record)
|
83
|
+
|
84
|
+
values = out_keys.map do |key|
|
85
|
+
case key
|
86
|
+
when @time_key
|
87
|
+
@time_format_proc.call(time)
|
88
|
+
when @tag_key
|
89
|
+
tag
|
90
|
+
when "$hostname"
|
91
|
+
@hostname
|
92
|
+
else
|
93
|
+
record[key].to_s
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
(message % values).gsub(/\\n/, "\n")
|
98
|
+
end
|
99
|
+
|
56
100
|
end
|
57
101
|
|
58
102
|
class Typetalk
|
59
103
|
|
104
|
+
USER_AGENT = "fluent-plugin-typetalk Ruby/#{RUBY_VERSION}"
|
105
|
+
|
60
106
|
def initialize(client_id, client_secret)
|
61
107
|
require 'net/http'
|
62
108
|
require 'uri'
|
@@ -76,12 +122,17 @@ module Fluent
|
|
76
122
|
res = @http.post(
|
77
123
|
"/api/v1/topics/#{topic_id}",
|
78
124
|
"message=#{message}",
|
79
|
-
{ 'Authorization' => "Bearer #{@access_token}" }
|
125
|
+
{ 'Authorization' => "Bearer #{@access_token}", 'User-Agent' => USER_AGENT }
|
80
126
|
)
|
81
127
|
|
82
128
|
# todo: handling 429
|
83
129
|
unless res and res.is_a?(Net::HTTPSuccess)
|
84
|
-
|
130
|
+
msg = ""
|
131
|
+
unless res.body.nil?
|
132
|
+
json = JSON.parse(res.body)
|
133
|
+
msg = json.fetch('errors', [])[0].fetch('message',"")
|
134
|
+
end
|
135
|
+
raise TypetalkError, "failed to post, msg: #{msg}, code: #{res.code}"
|
85
136
|
end
|
86
137
|
|
87
138
|
end
|
@@ -106,7 +157,8 @@ module Fluent
|
|
106
157
|
|
107
158
|
res = @http.post(
|
108
159
|
"/oauth2/access_token",
|
109
|
-
params
|
160
|
+
params,
|
161
|
+
{ 'User-Agent' => USER_AGENT }
|
110
162
|
)
|
111
163
|
|
112
164
|
if res.is_a?(Net::HTTPUnauthorized)
|
@@ -13,7 +13,8 @@ class TypetalkOutputTest < Test::Unit::TestCase
|
|
13
13
|
client_id 123456
|
14
14
|
client_secret secret
|
15
15
|
topic_id 1
|
16
|
-
|
16
|
+
message notice : %s
|
17
|
+
out_keys message
|
17
18
|
]
|
18
19
|
|
19
20
|
def create_driver(conf = CONFIG, tag = 'test')
|
@@ -28,15 +29,16 @@ class TypetalkOutputTest < Test::Unit::TestCase
|
|
28
29
|
|
29
30
|
def test_write
|
30
31
|
d = create_driver()
|
31
|
-
stub(d.instance.typetalk).post(1, '
|
32
|
+
stub(d.instance.typetalk).post(1, 'notice : test1')
|
32
33
|
d.emit({'message' => 'test1'})
|
33
34
|
d.run()
|
34
35
|
end
|
35
36
|
|
36
37
|
def test_template
|
37
38
|
d = create_driver(CONFIG, 'warn')
|
38
|
-
d.instance.
|
39
|
-
|
39
|
+
d.instance.message = "notice : %s [%s]"
|
40
|
+
d.instance.out_keys = ["message", "time"]
|
41
|
+
stub(d.instance.typetalk).post(1, "notice : test1 [1399910738]")
|
40
42
|
|
41
43
|
ENV["TZ"]="Asia/Tokyo"
|
42
44
|
t = Time.strptime('2014-05-13 01:05:38', '%Y-%m-%d %T')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-typetalk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tksmd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -74,6 +74,7 @@ extensions: []
|
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
76
|
- .gitignore
|
77
|
+
- .travis.yml
|
77
78
|
- Gemfile
|
78
79
|
- LICENSE.txt
|
79
80
|
- README.md
|
@@ -94,7 +95,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
95
|
requirements:
|
95
96
|
- - ! '>='
|
96
97
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
98
|
+
version: 1.9.3
|
98
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
100
|
requirements:
|
100
101
|
- - ! '>='
|