fluent-plugin-mattermost 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 137190fc7cefe9e27caccfe3ae5367ea51bd8cd8121d5bd24b5b9df9c212a4b9
4
+ data.tar.gz: 9fdee0c49ee52085529a35f427e1ac22cd285ec441f9146565b2ddc7facb405e
5
+ SHA512:
6
+ metadata.gz: 462bcc71f9d39527e2e9ee6ad69987feb5fc7e49b8a4b10bee5c7cfca39be373e1b6790e17dfc0b611e88790e2a467f5724ac7cb3a4e891f2d2c715e6e780788
7
+ data.tar.gz: cdcff519b3dbcdfe50db16e2e46b5b8b372663eb0c540a386e883e85dbf00bc08e852b8a8be1a2a51c9a3ed7f2ae1f5c49b4616d02b5d6c206ef0bf9d12ad1d1
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # fluent-plugin-mattermost
2
+
3
+ [Fluentd](https://fluentd.org/) output plugin to send message to Mattermost.
4
+
5
+ With this plugin you can send messages directly to a channel in Mattermost (for example in case of errors).
6
+
7
+ # Installation requirement
8
+
9
+ For the plugin to work properly, you need to have the following gems installed
10
+ - fluent-logger
11
+ ```
12
+ $ gem install fluent-logger
13
+ ```
14
+
15
+ # Installation
16
+
17
+ [Installation](documentation/installation.md)
18
+ [Docker-installation](documentation/docker-installation.md)
19
+
20
+ # Usage (Incoming Webhook)
21
+ Link for
22
+ [Mattermost incoming webhook](https://docs.mattermost.com/developer/webhooks-incoming.html)
23
+
24
+ ```apache
25
+ <match mattermost>
26
+ @type mattermost
27
+ webhook_url https://xxx.xx/hooks/xxxxxxxxxxxxxxx
28
+ channel_id xxxxxxxxxxxxxxx
29
+ message_color "#FFA500"
30
+ message_title mattermost
31
+ message %s
32
+ enable_tls true
33
+ </match>
34
+ ```
35
+
36
+ ### Parameter
37
+
38
+ |parameter|description|type|dafault|
39
+ |---|---|---|---|
40
+ |webhook_url|Incoming Webhook URI (Required for Incoming Webhook mode). See https://docs.mattermost.com/developer/webhooks-incoming.html|string|nil|
41
+ |channel_id|the id of the channel where you want to receive the information|string|nil|
42
+ |message_color|color of the message you are sending, the format is hex code|string|#A9A9A9|
43
+ |message_title|title you want to add to the message|string|fluent_title_default
44
+ |message|The message you want to send, can be a static message, which you add at this point, or you can receive the fluent infos with the %s|string|nil
45
+ |enable_tls|you can set the communication channel if it uses tls|bool|true|
46
+
47
+ ## Copyright
48
+
49
+ * Copyright(c) 2021- [levigo gruppe](https://www.levigo.de/)
50
+ * License
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs.push("lib", "test")
8
+ t.test_files = FileList["test/**/test_*.rb"]
9
+ t.verbose = true
10
+ t.warning = true
11
+ end
12
+
13
+ task default: [:test]
@@ -0,0 +1,14 @@
1
+ # Docker installation
2
+
3
+ ### Dockerfile
4
+
5
+ You need to enter the repository where you can download and later install the plugin. Here is a snippet code
6
+ **Attention:** If you use gitlab, don't forget to enter the token for oauth2
7
+
8
+ ```docker
9
+ ...
10
+
11
+ RUN gem install fluent-plugin-mattermost
12
+
13
+ ...
14
+ ```
@@ -0,0 +1,18 @@
1
+ # Installation
2
+
3
+ To install the plugin you need to download the package directly from Gitlab and run the installation.
4
+ Link to repository:
5
+
6
+ [fluent-plugin-mattermost](https://gitlab.levigo.systems/codefactory/fluent-plugin-mattermost)
7
+
8
+ ```
9
+ $ gem install bundler
10
+ ```
11
+ ```
12
+ $ rake build
13
+ ```
14
+ ```
15
+ $ gem install --local ./pkg/fluent-plugin-mattermost-0.1.0.gem
16
+ ```
17
+
18
+ The installation is completed
@@ -0,0 +1,27 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "fluent-plugin-mattermost"
6
+ spec.version = "0.1.0"
7
+ spec.authors = ["Pierluigi Minardi"]
8
+ spec.email = ["p.minardi@levigo.de"]
9
+
10
+ spec.summary = "fluent-plugin-mattemost"
11
+ spec.description = "This plugin allows you to send messages to mattermost in case of errors"
12
+ spec.homepage = "https://www.levigo.de"
13
+ spec.license = "Apache-2.0"
14
+
15
+ test_files, files = `git ls-files -z`.split("\x0").partition do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.files = files
19
+ spec.executables = files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = test_files
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 2.2.31"
24
+ spec.add_development_dependency "rake", "~> 13.0.6"
25
+ spec.add_development_dependency "test-unit", "~> 3.3.9"
26
+ spec.add_runtime_dependency "fluentd", [">= 0.14.10", "< 2"]
27
+ end
@@ -0,0 +1,109 @@
1
+ require "fluent/plugin/output"
2
+ require 'fluent-logger'
3
+ require 'uri'
4
+ require 'net/http'
5
+ require 'net/https'
6
+ require 'logger'
7
+ require "json"
8
+
9
+ module Fluent
10
+ module Plugin
11
+ class MattermostOutput < Fluent::Plugin::Output
12
+ Fluent::Plugin.register_output("mattermost", self)
13
+
14
+ # Required parameter: The configuration must have this parameter like 'param1 10'.
15
+ config_param :webhook_url, :string, default: nil
16
+
17
+ config_param :channel_id, :string, default: nil
18
+
19
+ config_param :message_title, :string, default: "fluent_title_default"
20
+
21
+ config_param :message_color, :string, default: "#A9A9A9"
22
+
23
+ config_param :message, :string, default: nil
24
+
25
+ config_param :enable_tls, :bool, default: true
26
+
27
+ def configure(conf)
28
+ super
29
+ end
30
+
31
+ def start
32
+ super
33
+ check_config_params
34
+ end
35
+
36
+ def write(chunk)
37
+ begin
38
+ message = get_infos(chunk)
39
+
40
+ post(message)
41
+ rescue Timeout::Error => e
42
+ log.warn "out_mattermost:", :error => e.to_s, :error_class => e.class.to_s
43
+ raise e # let Fluentd retry
44
+ rescue => e
45
+ log.error "out_mattermost:", :error => e.to_s, :error_class => e.class.to_s
46
+ log.warn_backtrace e.backtrace
47
+ end
48
+ end
49
+
50
+ def post(payload)
51
+
52
+ url = URI(@webhook_url)
53
+
54
+ https = Net::HTTP.new(url.host, url.port)
55
+ https.use_ssl = @enable_tls
56
+
57
+ request = Net::HTTP::Post.new(url)
58
+ request["Content-Type"] = "application/json"
59
+ request.body = JSON.dump({
60
+ "channel_id": @channel_id,
61
+ "attachments": message(payload)
62
+ })
63
+ response = https.request(request)
64
+
65
+ if response.read_body != "ok"
66
+ log.error "response from mattermost: ", response.read_body
67
+ else
68
+ puts response.read_body
69
+ end
70
+ end
71
+
72
+ def message(record)
73
+ payload = [{
74
+ "author_name": "Fluentd",
75
+ "thumb_url": "https://coralogix.com/wp-content/uploads/2020/04/fluentd-guide-700x430.png",
76
+ "color": @message_color,
77
+ "fields": [
78
+ {
79
+ "short": false,
80
+ "title": @message_title,
81
+ "value": record
82
+ }]
83
+ }]
84
+ return payload
85
+ end
86
+
87
+ def get_infos(chunk)
88
+ messages = []
89
+ messages << "\n"
90
+ chunk.msgpack_each do |time, record|
91
+ messages << "#{build_message(record)}\n"
92
+ end
93
+
94
+ return messages
95
+ end
96
+
97
+ def build_message(record)
98
+ @message % record.to_json
99
+ end
100
+
101
+ def check_config_params()
102
+ if @webhook_url.nil? || @channel_id.nil? || @message.nil?
103
+ raise "Check in your Mattermost config, that all parameters in the configuration file are filled"
104
+ abort
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift(File.expand_path("../../", __FILE__))
2
+ require "test-unit"
3
+ require "fluent/test"
4
+ require "fluent/test/driver/output"
5
+ require "fluent/test/helpers"
6
+
7
+ Test::Unit::TestCase.include(Fluent::Test::Helpers)
8
+ Test::Unit::TestCase.extend(Fluent::Test::Helpers)
@@ -0,0 +1,18 @@
1
+ require "helper"
2
+ require "fluent/plugin/out_mattermost.rb"
3
+
4
+ class MattermostOutputTest < Test::Unit::TestCase
5
+ setup do
6
+ Fluent::Test.setup
7
+ end
8
+
9
+ test "failure" do
10
+ flunk
11
+ end
12
+
13
+ private
14
+
15
+ def create_driver(conf)
16
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::MattermostOutput).configure(conf)
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-mattermost
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pierluigi Minardi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-11-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.2.31
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.31
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 13.0.6
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 13.0.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.3.9
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.3.9
55
+ - !ruby/object:Gem::Dependency
56
+ name: fluentd
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.10
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '2'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 0.14.10
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '2'
75
+ description: This plugin allows you to send messages to mattermost in case of errors
76
+ email:
77
+ - p.minardi@levigo.de
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - ".gitignore"
83
+ - Gemfile
84
+ - README.md
85
+ - Rakefile
86
+ - documentation/docker-installation.md
87
+ - documentation/installation.md
88
+ - fluent-plugin-mattermost.gemspec
89
+ - lib/fluent/plugin/out_mattermost.rb
90
+ - test/helper.rb
91
+ - test/plugin/test_out_mattermost.rb
92
+ homepage: https://www.levigo.de
93
+ licenses:
94
+ - Apache-2.0
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubygems_version: 3.2.22
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: fluent-plugin-mattemost
115
+ test_files:
116
+ - test/helper.rb
117
+ - test/plugin/test_out_mattermost.rb