fluent-plugin-slack 0.5.2 → 0.5.3
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 +6 -0
- data/README.md +1 -0
- data/VERSION +1 -1
- data/lib/fluent/plugin/out_buffered_slack.rb +5 -0
- data/lib/fluent/plugin/out_slack.rb +5 -0
- data/lib/fluent/plugin/slack_client.rb +40 -10
- data/test/plugin/test_out_slack.rb +12 -0
- data/test/plugin/test_slack_client.rb +73 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60f17d6deefe9660f802349100a06f0dbb52be82
|
4
|
+
data.tar.gz: 6be0620df5d0e4e573f2ecb315e5e5134a511587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 754e0d821c9d4a62e885bc0c48298edfc5a3d60b3780e9c5b1321d1a5ca46eb19569bf39abd072dd6535b865dba6c5471cfa427f50a4a891e68a9c2c98c16161
|
7
|
+
data.tar.gz: ca145ab4794d3610ad727453b0013ffe2e18544a6a12a0189bb6cfeb0a11fe58f25e321bad7bcffab33957c1f7b9be306ec44b2b717ff902639d6aed46c41243
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -63,6 +63,7 @@ fluent_logger.post('slack', {
|
|
63
63
|
|message|message format. %s will be replaced with value specified by message_keys|%s|
|
64
64
|
|message_keys|keys used to format messages|message|
|
65
65
|
|auto_channels_create|Create channels if not exist. Available only with Web API mode, and a token for Normal User is required (Bot User can not create channels. See https://api.slack.com/bot-users)|false|
|
66
|
+
|https_proxy|https proxy url such as `https://proxy.foo.bar:443`|nil|
|
66
67
|
|
67
68
|
`fluent-plugin-slack` uses `SetTimeKeyMixin` and `SetTagKeyMixin`, so you can also use:
|
68
69
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.3
|
@@ -18,6 +18,7 @@ module Fluent
|
|
18
18
|
config_param :icon_emoji, :string, default: nil
|
19
19
|
config_param :icon_url, :string, default: nil
|
20
20
|
config_param :auto_channels_create, :bool, default: false
|
21
|
+
config_param :https_proxy, :string, default: nil
|
21
22
|
|
22
23
|
config_param :channel, :string
|
23
24
|
config_param :channel_keys, default: nil do |val|
|
@@ -72,6 +73,10 @@ module Fluent
|
|
72
73
|
@slack.log = log
|
73
74
|
@slack.debug_dev = log.out if log.level <= Fluent::Log::LEVEL_TRACE
|
74
75
|
|
76
|
+
if @https_proxy
|
77
|
+
@slack.https_proxy = @https_proxy
|
78
|
+
end
|
79
|
+
|
75
80
|
begin
|
76
81
|
@message % (['1'] * @message_keys.length)
|
77
82
|
rescue ArgumentError
|
@@ -18,6 +18,7 @@ module Fluent
|
|
18
18
|
config_param :icon_emoji, :string, default: nil
|
19
19
|
config_param :icon_url, :string, default: nil
|
20
20
|
config_param :auto_channels_create, :bool, default: false
|
21
|
+
config_param :https_proxy, :string, default: nil
|
21
22
|
|
22
23
|
config_param :channel, :string
|
23
24
|
config_param :channel_keys, default: nil do |val|
|
@@ -72,6 +73,10 @@ module Fluent
|
|
72
73
|
@slack.log = log
|
73
74
|
@slack.debug_dev = log.out if log.level <= Fluent::Log::LEVEL_TRACE
|
74
75
|
|
76
|
+
if @https_proxy
|
77
|
+
@slack.https_proxy = @https_proxy
|
78
|
+
end
|
79
|
+
|
75
80
|
begin
|
76
81
|
@message % (['1'] * @message_keys.length)
|
77
82
|
rescue ArgumentError
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'net/http'
|
3
|
+
require 'net/https'
|
3
4
|
require 'logger'
|
4
5
|
require_relative 'slack_client/error'
|
5
6
|
|
@@ -8,13 +9,41 @@ module Fluent
|
|
8
9
|
# The base framework of slack client
|
9
10
|
class Base
|
10
11
|
attr_accessor :log, :debug_dev
|
12
|
+
attr_reader :endpoint, :https_proxy
|
11
13
|
|
12
|
-
|
14
|
+
# @param [String] endpoint
|
15
|
+
#
|
16
|
+
# (Incoming Webhook) required
|
17
|
+
# https://hooks.slack.com/services/XXX/XXX/XXX
|
18
|
+
#
|
19
|
+
# (Web API) optional and default to be
|
20
|
+
# https://slack.com/api/
|
21
|
+
#
|
22
|
+
# @param [String] https_proxy (optional)
|
23
|
+
#
|
24
|
+
# https://proxy.foo.bar:port
|
25
|
+
#
|
26
|
+
def initialize(endpoint = nil, https_proxy = nil)
|
27
|
+
self.endpoint = endpoint if endpoint
|
28
|
+
self.https_proxy = https_proxy if https_proxy
|
13
29
|
@log = Logger.new('/dev/null')
|
14
30
|
end
|
15
31
|
|
32
|
+
def endpoint=(endpoint)
|
33
|
+
@endpoint = URI.parse(endpoint)
|
34
|
+
end
|
35
|
+
|
36
|
+
def https_proxy=(https_proxy)
|
37
|
+
@https_proxy = URI.parse(https_proxy)
|
38
|
+
@proxy_class = Net::HTTP.Proxy(@https_proxy.host, @https_proxy.port)
|
39
|
+
end
|
40
|
+
|
41
|
+
def proxy_class
|
42
|
+
@proxy_class ||= Net::HTTP
|
43
|
+
end
|
44
|
+
|
16
45
|
def post(endpoint, params)
|
17
|
-
http =
|
46
|
+
http = proxy_class.new(endpoint.host, endpoint.port)
|
18
47
|
http.use_ssl = (endpoint.scheme == 'https')
|
19
48
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
20
49
|
http.set_debug_output(debug_dev) if debug_dev
|
@@ -44,12 +73,9 @@ module Fluent
|
|
44
73
|
|
45
74
|
# Slack client for Incoming Webhook
|
46
75
|
class IncomingWebhook < Base
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def initialize(endpoint)
|
51
|
-
super()
|
52
|
-
@endpoint = URI.parse(endpoint)
|
76
|
+
def endpoint
|
77
|
+
return @endpoint if @endpoint
|
78
|
+
raise ArgumentError, "Incoming Webhook endpoint is not configured"
|
53
79
|
end
|
54
80
|
|
55
81
|
def post_message(params = {}, opts = {})
|
@@ -75,12 +101,16 @@ module Fluent
|
|
75
101
|
class WebApi < Base
|
76
102
|
DEFAULT_ENDPOINT = "https://slack.com/api/".freeze
|
77
103
|
|
104
|
+
def endpoint
|
105
|
+
@endpoint ||= URI.parse(DEFAULT_ENDPOINT)
|
106
|
+
end
|
107
|
+
|
78
108
|
def post_message_endpoint
|
79
|
-
@post_message_endpoint ||= URI.join(
|
109
|
+
@post_message_endpoint ||= URI.join(endpoint, "chat.postMessage")
|
80
110
|
end
|
81
111
|
|
82
112
|
def channels_create_endpoint
|
83
|
-
@channels_create_endpoint ||= URI.join(
|
113
|
+
@channels_create_endpoint ||= URI.join(endpoint, "channels.create")
|
84
114
|
end
|
85
115
|
|
86
116
|
# Sends a message to a channel.
|
@@ -160,6 +160,18 @@ class SlackOutputTest < Test::Unit::TestCase
|
|
160
160
|
assert_equal @icon_url, d.instance.icon_url
|
161
161
|
end
|
162
162
|
|
163
|
+
def test_https_proxy_configure
|
164
|
+
# default
|
165
|
+
d = create_driver(CONFIG)
|
166
|
+
assert_equal nil, d.instance.slack.https_proxy
|
167
|
+
assert_equal Net::HTTP, d.instance.slack.proxy_class
|
168
|
+
|
169
|
+
# https_proxy
|
170
|
+
d = create_driver(CONFIG + %[https_proxy https://proxy.foo.bar:443])
|
171
|
+
assert_equal URI.parse('https://proxy.foo.bar:443'), d.instance.slack.https_proxy
|
172
|
+
assert_not_equal Net::HTTP, d.instance.slack.proxy_class # Net::HTTP.Proxy
|
173
|
+
end
|
174
|
+
|
163
175
|
def test_default_incoming_webhook
|
164
176
|
d = create_driver(%[
|
165
177
|
channel channel
|
@@ -2,6 +2,8 @@ require_relative '../test_helper'
|
|
2
2
|
require 'fluent/plugin/slack_client'
|
3
3
|
require 'time'
|
4
4
|
require 'dotenv'
|
5
|
+
require 'webrick'
|
6
|
+
require 'webrick/httpproxy'
|
5
7
|
|
6
8
|
# HOW TO RUN
|
7
9
|
#
|
@@ -12,20 +14,60 @@ require 'dotenv'
|
|
12
14
|
#
|
13
15
|
Dotenv.load
|
14
16
|
if ENV['WEBHOOK_URL'] and ENV['TOKEN']
|
17
|
+
|
18
|
+
class TestProxyServer
|
19
|
+
def initialize
|
20
|
+
@proxy = WEBrick::HTTPProxyServer.new(
|
21
|
+
:BindAddress => '127.0.0.1',
|
22
|
+
:Port => unused_port,
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def proxy_url
|
27
|
+
"https://127.0.0.1:#{unused_port}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def start
|
31
|
+
@thread = Thread.new do
|
32
|
+
@proxy.start
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def shutdown
|
37
|
+
@proxy.shutdown
|
38
|
+
end
|
39
|
+
|
40
|
+
def unused_port
|
41
|
+
return @unused_port if @unused_port
|
42
|
+
s = TCPServer.open(0)
|
43
|
+
port = s.addr[1]
|
44
|
+
s.close
|
45
|
+
@unused_port = port
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
15
49
|
class SlackClientTest < Test::Unit::TestCase
|
16
50
|
def setup
|
17
51
|
super
|
52
|
+
@proxy = TestProxyServer.new.tap {|proxy| proxy.start }
|
18
53
|
@incoming_webhook = Fluent::SlackClient::IncomingWebhook.new(ENV['WEBHOOK_URL'])
|
19
54
|
@api = Fluent::SlackClient::WebApi.new
|
55
|
+
@incoming_webhook_proxy = Fluent::SlackClient::IncomingWebhook.new(ENV['WEBHOOK_URL'], @proxy.proxy_url)
|
56
|
+
@api_proxy = Fluent::SlackClient::WebApi.new(nil, @proxy.proxy_url)
|
57
|
+
|
20
58
|
@icon_url = 'http://www.google.com/s2/favicons?domain=www.google.de'
|
21
59
|
end
|
22
60
|
|
61
|
+
def teardown
|
62
|
+
@proxy.shutdown
|
63
|
+
end
|
64
|
+
|
23
65
|
def token(client)
|
24
|
-
client
|
66
|
+
client.is_a?(Fluent::SlackClient::WebApi) ? {token: ENV['TOKEN']} : {}
|
25
67
|
end
|
26
68
|
|
27
69
|
def test_post_message_text
|
28
|
-
[@incoming_webhook, @api].each do |slack|
|
70
|
+
[@incoming_webhook, @api, @incoming_webhook_proxy, @api_proxy].each do |slack|
|
29
71
|
assert_nothing_raised do
|
30
72
|
slack.post_message(
|
31
73
|
{
|
@@ -43,8 +85,36 @@ if ENV['WEBHOOK_URL'] and ENV['TOKEN']
|
|
43
85
|
end
|
44
86
|
end
|
45
87
|
|
88
|
+
def test_post_message_fields
|
89
|
+
[@incoming_webhook, @api, @incoming_webhook_proxy, @api_proxy].each do |slack|
|
90
|
+
assert_nothing_raised do
|
91
|
+
slack.post_message(
|
92
|
+
{
|
93
|
+
channel: '#general',
|
94
|
+
username: 'fluentd',
|
95
|
+
icon_emoji: ':question:',
|
96
|
+
attachments: [{
|
97
|
+
color: 'good',
|
98
|
+
fallback: 'test1 test2',
|
99
|
+
fields: [
|
100
|
+
{
|
101
|
+
title: 'test1',
|
102
|
+
value: "[07:00:00] sowawa1\n[07:00:00] sowawa2\n",
|
103
|
+
},
|
104
|
+
{
|
105
|
+
title: 'test2',
|
106
|
+
value: "[07:00:00] sowawa1\n[07:00:00] sowawa2\n",
|
107
|
+
},
|
108
|
+
],
|
109
|
+
}]
|
110
|
+
}.merge(token(slack))
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
46
116
|
def test_post_message_icon_url
|
47
|
-
[@incoming_webhook, @api].each do |slack|
|
117
|
+
[@incoming_webhook, @api, @incoming_webhook_proxy, @api_proxy].each do |slack|
|
48
118
|
assert_nothing_raised do
|
49
119
|
slack.post_message(
|
50
120
|
{
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-slack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keisuke SOGAWA
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|