fluent-plugin-heroku-syslog-http 0.2.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 232b9309f8c101e5ff0845ef5a8330661d98816d3c25068914a7e2dfbdf5566a
4
+ data.tar.gz: d5f49511ab61357336c8ef9d99936781709a044994c0af8f0cf0c5e22d537623
5
+ SHA512:
6
+ metadata.gz: 14d6c03abb519a8f07fbf2ba0e0f894aee8a9b20aa7c3ab2699b6c44317feff51f54b2ce4bd20d0f5e197cdd6090c8994406cb1651bd1e9f8071c731b3197fc2
7
+ data.tar.gz: 13bf91845d3591a7df8206ab1730c5db0d4350b92678ec393f60567956788da03e127dca649a423024db467929a7f43e6d3fdd35dd46f8f30f58088dfa61e9af
@@ -0,0 +1,35 @@
1
+ aliases:
2
+ - &step_cache_restore_deps
3
+ restore_cache:
4
+ keys:
5
+ - drivy-rails-fluent-plugin-heroku-syslog-http-{{ .Branch }}-{{ .Revision }}
6
+ - drivy-rails-fluent-plugin-heroku-syslog-http-{{ .Branch }}
7
+ - drivy-rails-fluent-plugin-heroku-syslog-http-
8
+ - &step_cache_save_deps
9
+ save_cache:
10
+ key: drivy-rails-fluent-plugin-heroku-syslog-http-{{ .Branch }}-{{ .Revision }}
11
+ paths: [ vendor/bundle ]
12
+ - &step_bundler_install_deps
13
+ run: bundle install --path vendor/bundle --jobs=2 --without development:deployment
14
+
15
+ version: 2
16
+ jobs:
17
+ test:
18
+ docker:
19
+ - image: circleci/ruby:2.4
20
+ steps:
21
+ - checkout
22
+ - *step_cache_restore_deps
23
+ # Bundler install
24
+ - *step_bundler_install_deps
25
+ - run: bundle clean
26
+ - *step_cache_save_deps
27
+ # Run tests
28
+ - run: bundle exec rake
29
+
30
+ workflows:
31
+ version: 2
32
+
33
+ test-and-deploy:
34
+ jobs:
35
+ - checkout
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ test.conf
@@ -0,0 +1,17 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Metrics/AbcSize:
5
+ Enabled: false
6
+
7
+ Metrics/ClassLength:
8
+ Enabled: false
9
+
10
+ Metrics/LineLength:
11
+ Enabled: false
12
+
13
+ Metrics/MethodLength:
14
+ Enabled: false
15
+
16
+ Metrics/PerceivedComplexity:
17
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ ruby '2.4.4'
6
+
7
+ # Specify your gem's dependencies in fluent-plugin-heroku-syslog.gemspec
8
+ gemspec
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2014-2018 Kazuyuki Honda
2
+ Copyright (c) 2108- Drivy
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
@@ -0,0 +1,57 @@
1
+ # fluent-plugin-heroku-syslog-http
2
+
3
+ Plugins to accept and parse syslog input from [heroku http(s) drains](https://devcenter.heroku.com/articles/log-drains#http-s-drains), based on fluentd'd [http input](https://docs.fluentd.org/v1.0/articles/in_http) and [regexp parser](https://docs.fluentd.org/v1.0/articles/parser_regexp)
4
+
5
+ ## Installation
6
+
7
+ Install with gem or fluent-gem command as:
8
+
9
+ ```
10
+ # for fluentd
11
+ $ gem install fluent-plugin-heroku-syslog-http
12
+
13
+ # for td-agent
14
+ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-heroku-syslog-http
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ### Configure heroku_syslog_http input
20
+
21
+ ```
22
+ <source>
23
+ type heroku_syslog_http
24
+ port 9880
25
+ bind 0.0.0.0
26
+ tag heroku
27
+ drain_ids ["YOUR-HEROKU-DRAIN-ID"] # optional
28
+ </source>
29
+ ```
30
+
31
+ ### Example
32
+
33
+ Heroku's http syslog format:
34
+ `00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - foo`
35
+
36
+ Will parse the following key/values:
37
+ ```
38
+ {
39
+ 'syslog.pri' => '13',
40
+ 'syslog.facility' => 'user',
41
+ 'syslog.severity' => 'notice',
42
+ 'syslog.hostname' => 'host',
43
+ 'syslog.appname' => 'app',
44
+ 'syslog.procid' => 'web.1',
45
+ 'syslog.timestamp' => '2014-01-29T06:25:52.589365+00:00',
46
+ 'message' => 'foo'
47
+ }
48
+ ```
49
+
50
+
51
+ ## Copyright
52
+
53
+ - Copyright
54
+ - Copytight(C) 2018- Drivy
55
+ - Copyright(C) 2014-2018 Kazuyuki Honda (hakobera)
56
+ - License
57
+ - Apache License, Version 2.0
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+
5
+ require 'rake/testtask'
6
+ Rake::TestTask.new(:test) do |test|
7
+ test.libs << 'lib' << 'test'
8
+ test.pattern = 'test/**/test_*.rb'
9
+ test.verbose = true
10
+ end
11
+
12
+ task default: :test
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'fluent-plugin-heroku-syslog-http'
5
+ gem.version = '0.2.0'
6
+ gem.authors = ['Drivy', 'Kazuyuki Honda']
7
+ gem.email = ['sre@drivy.com']
8
+ gem.description = 'fluent plugin to drain heroku syslog'
9
+ gem.summary = 'fluent plugin to drain heroku syslog'
10
+ gem.homepage = 'https://github.com/drivy/fluent-plugin-heroku-syslog-http'
11
+ gem.license = 'APLv2'
12
+
13
+ gem.files = `git ls-files`.split($ORS)
14
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
15
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.require_paths = ['lib']
17
+
18
+ gem.add_runtime_dependency 'fluentd', '>= 1.0.0'
19
+ gem.add_development_dependency 'rake'
20
+ gem.add_development_dependency('test-unit', ['~> 3.1.0'])
21
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fluent/plugin/in_http'
4
+
5
+ module Fluent
6
+ module Plugin
7
+ class HerokuSyslogHttpInput < HttpInput
8
+ Fluent::Plugin.register_input('heroku_syslog_http', self)
9
+
10
+ config_section :parse do
11
+ config_set_default :@type, 'heroku_syslog_http'
12
+ end
13
+ config_param :drain_ids, :array, default: nil
14
+
15
+ private
16
+
17
+ def parse_params_with_parser(params)
18
+ content = params[EVENT_RECORD_PARAMETER]
19
+ raise "'#{EVENT_RECORD_PARAMETER}' parameter is required" unless content
20
+
21
+ records = []
22
+ messages = content.split("\n")
23
+ messages.each do |msg|
24
+ @parser.parse(msg) do |time, record|
25
+ raise "Could not parse event: #{content}" if record.nil?
26
+
27
+ record['syslog.timestamp'] ||= Time.at(time).utc.strftime('%Y-%m-%dT%H:%M:%S%z')
28
+ record['logplex.drain_id'] = params['HTTP_LOGPLEX_DRAIN_TOKEN']
29
+ record['logplex.frame_id'] = params['HTTP_LOGPLEX_FRAME_ID']
30
+ unless @drain_ids.nil? || @drain_ids.include?(record['logplex.drain_id'])
31
+ log.warn "drain_id not match: #{msg.inspect}"
32
+ next
33
+ end
34
+ records << record
35
+ end
36
+ end
37
+ [nil, records]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fluent/plugin/in_http'
4
+ require 'fluent/plugin/parser_regexp'
5
+
6
+ module Fluent
7
+ module Plugin
8
+ class HerokuSyslogHttpParser < RegexpParser
9
+ Fluent::Plugin.register_parser('heroku_syslog_http', self)
10
+
11
+ SYSLOG_HTTP_REGEXP = %r{^([0-9]+) +\<(?<syslog.pri>[0-9]+)\>([0-9]+) (?<syslog.timestamp>[^ ]+) (?<syslog.hostname>[^ ]+) (?<syslog.appname>[^ ]+) (?<syslog.procid>[^ ]+) - *(?<message>.*)$}
12
+
13
+ FACILITY_MAP = {
14
+ 0 => 'kern',
15
+ 1 => 'user',
16
+ 2 => 'mail',
17
+ 3 => 'daemon',
18
+ 4 => 'auth',
19
+ 5 => 'syslog',
20
+ 6 => 'lpr',
21
+ 7 => 'news',
22
+ 8 => 'uucp',
23
+ 9 => 'cron',
24
+ 10 => 'authpriv',
25
+ 11 => 'ftp',
26
+ 12 => 'ntp',
27
+ 13 => 'audit',
28
+ 14 => 'alert',
29
+ 15 => 'at',
30
+ 16 => 'local0',
31
+ 17 => 'local1',
32
+ 18 => 'local2',
33
+ 19 => 'local3',
34
+ 20 => 'local4',
35
+ 21 => 'local5',
36
+ 22 => 'local6',
37
+ 23 => 'local7'
38
+ }.freeze
39
+
40
+ SEVERITY_MAP = {
41
+ 0 => 'emerg',
42
+ 1 => 'alert',
43
+ 2 => 'crit',
44
+ 3 => 'err',
45
+ 4 => 'warn',
46
+ 5 => 'notice',
47
+ 6 => 'info',
48
+ 7 => 'debug'
49
+ }.freeze
50
+
51
+ config_set_default :expression, SYSLOG_HTTP_REGEXP
52
+ config_set_default :time_key, 'syslog.timestamp'
53
+ config_set_default :keep_time_key, true
54
+
55
+ def parse_prival(record)
56
+ if record && record['syslog.pri']
57
+ pri = record['syslog.pri'].to_i
58
+ record['syslog.facility'] = FACILITY_MAP[pri >> 3]
59
+ record['syslog.severity'] = SEVERITY_MAP[pri & 0b111]
60
+ end
61
+ record
62
+ end
63
+
64
+ def parse(text)
65
+ super(text) do |time, record|
66
+ yield time, parse_prival(record)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+
6
+ require 'fluent/log'
7
+ require 'fluent/test'
8
+
9
+ def unused_port
10
+ s = TCPServer.open(0)
11
+ port = s.addr[1]
12
+ s.close
13
+ port
14
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'fluent/test/driver/input'
5
+ require 'fluent/plugin/in_heroku_syslog_http'
6
+
7
+ require 'net/http'
8
+
9
+ class HerokuSyslogHttpInputTest < Test::Unit::TestCase
10
+ class << self
11
+ def startup
12
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
13
+ @server = ServerEngine::SocketManager::Server.open(socket_manager_path)
14
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
15
+ end
16
+
17
+ def shutdown
18
+ @server.close
19
+ end
20
+ end
21
+
22
+ def setup
23
+ Fluent::Test.setup
24
+ end
25
+
26
+ PORT = unused_port
27
+ CONFIG = %(
28
+ @type heroku_syslog_http
29
+ port #{PORT}
30
+ bind 127.0.0.1
31
+ body_size_limit 10m
32
+ keepalive_timeout 5
33
+ )
34
+
35
+ def create_driver(conf = CONFIG)
36
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::HerokuSyslogHttpInput).configure(conf)
37
+ end
38
+
39
+ def test_configure
40
+ d = create_driver
41
+ assert_equal PORT, d.instance.port
42
+ assert_equal '127.0.0.1', d.instance.bind
43
+ assert_equal 10 * 1024 * 1024, d.instance.body_size_limit
44
+ assert_equal 5, d.instance.keepalive_timeout
45
+ end
46
+
47
+ def test_time_format
48
+ messages = [
49
+ '59 <13>1 2014-01-29T06:25:52.589365+00:00 host app web.1 - foo',
50
+ '59 <13>1 2014-01-30T07:35:00.123456+09:00 host app web.1 - bar'
51
+ ]
52
+ event_times = [
53
+ Time.strptime('2014-01-29T06:25:52+00:00', '%Y-%m-%dT%H:%M:%S%z').to_i,
54
+ Time.strptime('2014-01-30T07:35:00+09:00', '%Y-%m-%dT%H:%M:%S%z').to_i
55
+ ]
56
+
57
+ d = create_driver
58
+ d.run(expect_records: 2, timeout: 5) do
59
+ res = post(messages)
60
+ assert_equal '', res.body
61
+ assert_equal '200', res.code
62
+ end
63
+
64
+ assert_equal event_times[0], d.events[0][1]
65
+ assert_equal event_times[1], d.events[1][1]
66
+ end
67
+
68
+ def test_msg_size
69
+ messages = [
70
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - ' + 'x' * 100,
71
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - ' + 'x' * 1024
72
+ ]
73
+
74
+ d = create_driver
75
+ d.run(expect_records: 2, timeout: 5) do
76
+ res = post(messages)
77
+ assert_equal '200', res.code
78
+ end
79
+
80
+ assert_equal 'x' * 100, d.events[0][2]['message']
81
+ assert_equal 'x' * 1024, d.events[1][2]['message']
82
+ end
83
+
84
+ def test_accept_matched_drain_id_multiple
85
+ messages = [
86
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - foo',
87
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - bar'
88
+ ]
89
+ d = create_driver(CONFIG + %(
90
+ drain_ids ["abc", "d.fc6b856b-3332-4546-93de-7d0ee272c3bd"]
91
+ ))
92
+ d.run(expect_records: 2, timeout: 5) do
93
+ res = post(messages)
94
+ assert_equal '200', res.code
95
+ end
96
+
97
+ assert_equal 2, d.events.length
98
+ end
99
+
100
+ def test_ignore_unmatched_drain_id
101
+ messages = [
102
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - foo',
103
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - bar'
104
+ ]
105
+ d = create_driver(CONFIG + %(
106
+ drain_ids ["abc"]
107
+ ))
108
+ d.run(expect_records: 0, timeout: 5) do
109
+ res = post(messages)
110
+ assert_equal '200', res.code
111
+ end
112
+
113
+ assert_equal 0, d.events.length
114
+ end
115
+
116
+ def test_logplex_metas
117
+ messages = [
118
+ '00 <13>1 2014-01-01T01:23:45.123456+00:00 host app web.1 - ' + 'x' * 100
119
+ ]
120
+ d = create_driver
121
+ d.run(expect_records: 1, timeout: 5) do
122
+ res = post(messages)
123
+ assert_equal '200', res.code
124
+ end
125
+
126
+ assert_equal '09C557EAFCFB6CF2740EE62F62971098', d.events[0][2]['logplex.frame_id']
127
+ assert_equal 'd.fc6b856b-3332-4546-93de-7d0ee272c3bd', d.events[0][2]['logplex.drain_id']
128
+ end
129
+
130
+ def post(messages)
131
+ # https://github.com/heroku/logplex/blob/master/doc/README.http_drains.md
132
+ http = Net::HTTP.new('127.0.0.1', PORT)
133
+ headers = {
134
+ 'Content-Type' => 'application/logplex-1',
135
+ 'Logplex-Msg-Count' => messages.length.to_s,
136
+ 'Logplex-Frame-Id' => '09C557EAFCFB6CF2740EE62F62971098',
137
+ 'Logplex-Drain-Token' => 'd.fc6b856b-3332-4546-93de-7d0ee272c3bd',
138
+ 'User-Agent' => 'Logplex/v49'
139
+ }
140
+ req = Net::HTTP::Post.new('/heroku', headers)
141
+ req.body = messages.join("\n")
142
+ http.request(req)
143
+ end
144
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'fluent/test/driver/parser'
5
+ require 'fluent/plugin/in_heroku_syslog_http'
6
+
7
+ require 'net/http'
8
+
9
+ # Stolen from fluentd/test/helper.rb
10
+ class Hash
11
+ def corresponding_proxies
12
+ @corresponding_proxies ||= []
13
+ end
14
+
15
+ def to_masked_element
16
+ self
17
+ end
18
+ end
19
+
20
+ class HerokuSyslogHttpParseTest < Test::Unit::TestCase
21
+ def setup
22
+ Fluent::Test.setup
23
+ end
24
+
25
+ def create_driver(conf = {})
26
+ d = Struct.new(:instance).new
27
+ d.instance = Fluent::Plugin::HerokuSyslogHttpParser.new
28
+ d.instance.configure(conf)
29
+ d
30
+ end
31
+
32
+ def test_parsing_with_default_conf
33
+ text = '59 <13>1 2014-01-29T06:25:52.589365+00:00 host app web.1 - foo'
34
+ expected_time = Time.strptime('2014-01-29T07:25:52+01:00', '%Y-%m-%dT%H:%M:%S%z').to_i
35
+ event = {
36
+ 'syslog.pri' => '13',
37
+ 'syslog.facility' => 'user',
38
+ 'syslog.severity' => 'notice',
39
+ 'syslog.hostname' => 'host',
40
+ 'syslog.appname' => 'app',
41
+ 'syslog.procid' => 'web.1',
42
+ 'syslog.timestamp' => '2014-01-29T06:25:52.589365+00:00',
43
+ 'message' => 'foo'
44
+ }
45
+ d = create_driver
46
+ d.instance.parse(text) do |time, record|
47
+ assert_equal expected_time, time
48
+ assert_equal event, record
49
+ end
50
+ end
51
+
52
+ def test_parsing_pri_conf
53
+ d = create_driver
54
+
55
+ d.instance.parse('00 <13>1 2014-01-29T06:25:52.589365+00:00 host app web.1 - foo') do |_, record|
56
+ assert_equal 'notice', record['syslog.severity']
57
+ assert_equal 'user', record['syslog.facility']
58
+ end
59
+ d.instance.parse('00 <42>1 2014-01-29T06:25:52.589365+00:00 host app web.1 - foo') do |_, record|
60
+ assert_equal 'crit', record['syslog.severity']
61
+ assert_equal 'syslog', record['syslog.facility']
62
+ end
63
+ d.instance.parse('00 <27>1 2014-01-29T06:25:52.589365+00:00 host app web.1 - foo') do |_, record|
64
+ assert_equal 'err', record['syslog.severity']
65
+ assert_equal 'daemon', record['syslog.facility']
66
+ end
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-heroku-syslog-http
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Drivy
8
+ - Kazuyuki Honda
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-10-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fluentd
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 1.0.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 1.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: test-unit
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 3.1.0
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 3.1.0
56
+ description: fluent plugin to drain heroku syslog
57
+ email:
58
+ - sre@drivy.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".circleci/config.yml"
64
+ - ".gitignore"
65
+ - ".rubocop.yml"
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - fluent-plugin-heroku-syslog.gemspec
71
+ - lib/fluent/plugin/in_heroku_syslog_http.rb
72
+ - lib/fluent/plugin/parser_heroku_syslog_http.rb
73
+ - test/helper.rb
74
+ - test/plugin/test_in_heroku_syslog_http.rb
75
+ - test/plugin/test_parser_heroku_syslog_http.rb
76
+ homepage: https://github.com/drivy/fluent-plugin-heroku-syslog-http
77
+ licenses:
78
+ - APLv2
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.7.7
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: fluent plugin to drain heroku syslog
100
+ test_files:
101
+ - test/helper.rb
102
+ - test/plugin/test_in_heroku_syslog_http.rb
103
+ - test/plugin/test_parser_heroku_syslog_http.rb