fluent-plugin-raven-decoder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b3a27637c392eb17de4b7f30b0ab7a9f20151b34
4
+ data.tar.gz: 0363471b9aa0f7c262a8aeea4772523df47ee60c
5
+ SHA512:
6
+ metadata.gz: 68c846feb8d35fa31bbbba96e854c64afe0004882736fd3ab1311964135442939df6972d2fe379448030d2bef1785ed96a2a32645d9c2f2ab699c0bbc6a3de2a
7
+ data.tar.gz: f8001f3a254dcbc1c30fbeac20f18653ab9dcf421f961fb0f1993f1102e3db9a56af10df798fcf544c414a0a76dfee6a0c1451afcc771928265ad3036eba196b
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ script:
5
+ - bundle install
6
+ - bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-raven-decoder.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Genki Sugawara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Fluent::Plugin::Raven::Decoder
2
+
3
+ Fluentd plugin to decode Raven data.
4
+
5
+ [Raven](https://github.com/getsentry/raven-ruby) is a client for [Sentry](https://getsentry.com/welcome/).
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-raven-decoder.svg)](http://badge.fury.io/rb/fluent-plugin-raven-decoder)
8
+ [![Build Status](https://travis-ci.org/winebarrel/fluent-plugin-raven-decoder.svg?branch=master)](https://travis-ci.org/winebarrel/fluent-plugin-raven-decoder)
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'fluent-plugin-raven-decoder'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install fluent-plugin-raven-decoder
25
+
26
+ ## Configuration
27
+
28
+ ```
29
+ <match raven.error>
30
+ type raven_decoder
31
+ prefix decoded
32
+ #data_field data
33
+ #ignore_fields ["modules", "exception"]
34
+ </match>
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ ```sh
40
+ # Raven data
41
+ # see https://github.com/cookpad/raven-transports-fluentd
42
+ DATA='{"auth_header":"Sentry sentry_version=5, ..." "data":"eJz...="}'
43
+ echo $DATA | fluent-cat raven.error
44
+ # decoded to: {"event_id":"747...","message":"ZeroDivisionError: divided by 0",...
45
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ Gem::Specification.new do |spec|
3
+ spec.name = 'fluent-plugin-raven-decoder'
4
+ spec.version = '0.1.0'
5
+ spec.authors = ['Genki Sugawara']
6
+ spec.email = ['sgwr_dts@yahoo.co.jp']
7
+ spec.summary = %q{Fluentd plugin to decode Raven data.}
8
+ spec.description = %q{Fluentd plugin to decode Raven data.}
9
+ spec.homepage = 'https://github.com/winebarrel/fluent-plugin-raven-decoder'
10
+ spec.license = 'MIT'
11
+
12
+ spec.files = `git ls-files -z`.split("\x0")
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ['lib']
16
+
17
+ spec.add_dependency 'fluentd'
18
+ spec.add_dependency 'multi_json'
19
+ spec.add_development_dependency 'bundler'
20
+ spec.add_development_dependency 'rake'
21
+ spec.add_development_dependency 'rspec', '>= 3.0.0'
22
+ end
@@ -0,0 +1,66 @@
1
+ class Fluent::RavenDecoderOutput < Fluent::Output
2
+ Fluent::Plugin.register_output('raven_decoder', self)
3
+
4
+ unless method_defined?(:log)
5
+ define_method('log') { $log }
6
+ end
7
+
8
+ unless method_defined?(:router)
9
+ define_method('router') { Fluent::Engine }
10
+ end
11
+
12
+ config_param :data_field, :string, :default => 'data'
13
+ config_param :ignore_fields, :array, :default => ['modules', 'exception']
14
+ config_param :prefix, :string
15
+
16
+ def initialize
17
+ super
18
+ require 'base64'
19
+ require 'zlib'
20
+ require 'multi_json'
21
+ end
22
+
23
+ def start
24
+ super
25
+ end
26
+
27
+ def shutdown
28
+ super
29
+ end
30
+
31
+ def configure(conf)
32
+ super
33
+ end
34
+
35
+ def emit(tag, es, chain)
36
+ es.each do |time, record|
37
+ data = record[@data_field]
38
+
39
+ if data
40
+ data = decode(data)
41
+ tag = @prefix + '.' + tag
42
+ router.emit(tag, time, data)
43
+ else
44
+ log.warn("Eaven data is not included: tag:#{tag} record:#{record.inspect}")
45
+ end
46
+ end
47
+
48
+ chain.next
49
+ rescue => e
50
+ log.error(e.message + "\n" + e.backtrace.first)
51
+ end
52
+
53
+ private
54
+
55
+ def decode(data)
56
+ data = Base64.strict_decode64(data)
57
+ data = Zlib::Inflate.inflate(data)
58
+ data = MultiJson.load(data)
59
+
60
+ @ignore_fields.each do |field|
61
+ data.delete(field)
62
+ end
63
+
64
+ data
65
+ end
66
+ end
@@ -0,0 +1,67 @@
1
+ describe Fluent::RavenDecoderOutput do
2
+ let(:time) { Time.parse('2014-02-08 13:14:15 +0900').to_i }
3
+
4
+ let(:raven_error) do
5
+ {
6
+ "auth_header" => "Sentry sentry_version=5, sentry_client=raven-ruby/0.13.3, sentry_timestamp=1432136088, sentry_key=SENTRY_PUBLIC_KEY, sentry_secret=SENTRY_SECRET_KEY",
7
+ "data" => "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",
8
+ "options" => {
9
+ "content_type" => "application/octet-stream"
10
+ },
11
+ "project_id" => "2"
12
+ }
13
+ end
14
+
15
+ let(:decoded_data) do
16
+ {"event_id"=>"9864144b43dd38dfc84b230674170172",
17
+ "message"=>"ZeroDivisionError: divided by 0",
18
+ "timestamp"=>"2015-05-20T15:34:48",
19
+ "time_spent"=>nil,
20
+ "level"=>40,
21
+ "project"=>nil,
22
+ "logger"=>"root",
23
+ "platform"=>"ruby",
24
+ "culprit"=>"app/controllers/items_controller.rb in / at line 8",
25
+ "server_name"=>"sugawaragenki-no-macbook-air.local",
26
+ "extra"=>{},
27
+ "tags"=>{},
28
+ "user"=>{},
29
+ "request"=>
30
+ {"headers"=>
31
+ {"Host"=>"localhost:3000",
32
+ "Connection"=>"keep-alive",
33
+ "Cache-Control"=>"max-age=0",
34
+ "Accept"=>
35
+ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
36
+ "User-Agent"=>
37
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36",
38
+ "Accept-Encoding"=>"gzip, deflate, sdch",
39
+ "Accept-Language"=>"ja,en-US;q=0.8,en;q=0.6",
40
+ "Cookie"=>
41
+ "_ga=GA1.1.727075564.1421045825; _app_session=b0tYeWJSay9aRnU1bjh4UzAyK3Q2ZEZoZVE0Snd3VVlLOSswaUtLVktQa1NDTFpmdUJXZVFIb1pFZng0ZlRUUDdlaDVnTjg2VnBjTUppYUE2anFiRGhteHAvNTNFRUZDbE1OT1FhdUtVSjJrOGlNbEN2UndCWllEdE84V2hEM0xhNGdFSXFBbDRTekpGaHVhelpWUG9BPT0tLTBGb01lWVk0UzhCWWozNEw0QS9wTmc9PQ%3D%3D--819b6cd4aa80d78ad1ddde9f0be07e52fc070c2c",
42
+ "Version"=>"HTTP/1.1"},
43
+ "env"=>
44
+ {"REMOTE_ADDR"=>"::1",
45
+ "SERVER_NAME"=>"localhost",
46
+ "SERVER_PORT"=>"3000"},
47
+ "cookies"=>nil,
48
+ "url"=>"http://localhost:3000/items",
49
+ "method"=>"GET",
50
+ "query_string"=>"",
51
+ "data"=>""}}
52
+ end
53
+
54
+ it do
55
+ run_driver do |d|
56
+ (1..3).each do |i|
57
+ d.emit(raven_error, time + i)
58
+ end
59
+
60
+ expect(d.emits).to eq [
61
+ ["decoded.raven.error", 1391832856, decoded_data],
62
+ ["decoded.raven.error", 1391832857, decoded_data],
63
+ ["decoded.raven.error", 1391832858, decoded_data],
64
+ ]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,28 @@
1
+ require 'fluent/test'
2
+ require 'fluent/plugin/out_raven_decoder'
3
+
4
+ # Disable Test::Unit
5
+ module Test::Unit::RunCount; def run(*); end; end
6
+
7
+ RSpec.configure do |config|
8
+ config.before(:all) do
9
+ Fluent::Test.setup
10
+ end
11
+ end
12
+
13
+ def run_driver(options = {})
14
+ prefix = options[:prefix] || 'decoded'
15
+ tag = options[:tag] || 'raven.error'
16
+
17
+ fluentd_conf = <<-EOS
18
+ type raven_decoder
19
+ prefix #{prefix}
20
+ EOS
21
+
22
+ tag = options[:tag] || 'raven.error'
23
+ driver = Fluent::Test::OutputTestDriver.new(Fluent::RavenDecoderOutput, tag).configure(fluentd_conf)
24
+
25
+ driver.run do
26
+ yield(driver)
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-raven-decoder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Genki Sugawara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ description: Fluentd plugin to decode Raven data.
84
+ email:
85
+ - sgwr_dts@yahoo.co.jp
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - .rspec
92
+ - .travis.yml
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - fluent-plugin-raven-decoder.gemspec
98
+ - lib/fluent/plugin/out_raven_decoder.rb
99
+ - spec/out_raven_decoder_spec.rb
100
+ - spec/spec_helper.rb
101
+ homepage: https://github.com/winebarrel/fluent-plugin-raven-decoder
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.0.14
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: Fluentd plugin to decode Raven data.
125
+ test_files:
126
+ - spec/out_raven_decoder_spec.rb
127
+ - spec/spec_helper.rb