logstash-output-slack 0.1.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 +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +14 -0
- data/Gemfile +2 -0
- data/README.md +67 -0
- data/Rakefile +7 -0
- data/lib/logstash/outputs/slack.rb +77 -0
- data/logstash-output-slack.gemspec +31 -0
- data/spec/outputs/slack_spec.rb +100 -0
- data/spec/spec_helper.rb +3 -0
- metadata +162 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cd002e773f901f0e19f59cc7470426916b1df532
|
4
|
+
data.tar.gz: f2bb362492defe4a2e5fb67699baa1887cf239e9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2d83115a75c2c2439ac4f0d6f6a4f42cea987e3ee6b4a01355a6d462709feacd044f14778006d725967e51174d94b219403b0fd8b043e1408c2c0f09e661ee1
|
7
|
+
data.tar.gz: 0c17f282446caa837da74630205052315778a54192b00c2fd24f640c552d71778cd56599f207c39729f2c4ad9b8390737da174626aef35f8131f7e9b3b07b95a
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
[](https://travis-ci.org/cyli/logstash-output-slack)
|
2
|
+
|
3
|
+
## Logstash Slack Output Plugin
|
4
|
+
|
5
|
+
Uses Slack [incoming webhooks API](https://api.slack.com/incoming-webhooks) to send log events to Slack.
|
6
|
+
|
7
|
+
Usage:
|
8
|
+
|
9
|
+
```
|
10
|
+
input {
|
11
|
+
...
|
12
|
+
}
|
13
|
+
|
14
|
+
filters {
|
15
|
+
...
|
16
|
+
}
|
17
|
+
|
18
|
+
output {
|
19
|
+
...
|
20
|
+
slack {
|
21
|
+
url => <YOUR SLACK WEBHOOK URL HERE>
|
22
|
+
channel => [channel-name - this is optional]
|
23
|
+
username => [slack username - this is optional]
|
24
|
+
icon_emoji => [emoji, something like ":simple_smile:" - optional]
|
25
|
+
icon_url => [icon url, would be overriden by icon_emoji - optional]
|
26
|
+
format => [default is "%{message}", but used to format the text - optional]
|
27
|
+
}
|
28
|
+
}
|
29
|
+
```
|
30
|
+
|
31
|
+
Not supported yet: attachments
|
32
|
+
|
33
|
+
### Installation on Logstash >= 1.5
|
34
|
+
|
35
|
+
In the logstash directory, run: `bin/plugin install logstash-output-slack`
|
36
|
+
|
37
|
+
#### To build your own gem and install:
|
38
|
+
|
39
|
+
1. `git clone <thisrepo>`
|
40
|
+
1. `bundle install`
|
41
|
+
1. `gem build logstash-output-slack.gemspec`
|
42
|
+
|
43
|
+
You should just be able to do `bin/plugin install <path-to-your-built-gem>`, but due to [this bug](https://github.com/elastic/logstash/issues/2674) installing from a local gem doesn't work right now.
|
44
|
+
|
45
|
+
You need to:
|
46
|
+
|
47
|
+
1. Make sure that the `logstash-core` gem you've installed matches the exact beta 1.5 logstash version you are running.
|
48
|
+
1. modify the logstash Gemfile to include the line `gem "logstash-output-slack", :path => <path_to_the_directory_your_gem_is_in>`
|
49
|
+
1. `bin/plugin install --no-verify`
|
50
|
+
|
51
|
+
#### Verify that the plugin installed correctly
|
52
|
+
`bin/plugin list | grep logstash-output-slack`
|
53
|
+
|
54
|
+
#### Test that it works:
|
55
|
+
```
|
56
|
+
bin/logstash -e '
|
57
|
+
input { stdin {} }
|
58
|
+
output { slack { <your slack config here> }}'
|
59
|
+
```
|
60
|
+
|
61
|
+
And type some text in. The same text should appear in the channel it's configured to go in.
|
62
|
+
|
63
|
+
### Installation on Logstash < 1.4
|
64
|
+
|
65
|
+
Gem-installing this plugin would only work on Logstash 1.5. For Logstash < 1.5, you could just rename `lib` in this repo to `logstash`, and then run Logstash with `--pluginpath <path_to_this_repo>.
|
66
|
+
|
67
|
+
See the [flags](http://logstash.net/docs/1.4.2/flags) documentation for Logstash 1.4.
|
data/Rakefile
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/outputs/base"
|
3
|
+
require "logstash/namespace"
|
4
|
+
|
5
|
+
class LogStash::Outputs::Slack < LogStash::Outputs::Base
|
6
|
+
config_name "slack"
|
7
|
+
milestone 1
|
8
|
+
|
9
|
+
# The incoming webhook URI needed to post a message
|
10
|
+
config :url, :validate => :string, :required => true
|
11
|
+
|
12
|
+
# The text to post in slack
|
13
|
+
config :format, :validate => :string, :default => "%{message}"
|
14
|
+
|
15
|
+
# The channel to post to
|
16
|
+
config :channel, :validate => :string
|
17
|
+
|
18
|
+
# The username to use for posting
|
19
|
+
config :username, :validate => :string
|
20
|
+
|
21
|
+
# Emoji icon to use
|
22
|
+
config :icon_emoji, :validate => :string
|
23
|
+
|
24
|
+
# Icon URL to use
|
25
|
+
config :icon_url, :validate => :string
|
26
|
+
|
27
|
+
|
28
|
+
public
|
29
|
+
def register
|
30
|
+
require 'rest-client'
|
31
|
+
require 'cgi'
|
32
|
+
require 'json'
|
33
|
+
|
34
|
+
@content_type = "application/x-www-form-urlencoded"
|
35
|
+
end # def register
|
36
|
+
|
37
|
+
public
|
38
|
+
def receive(event)
|
39
|
+
return unless output?(event)
|
40
|
+
|
41
|
+
payload_json = Hash.new
|
42
|
+
payload_json['text'] = event.sprintf(@format)
|
43
|
+
|
44
|
+
if not @channel.nil?
|
45
|
+
payload_json['channel'] = @channel
|
46
|
+
end
|
47
|
+
|
48
|
+
if not @username.nil?
|
49
|
+
payload_json['username'] = @username
|
50
|
+
end
|
51
|
+
|
52
|
+
if not @icon_emoji.nil?
|
53
|
+
payload_json['icon_emoji'] = @icon_emoji
|
54
|
+
end
|
55
|
+
|
56
|
+
if not @icon_url.nil?
|
57
|
+
payload_json['icon_url'] = @icon_url
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
begin
|
62
|
+
RestClient.post(
|
63
|
+
@url,
|
64
|
+
"payload=#{CGI.escape(JSON.dump(payload_json))}",
|
65
|
+
:accept => "application/json",
|
66
|
+
:'User-Agent' => "logstash-output-slack",
|
67
|
+
:content_type => @content_type) { |response, request, result, &block|
|
68
|
+
if response.code != 200
|
69
|
+
@logger.warn("Got a #{response.code} result: " + result)
|
70
|
+
end
|
71
|
+
}
|
72
|
+
rescue Exception => e
|
73
|
+
@logger.warn("Unhandled exception", :exception => e,
|
74
|
+
:stacktrace => e.backtrace)
|
75
|
+
end
|
76
|
+
end # def receive
|
77
|
+
end # class LogStash::Outputs::Slack
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'logstash-output-slack'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.licenses = ['MIT','Apache License (2.0)']
|
5
|
+
s.summary = "Write events to Slack"
|
6
|
+
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
7
|
+
s.authors = ["Ying Li"]
|
8
|
+
s.email = 'cyli@twistedmatrix.com'
|
9
|
+
s.require_paths = ["lib"]
|
10
|
+
|
11
|
+
# Files
|
12
|
+
s.files = `git ls-files`.split($\)
|
13
|
+
|
14
|
+
# Tests
|
15
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
|
+
|
17
|
+
# Special flag to let us know this is actually a logstash plugin
|
18
|
+
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
|
19
|
+
|
20
|
+
# Gem dependencies
|
21
|
+
s.add_runtime_dependency "logstash-core", ">= 1.4.0", "< 2.0.0"
|
22
|
+
s.add_runtime_dependency "logstash-codec-plain"
|
23
|
+
s.add_runtime_dependency "rest-client"
|
24
|
+
s.add_development_dependency "logstash-devutils"
|
25
|
+
s.add_development_dependency "logstash-input-generator"
|
26
|
+
s.add_development_dependency "webmock"
|
27
|
+
|
28
|
+
# Jar dependencies
|
29
|
+
s.requirements << "jar 'org.elasticsearch:elasticsearch', '1.4.0'"
|
30
|
+
s.add_runtime_dependency "jar-dependencies", ">= 0.1.7"
|
31
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative "../spec_helper"
|
2
|
+
|
3
|
+
describe LogStash::Outputs::Slack do
|
4
|
+
|
5
|
+
let(:short_config) do <<-CONFIG
|
6
|
+
input {
|
7
|
+
generator {
|
8
|
+
message => "This message should show in slack"
|
9
|
+
count => 1
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
output {
|
14
|
+
slack {
|
15
|
+
url => "http://requestb.in/r9lkbzr9"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
CONFIG
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:long_config) do <<-CONFIG
|
22
|
+
input {
|
23
|
+
generator {
|
24
|
+
message => "This message should show in slack"
|
25
|
+
add_field => {"extra" => 3}
|
26
|
+
count => 1
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
output {
|
31
|
+
slack {
|
32
|
+
url => "http://requestb.in/r9lkbzr9"
|
33
|
+
format => "%{message} %{extra}"
|
34
|
+
channel => "mychannel"
|
35
|
+
username => "slackbot"
|
36
|
+
icon_emoji => ":chart_with_upwards_trend:"
|
37
|
+
icon_url => "http://lorempixel.com/48/48"
|
38
|
+
}
|
39
|
+
}
|
40
|
+
CONFIG
|
41
|
+
end
|
42
|
+
|
43
|
+
before do
|
44
|
+
WebMock.disable_net_connect!
|
45
|
+
end
|
46
|
+
|
47
|
+
after do
|
48
|
+
WebMock.reset!
|
49
|
+
WebMock.allow_net_connect!
|
50
|
+
end
|
51
|
+
|
52
|
+
context "passes the right payload to slack" do
|
53
|
+
it "uses all default values" do
|
54
|
+
stub_request(:post, "requestb.in").
|
55
|
+
to_return(:body => "", :status => 200,
|
56
|
+
:headers => { 'Content-Length' => 0 })
|
57
|
+
|
58
|
+
expected_json = {
|
59
|
+
:text => "This message should show in slack"
|
60
|
+
}
|
61
|
+
|
62
|
+
LogStash::Pipeline.new(short_config).run
|
63
|
+
|
64
|
+
expect(a_request(:post, "http://requestb.in/r9lkbzr9").
|
65
|
+
with(:body => "payload=#{CGI.escape(JSON.dump(expected_json))}",
|
66
|
+
:headers => {
|
67
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
68
|
+
'Accept'=> 'application/json',
|
69
|
+
'User-Agent' => 'logstash-output-slack'
|
70
|
+
})).
|
71
|
+
to have_been_made.once
|
72
|
+
end
|
73
|
+
|
74
|
+
it "uses all provided values" do
|
75
|
+
stub_request(:post, "requestb.in").
|
76
|
+
to_return(:body => "", :status => 200,
|
77
|
+
:headers => { 'Content-Length' => 0 })
|
78
|
+
|
79
|
+
expected_json = {
|
80
|
+
:text => "This message should show in slack 3",
|
81
|
+
:channel => "mychannel",
|
82
|
+
:username => "slackbot",
|
83
|
+
:icon_emoji => ":chart_with_upwards_trend:",
|
84
|
+
:icon_url => "http://lorempixel.com/48/48"
|
85
|
+
}
|
86
|
+
|
87
|
+
LogStash::Pipeline.new(long_config).run
|
88
|
+
|
89
|
+
expect(a_request(:post, "http://requestb.in/r9lkbzr9").
|
90
|
+
with(:body => "payload=#{CGI.escape(JSON.dump(expected_json))}",
|
91
|
+
:headers => {
|
92
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
93
|
+
'Accept'=> 'application/json',
|
94
|
+
'User-Agent' => 'logstash-output-slack'
|
95
|
+
})).
|
96
|
+
to have_been_made.once
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logstash-output-slack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ying Li
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: logstash-core
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.0
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.4.0
|
28
|
+
- - <
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 2.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: logstash-codec-plain
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rest-client
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
prerelease: false
|
60
|
+
type: :runtime
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: logstash-devutils
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
prerelease: false
|
74
|
+
type: :development
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: logstash-input-generator
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
prerelease: false
|
88
|
+
type: :development
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: webmock
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
prerelease: false
|
102
|
+
type: :development
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: jar-dependencies
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.1.7
|
110
|
+
requirement: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 0.1.7
|
115
|
+
prerelease: false
|
116
|
+
type: :runtime
|
117
|
+
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
118
|
+
email: cyli@twistedmatrix.com
|
119
|
+
executables: []
|
120
|
+
extensions: []
|
121
|
+
extra_rdoc_files: []
|
122
|
+
files:
|
123
|
+
- .gitignore
|
124
|
+
- .travis.yml
|
125
|
+
- Gemfile
|
126
|
+
- README.md
|
127
|
+
- Rakefile
|
128
|
+
- lib/logstash/outputs/slack.rb
|
129
|
+
- logstash-output-slack.gemspec
|
130
|
+
- spec/outputs/slack_spec.rb
|
131
|
+
- spec/spec_helper.rb
|
132
|
+
homepage:
|
133
|
+
licenses:
|
134
|
+
- MIT
|
135
|
+
- Apache License (2.0)
|
136
|
+
metadata:
|
137
|
+
logstash_plugin: 'true'
|
138
|
+
logstash_group: output
|
139
|
+
post_install_message:
|
140
|
+
rdoc_options: []
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements:
|
154
|
+
- jar 'org.elasticsearch:elasticsearch', '1.4.0'
|
155
|
+
rubyforge_project:
|
156
|
+
rubygems_version: 2.1.9
|
157
|
+
signing_key:
|
158
|
+
specification_version: 4
|
159
|
+
summary: Write events to Slack
|
160
|
+
test_files:
|
161
|
+
- spec/outputs/slack_spec.rb
|
162
|
+
- spec/spec_helper.rb
|