fluent-plugin-boundio 0.0.2 → 0.1.1
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/README.md +28 -8
- data/example.conf +115 -0
- data/fluent-plugin-boundio.gemspec +1 -1
- data/lib/fluent/plugin/out_boundio.rb +16 -10
- data/test/plugin/test_out_boundio.rb +9 -9
- metadata +7 -6
data/README.md
CHANGED
@@ -16,9 +16,18 @@ gem install fluent-plugin-boundio
|
|
16
16
|
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-boundio
|
17
17
|
`````
|
18
18
|
|
19
|
-
##
|
19
|
+
## Configuration
|
20
20
|
|
21
|
-
###
|
21
|
+
### Message Format
|
22
|
+
`````
|
23
|
+
fluent_logger.post('notify.call', {
|
24
|
+
:message => 'Hello World!', # Required
|
25
|
+
:number => '090-1234-5678', # Optional
|
26
|
+
:voice => 'male' # Optional
|
27
|
+
})
|
28
|
+
`````
|
29
|
+
|
30
|
+
### Sample
|
22
31
|
`````
|
23
32
|
<source>
|
24
33
|
type http
|
@@ -27,22 +36,32 @@ gem install fluent-plugin-boundio
|
|
27
36
|
|
28
37
|
<match notify.call>
|
29
38
|
type boundio
|
30
|
-
user_serial_id
|
31
|
-
api_key
|
32
|
-
user_key
|
33
|
-
default_number
|
39
|
+
user_serial_id BOUNDIO_USER_SERIAL_ID # Required
|
40
|
+
api_key BOUNDIO_API_KEY # Required
|
41
|
+
user_key BOUNDIO_USER_KEY # Required
|
42
|
+
default_number 090-1234-5678 # Optional
|
43
|
+
default_voice female # Optional [female/male] (default: female)
|
34
44
|
# http://boundio.jp/docs/%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%83%84%E3%83%BC%E3%83%AB
|
35
45
|
developer_tool yes
|
36
46
|
</match>
|
37
47
|
`````
|
38
48
|
|
39
|
-
###
|
49
|
+
### Quick Test
|
40
50
|
`````
|
41
|
-
|
51
|
+
# test call to 09012345678 and say "Help! System ABC has down." with male voice.
|
52
|
+
$ curl http://localhost:8888/notify.call -F 'json={"number":"09012345678","voice":"male","message":"Help! System ABC has down."}'
|
53
|
+
|
54
|
+
# check boundio activity log
|
42
55
|
$ tail -f /var/log/td-agent/td-agent.log
|
43
56
|
`````
|
44
57
|
|
58
|
+
## Reference
|
59
|
+
|
60
|
+
### Use Case1: make a call when it goes to over 5 times 500_errors in a minutes.
|
61
|
+
http://github.com/y-ken/fluent-plugin-boundio/blob/master/example.conf
|
62
|
+
|
45
63
|
## Backend Service
|
64
|
+
You can register to get 20 times trial call credit.
|
46
65
|
http://boundio.jp/
|
47
66
|
|
48
67
|
## TODO
|
@@ -53,3 +72,4 @@ Copyright © 2012- Kentaro Yoshida (@yoshi_ken)
|
|
53
72
|
|
54
73
|
## License
|
55
74
|
Apache License, Version 2.0
|
75
|
+
|
data/example.conf
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
## It is a example to make a call when it goes to over 5 times 500_errors in a minutes.
|
2
|
+
##
|
3
|
+
## * Apache LogFormat (httpd.conf)
|
4
|
+
## LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
|
5
|
+
##
|
6
|
+
## * Target Website
|
7
|
+
## www.example.com
|
8
|
+
##
|
9
|
+
## * required plugin
|
10
|
+
## fluent-plugin-rewrite-tag-filter
|
11
|
+
## fluent-plugin-datacounter
|
12
|
+
## fluent-plugin-notifier
|
13
|
+
## fluent-plugin-parser
|
14
|
+
## fluent-plugin-boundio
|
15
|
+
|
16
|
+
## following an access_log
|
17
|
+
<source>
|
18
|
+
type tail
|
19
|
+
path /var/log/httpd/access_log
|
20
|
+
format /^(?<domain>[^ ]*) (?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time>[^ ]*))?$/
|
21
|
+
time_format %d/%b/%Y:%H:%M:%S %z
|
22
|
+
tag log.apache.access
|
23
|
+
pos_file /var/log/td-agent/apache_access.pos
|
24
|
+
</source>
|
25
|
+
|
26
|
+
## extract the target domain and rewrite tag name to site.ExampleWebSite
|
27
|
+
<match log.apache.access>
|
28
|
+
type rewrite_tag_filter
|
29
|
+
rewriterule1 domain ^www.example.com$ site.ExampleWebSite
|
30
|
+
</match>
|
31
|
+
|
32
|
+
## count values of "status" by each pattern
|
33
|
+
# Record Sample:
|
34
|
+
# site.ExampleWebSite: {"domain":"www.example.com","host":"127.0.0.1","user":"-","method":"GET","path":"/home","status":"200","size":"12121","referer":"-","agent":"Wget","response_time":"0"}
|
35
|
+
<match site.ExampleWebSite>
|
36
|
+
type copy
|
37
|
+
<store>
|
38
|
+
type stdout
|
39
|
+
</store>
|
40
|
+
<store>
|
41
|
+
type datacounter
|
42
|
+
unit minute
|
43
|
+
count_key status
|
44
|
+
tag count.responsecode.ExampleWebSite
|
45
|
+
aggregate all
|
46
|
+
pattern1 200 ^200$
|
47
|
+
pattern2 2xx ^2\d\d$
|
48
|
+
pattern3 301 ^301$
|
49
|
+
pattern4 302 ^302$
|
50
|
+
pattern5 3xx ^3\d\d$
|
51
|
+
pattern6 403 ^403$
|
52
|
+
pattern7 404 ^404$
|
53
|
+
pattern8 410 ^410$
|
54
|
+
pattern9 4xx ^4\d\d$
|
55
|
+
pattern10 500 ^5\d\d$
|
56
|
+
outcast_unmatched false
|
57
|
+
</store>
|
58
|
+
</match>
|
59
|
+
|
60
|
+
## output a record when the "status_500" value exceed threshold.
|
61
|
+
# Record Sample:
|
62
|
+
# count.responsecode.ExampleWebSite: {"unmatched_count":0,"unmatched_rate":0.0,"unmatched_percentage":0.0,"200_count":0,"200_rate":0.0,"200_percentage":0.0,"2xx_count":0,"2xx_rate":0.0,"2xx_percentage":0.0,"301_count":0,"301_rate":0.0,"301_percentage":0.0,"302_count":0,"302_rate":0.0,"302_percentage":0.0,"3xx_count":0,"3xx_rate":0.0,"3xx_percentage":0.0,"403_count":0,"403_rate":0.0,"403_percentage":0.0,"404_count":0,"404_rate":0.0,"404_percentage":0.0,"410_count":0,"410_rate":0.0,"410_percentage":0.0,"4xx_count":0,"4xx_rate":0.0,"4xx_percentage":0.0,"500_count":20,"500_rate":0.33,"500_percentage":100.0}
|
63
|
+
<match count.responsecode.ExampleWebSite>
|
64
|
+
type copy
|
65
|
+
<store>
|
66
|
+
type stdout
|
67
|
+
</store>
|
68
|
+
<store>
|
69
|
+
type notifier
|
70
|
+
input_tag_remove_prefix count.responsecode
|
71
|
+
<def>
|
72
|
+
pattern status_500
|
73
|
+
check numeric_upward
|
74
|
+
warn_threshold 5
|
75
|
+
crit_threshold 20
|
76
|
+
tag alert.http_500_error
|
77
|
+
target_key_pattern ^500_count$
|
78
|
+
</def>
|
79
|
+
</store>
|
80
|
+
</match>
|
81
|
+
|
82
|
+
## build an alert message
|
83
|
+
# Record Sample:
|
84
|
+
# alert.http_500_error: {"pattern":"status_500","target_tag":"ExampleWebSite","target_key":"500_count","check_type":"numeric_upward","level":"crit","threshold":20.0,"value":20.0,"message_time":"2012-10-18 20:08:52 +0900"}
|
85
|
+
<match alert.http_500_error>
|
86
|
+
type copy
|
87
|
+
<store>
|
88
|
+
type stdout
|
89
|
+
</store>
|
90
|
+
<store>
|
91
|
+
type deparser
|
92
|
+
tag notify.call
|
93
|
+
# format WebSite has down level %s. The service of %s %s is exceed %s times. This threshold is %s now. Thank you.
|
94
|
+
format サイトが落ちました。レベルは%s。%sの%sが%s回を超えました。しきい値は%sです。対応お願いします。
|
95
|
+
format_key_names level,target_tag,target_key,value,threshold
|
96
|
+
key_name message
|
97
|
+
reserve_data no
|
98
|
+
</store>
|
99
|
+
</match>
|
100
|
+
|
101
|
+
# make a call to 09012345678
|
102
|
+
<match notify.call>
|
103
|
+
type copy
|
104
|
+
<store>
|
105
|
+
type stdout
|
106
|
+
</store>
|
107
|
+
<store>
|
108
|
+
type boundio
|
109
|
+
user_serial_id YOUR_BOUNDIO_USER_SERIAL_ID
|
110
|
+
api_key YOUR_BOUNDIO_API_KEY
|
111
|
+
user_key YOUR_BOUNDIO_USER_KEY
|
112
|
+
default_number 09012345678
|
113
|
+
developer_tool yes
|
114
|
+
</store>
|
115
|
+
</match>
|
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "fluent-plugin-boundio"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.1.1"
|
7
7
|
s.authors = ["Kentaro Yoshida"]
|
8
8
|
s.email = ["y.ken.studio@gmail.com"]
|
9
9
|
s.homepage = "https://github.com/y-ken/fluent-plugin-boundio"
|
@@ -2,46 +2,52 @@
|
|
2
2
|
class Fluent::BoundioOutput < Fluent::Output
|
3
3
|
Fluent::Plugin.register_output('boundio', self)
|
4
4
|
|
5
|
+
VOICE_MAP = {'female' => 0, 'male' => 1}
|
6
|
+
|
5
7
|
config_param :user_serial_id, :string
|
6
8
|
config_param :user_key, :string, :default => nil # Optional at this time
|
7
9
|
config_param :api_key, :string
|
8
|
-
config_param :default_number, :string
|
10
|
+
config_param :default_number, :string, :default => nil
|
11
|
+
config_param :default_voice, :string, :default => 'male'
|
9
12
|
config_param :developer_tool, :string, :default => 'no'
|
10
13
|
|
11
14
|
def initialize
|
12
15
|
super
|
13
|
-
|
14
16
|
require 'uri'
|
15
17
|
require 'net/https'
|
16
18
|
end
|
17
19
|
|
18
20
|
def configure(conf)
|
19
21
|
super
|
22
|
+
unless VOICE_MAP.include?(@default_voice)
|
23
|
+
raise Fluent::ConfigError, "boundio: invalid value for default_voice(male/female): #{@default_voice}"
|
24
|
+
end
|
20
25
|
@developer_tool = Fluent::Config.bool_value(@developer_tool) || false
|
21
|
-
|
26
|
+
$log.info "boundio: using developer tool api" if @developer_tool
|
22
27
|
end
|
23
28
|
|
24
29
|
def emit(tag, es, chain)
|
25
30
|
es.each do |time,record|
|
26
31
|
number = record['number'].nil? ? @default_number : record['number']
|
27
|
-
|
32
|
+
voice = VOICE_MAP.include?(record['voice']) ? record['voice'] : @default_voice
|
33
|
+
call(number, record['message'], voice)
|
28
34
|
end
|
29
35
|
|
30
36
|
chain.next
|
31
37
|
end
|
32
38
|
|
33
|
-
def call(number, message)
|
39
|
+
def call(number, message, voice = 'male')
|
34
40
|
begin
|
35
41
|
https = Net::HTTP.new('boundio.jp', 443)
|
36
42
|
https.use_ssl = true
|
37
|
-
cast = "file_d(#{message}, #{
|
38
|
-
query = 'key=' + @api_key + '&tel_to=' + number + '&cast=' + cast
|
43
|
+
cast = "file_d(#{message}, #{VOICE_MAP[voice]})"
|
44
|
+
query = 'key=' + @api_key + '&tel_to=' + number.gsub('-','') + '&cast=' + cast
|
39
45
|
path = @developer_tool ? '/api/vd2/' : '/api/v2/'
|
40
46
|
response = https.post(path + @user_serial_id + '/call', URI.escape(query))
|
41
|
-
$log.info "boundio makeing a call
|
42
|
-
$log.info "boundio call result: #{response.body}"
|
47
|
+
$log.info "boundio: makeing a call to #{number} and say '#{message}'"
|
48
|
+
$log.info "boundio: call result: #{response.body}"
|
43
49
|
rescue => e
|
44
|
-
$log.error
|
50
|
+
$log.error "boundio: Error: #{e.message}"
|
45
51
|
end
|
46
52
|
end
|
47
53
|
end
|
@@ -6,9 +6,9 @@ class BoundioOutputTest < Test::Unit::TestCase
|
|
6
6
|
end
|
7
7
|
|
8
8
|
CONFIG = %[
|
9
|
-
user_serial_id
|
10
|
-
api_key
|
11
|
-
user_key
|
9
|
+
user_serial_id BOUNDIO_USER_SERIAL_ID
|
10
|
+
api_key BOUNDIO_API_KEY
|
11
|
+
user_key BOUNDIO_USER_KEY
|
12
12
|
default_number 09012345678
|
13
13
|
]
|
14
14
|
|
@@ -21,15 +21,15 @@ class BoundioOutputTest < Test::Unit::TestCase
|
|
21
21
|
d = create_driver('')
|
22
22
|
}
|
23
23
|
d = create_driver %[
|
24
|
-
user_serial_id
|
25
|
-
api_key
|
26
|
-
user_key
|
24
|
+
user_serial_id BOUNDIO_USER_SERIAL_ID
|
25
|
+
api_key BOUNDIO_API_KEY
|
26
|
+
user_key BOUNDIO_USER_KEY
|
27
27
|
default_number 09012345678
|
28
28
|
]
|
29
29
|
d.instance.inspect
|
30
|
-
assert_equal '
|
31
|
-
assert_equal '
|
32
|
-
assert_equal '
|
30
|
+
assert_equal 'BOUNDIO_USER_SERIAL_ID', d.instance.user_serial_id
|
31
|
+
assert_equal 'BOUNDIO_API_KEY', d.instance.api_key
|
32
|
+
assert_equal 'BOUNDIO_USER_KEY', d.instance.user_key
|
33
33
|
assert_equal '09012345678', d.instance.default_number
|
34
34
|
end
|
35
35
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-boundio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
16
|
-
requirement: &
|
16
|
+
requirement: &21687940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *21687940
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: fluentd
|
27
|
-
requirement: &
|
27
|
+
requirement: &21687500 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *21687500
|
36
36
|
description:
|
37
37
|
email:
|
38
38
|
- y.ken.studio@gmail.com
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- LICENSE.txt
|
46
46
|
- README.md
|
47
47
|
- Rakefile
|
48
|
+
- example.conf
|
48
49
|
- fluent-plugin-boundio.gemspec
|
49
50
|
- lib/fluent/plugin/out_boundio.rb
|
50
51
|
- test/helper.rb
|