fluent-plugin-sentry 0.0.1 → 0.0.2

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: 8bfaae537c17396c389b8ccd323104190294ccd6
4
+ data.tar.gz: d68fd5b98458bded9adf0f69733409ec78dffda3
5
+ SHA512:
6
+ metadata.gz: 29e7dd065b655557f1e311881c2d2b937b69bf5dbad4e26948e6f137a250d4217134e8a07e6caffdfa8202ebfefc59bc0a2a4372a5c26c5de4f90fbfd47431fc
7
+ data.tar.gz: 6278d264c328045eed79c1037b6100d142888789cad79c78e6b983f238400dad2f7156f95900fa2d85ac37f4f1e8ebfad47c6409e9c1d0c451595e4d5a5c9a75
data/.travis.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.1.0
4
+ - 2.2.0
5
+ - 2.1
5
6
  - 2.0.0
6
7
  - 1.9.3
7
8
 
data/README.md CHANGED
@@ -2,25 +2,30 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- Fluentd output plugin to send aggregated errors/exception events to Sentry which are a realtime event logging and aggregation platform.<br>
5
+ fluent-plugin-sentry is a fluentd output plugin that sends aggregated errors/exception events to Sentry. Sentry is a event logging and aggregation platform.<br>
6
6
 
7
- If you have sent events to Sentry directory from front webpage without aggregation, you may got down response time and performance problem (e.g. PHP).<br>
8
- To use Sentry and Fluentd together, it will got best perfomance because Fluentd acts messege queue for Sentry.
7
+ Sentry alone does not buffer incoming requests, so if your Sentry instance is under load, Sentry can respond with a 503 Service Unavailable.<br>
8
+
9
+ fluent-plugin-sentry extends fluent buffered output and enables a fluend user to buffer and flush messages to Sentry with reliable delivery.
9
10
 
10
11
  * [Sentry Official web](https://getsentry.com/welcome/)
11
12
  * [Sentry Documents](http://sentry.readthedocs.org/en/latest/) [Screenshots](https://github.com/getsentry/sentry#screenshots)
12
13
 
14
+ > ![http://blog.getsentry.com/images/hero.png](https://cloud.githubusercontent.com/assets/1734549/5498750/2b471a6c-8767-11e4-8634-961c99e635ed.png)
15
+ (quoted from http://blog.getsentry.com/)
16
+
17
+
13
18
  ## Installation
14
19
 
15
- install with gem or fluent-gem command as:
20
+ install with `gem` or `fluent-gem` command as:
16
21
 
17
- `````
18
- ### native gem
19
- gem install fluent-plugin-sentry
22
+ ```bash
23
+ # for fluentd
24
+ $ gem install fluent-plugin-sentry
20
25
 
21
- ### td-agent gem
22
- /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-sentry
23
- `````
26
+ # for td-agent
27
+ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-sentry
28
+ ```
24
29
 
25
30
  ## Preparation
26
31
 
@@ -43,9 +48,10 @@ OR
43
48
  type sentry
44
49
 
45
50
  # Set endpoint API URL
46
- endpoint_url https://${api_key}:${api_password}@app.getsentry.com/${project_id}
51
+ endpoint_url https://API_KEY:API_PASSWORD@app.getsentry.com/PROJECT_ID
47
52
 
48
53
  # Set default events value of 'server_name'
54
+ # To set short hostname, set like below.
49
55
  hostname_command hostname -s
50
56
 
51
57
  # rewrite shown tag name for Sentry dashboard
@@ -65,6 +71,7 @@ Set endpoint API URL which shows at Sentry dashboard. (it is not sentry account
65
71
  [default] flunetd
66
72
 
67
73
  * hostname_command<br>
74
+ [default] hostname
68
75
  Set default frontend value of 'server_name'
69
76
 
70
77
  * flush_interval<br>
@@ -4,12 +4,12 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-sentry"
7
- spec.version = "0.0.1"
7
+ spec.version = "0.0.2"
8
8
  spec.authors = ["Kentaro Yoshida"]
9
9
  spec.email = ["y.ken.studio@gmail.com"]
10
- spec.summary = %q{Fluentd output plugin to send aggregated errors/exception events to sentry which are a realtime event logging and aggregation platform.}
10
+ spec.summary = %q{Fluentd output plugin that sends aggregated errors/exception events to Sentry. Sentry is a event logging and aggregation platform.}
11
11
  spec.homepage = "https://github.com/y-ken/fluent-plugin-sentry"
12
- spec.license = "Apache License, Version 2.0"
12
+ spec.license = "Apache-2.0"
13
13
 
14
14
  spec.files = `git ls-files`.split($/)
15
15
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -19,6 +19,10 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "bundler"
20
20
  spec.add_development_dependency "rake"
21
21
  spec.add_development_dependency "webmock"
22
+ if defined?(RUBY_VERSION) && RUBY_VERSION > '2.2'
23
+ spec.add_development_dependency "test-unit", '~> 3'
24
+ end
25
+
22
26
  spec.add_runtime_dependency "fluentd"
23
- spec.add_runtime_dependency "sentry-raven"
27
+ spec.add_runtime_dependency "sentry-raven", "~> 0.15.0"
24
28
  end
@@ -4,7 +4,7 @@ class Fluent::SentryOutput < Fluent::BufferedOutput
4
4
  include Fluent::HandleTagNameMixin
5
5
 
6
6
  LOG_LEVEL = %w(fatal error warning info debug)
7
- EVENT_KEYS = %w(logger level tags modules message)
7
+ EVENT_KEYS = %w(message timestamp time_spent level logger culprit server_name release tags)
8
8
  DEFAULT_HOSTNAME_COMMAND = 'hostname'
9
9
 
10
10
  config_param :default_level, :string, :default => 'error'
@@ -32,11 +32,11 @@ class Fluent::SentryOutput < Fluent::BufferedOutput
32
32
  end
33
33
 
34
34
  hostname_command = @hostname_command || DEFAULT_HOSTNAME_COMMAND
35
- hostname = `#{hostname_command}`.chomp
35
+ @hostname = `#{hostname_command}`.chomp
36
36
 
37
37
  @configuration = Raven::Configuration.new
38
38
  @configuration.server = @endpoint_url
39
- @configuration.server_name = hostname
39
+ @configuration.server_name = @hostname
40
40
  @client = Raven::Client.new(@configuration)
41
41
  end
42
42
 
@@ -68,14 +68,15 @@ class Fluent::SentryOutput < Fluent::BufferedOutput
68
68
  :context => Raven::Context.new,
69
69
  :message => record['message']
70
70
  )
71
- event.timestamp = Time.at(time).utc.strftime('%Y-%m-%dT%H:%M:%S')
72
- event.logger = record['logger'] || @default_logger
71
+ event.timestamp = record['timestamp'] || Time.at(time).utc.strftime('%Y-%m-%dT%H:%M:%S')
72
+ event.time_spent = record['time_spent'] || nil
73
73
  event.level = record['level'] || @default_level
74
- event.tags = record['tags'] || { :tag => tag }
74
+ event.logger = record['logger'] || @default_logger
75
+ event.culprit = record['culprit'] || nil
76
+ event.server_name = record['server_name'] || @hostname
77
+ event.release = record['release'] if record['release']
78
+ event.tags = event.tags.merge({ :tag => tag }.merge(record['tags'] || {}))
75
79
  event.extra = record.reject{ |key| EVENT_KEYS.include?(key) }
76
- event.modules = record['modules'] || nil
77
- event.platform = record['platform'] if record['platform']
78
- event.server_name = record['server_name'] if record['server_name']
79
- @client.send(event)
80
+ @client.send_event(event)
80
81
  end
81
82
  end
@@ -20,11 +20,20 @@ class SentryOutputTest < Test::Unit::TestCase
20
20
  Fluent::Test::OutputTestDriver.new(Fluent::SentryOutput, tag).configure(conf)
21
21
  end
22
22
 
23
- def stub_endpoint(url="https://app.getsentry.com/api/12345/store/")
23
+ def stub_post(url="https://app.getsentry.com/api/12345/store/")
24
24
  parser = Yajl::Parser.new
25
25
  stub_request(:post, url).with do |req|
26
26
  @content_type = req.headers["Content-Type"]
27
- @body = parser.parse(req.body)
27
+ message = Zlib::Inflate.inflate(Base64.decode64(req.body))
28
+ @body = parser.parse(message)
29
+ end
30
+ end
31
+
32
+ def stub_response(url="https://app.getsentry.com/api/12345/store/")
33
+ stub_request(:post, url).with do |req|
34
+ @content_type = req.headers["Content-Type"]
35
+ message = Zlib::Inflate.inflate(Base64.decode64(req.body))
36
+ @body = {"eventID"=>"fe0263d6f55d014cade15a8681ae58ed", "tags"=>[["tag", "app1_error"], ["cool", "bar"], ["level", "warning"], ["logger", "zaphod"], ["server_name", "bc40a4be7b2d"], ["sentry:release", "wingnut"]], "nextEventID"=>nil, "dateCreated"=>"2015-10-30T08:25:48Z", "timeSpent"=>13, "user"=>nil, "entries"=>[], "previousEventID"=>nil, "message"=>"error has occoured.", "packages"=>{"fluentd"=>"0.12.16", "sentry-raven"=>"0.15.2", "cool.io"=>"1.4.1", "faraday"=>"0.9.2", "safe_yaml"=>"1.0.4", "msgpack"=>"0.5.12", "bundler"=>"1.10.6", "json"=>"1.8.3", "crack"=>"0.4.2", "tzinfo"=>"1.2.2", "thread_safe"=>"0.3.5", "tzinfo-data"=>"1.2015.7", "rake"=>"10.4.2", "yajl-ruby"=>"1.2.1", "hashdiff"=>"0.2.2", "sigdump"=>"0.2.3", "multipart-post"=>"2.0.0", "string-scrub"=>"0.0.5", "addressable"=>"2.3.8", "webmock"=>"1.22.2", "http_parser.rb"=>"0.6.0", "fluent-plugin-sentry"=>"0.0.1"}, "id"=>"127", "platform"=>"ruby", "context"=>{"something"=>{"foo"=>{"array"=>[1, 2, 3]}, "hash"=>{"nest"=>"data"}}}, "groupID"=>127}
28
37
  end
29
38
  end
30
39
 
@@ -37,7 +46,7 @@ class SentryOutputTest < Test::Unit::TestCase
37
46
  end
38
47
 
39
48
  def test_emit
40
- stub_endpoint
49
+ stub_post
41
50
  d1 = create_driver(CONFIG, 'input.app1_error')
42
51
  emit_level = 'warning'
43
52
  emit_message = 'error has occoured.'
@@ -52,18 +61,64 @@ class SentryOutputTest < Test::Unit::TestCase
52
61
  p @body
53
62
  emits = d1.emits
54
63
  assert_equal 0, emits.length
55
- assert_equal 'application/json', @content_type
64
+ assert_equal 'application/octet-stream', @content_type
56
65
  assert_equal emit_message, @body['message']
57
66
  timestamp = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S')
58
67
  assert_equal timestamp, @body['timestamp']
59
68
  assert_equal emit_level, @body['level']
60
- assert_equal '12345', @body['project']
61
69
  assert_equal 'fluentd', @body['logger']
62
70
  assert_equal 'ruby', @body['platform']
63
- assert_equal 'app1_error', @body['tags'][':tag']
71
+ assert_equal 'app1_error', @body['tags']['tag']
64
72
  hostname = `#{d1.instance.config['hostname_command']}`.chomp
65
73
  assert_equal hostname, @body['server_name']
66
74
  extra_message = {'something' => emit_extra}
67
75
  assert_equal extra_message, @body['extra']
68
76
  end
77
+
78
+ def test_emit_mock
79
+ stub_response
80
+ emit_level = 'warning'
81
+ emit_message = 'error has occoured.'
82
+ emit_timestamp = '2015-10-30T08:25:48Z'.force_encoding("UTF-8")
83
+ emit_time_spent = '13'
84
+ emit_logger = 'zaphod'
85
+ emit_server_name = 'bc40a4be7b2d'
86
+ emit_culprit = 'whodonit'
87
+ emit_release = 'wingnut'
88
+ emit_extra = {'foo' => {'array' => [1,2,3]}, 'hash' => {'nest' => 'data'}}
89
+ d1 = create_driver(CONFIG, 'input.app1_error')
90
+ d1.run do
91
+ d1.emit({
92
+ 'level' => emit_level,
93
+ 'message' => emit_message,
94
+ 'something' => emit_extra,
95
+ 'tags' => {'cool' => 'bar'},
96
+ 'timestamp' => emit_timestamp,
97
+ 'logger' => emit_logger,
98
+ 'server_name' => emit_server_name,
99
+ 'release' => emit_release,
100
+ 'time_spent' => emit_time_spent,
101
+ 'culprit' => emit_culprit
102
+ })
103
+ end
104
+ p @body
105
+ emits = d1.emits
106
+ extra_message = {'something' => emit_extra}
107
+ assert_equal 0, emits.length
108
+ assert_equal 'application/octet-stream', @content_type
109
+ assert_equal extra_message, @body['context']
110
+ assert_equal emit_timestamp, @body['dateCreated']
111
+ assert_equal emit_message, @body['message']
112
+ assert_equal emit_level, Hash[ @body['tags'] ]['level']
113
+ assert_equal emit_logger, Hash[ @body['tags'] ]['logger']
114
+ assert_equal emit_server_name, Hash[ @body['tags'] ]['server_name']
115
+ assert_equal emit_release, Hash[ @body['tags'] ]['sentry:release']
116
+ assert_equal 'bar', Hash[ @body['tags'] ]['cool']
117
+ assert_equal 'app1_error', Hash[ @body['tags'] ]['tag']
118
+ assert_equal 'ruby', @body['platform']
119
+ assert_equal nil, @body['user']
120
+ # these values seem to only be visible in the ui. need to find the api to grab them
121
+ #assert_equal emit_culprit, @body['culprit']
122
+ #assert_equal emit_time_spent, @body['timeSpent']
123
+ end
69
124
  end
metadata CHANGED
@@ -1,96 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-sentry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kentaro Yoshida
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-02-24 00:00:00.000000000 Z
11
+ date: 2015-10-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: webmock
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3'
62
69
  - !ruby/object:Gem::Dependency
63
70
  name: fluentd
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ! '>='
73
+ - - ">="
68
74
  - !ruby/object:Gem::Version
69
75
  version: '0'
70
76
  type: :runtime
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ! '>='
80
+ - - ">="
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: sentry-raven
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - "~>"
84
88
  - !ruby/object:Gem::Version
85
- version: '0'
89
+ version: 0.15.0
86
90
  type: :runtime
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - "~>"
92
95
  - !ruby/object:Gem::Version
93
- version: '0'
96
+ version: 0.15.0
94
97
  description:
95
98
  email:
96
99
  - y.ken.studio@gmail.com
@@ -98,8 +101,8 @@ executables: []
98
101
  extensions: []
99
102
  extra_rdoc_files: []
100
103
  files:
101
- - .gitignore
102
- - .travis.yml
104
+ - ".gitignore"
105
+ - ".travis.yml"
103
106
  - Gemfile
104
107
  - LICENSE
105
108
  - README.md
@@ -110,30 +113,29 @@ files:
110
113
  - test/plugin/test_out_sentry.rb
111
114
  homepage: https://github.com/y-ken/fluent-plugin-sentry
112
115
  licenses:
113
- - Apache License, Version 2.0
116
+ - Apache-2.0
117
+ metadata: {}
114
118
  post_install_message:
115
119
  rdoc_options: []
116
120
  require_paths:
117
121
  - lib
118
122
  required_ruby_version: !ruby/object:Gem::Requirement
119
- none: false
120
123
  requirements:
121
- - - ! '>='
124
+ - - ">="
122
125
  - !ruby/object:Gem::Version
123
126
  version: '0'
124
127
  required_rubygems_version: !ruby/object:Gem::Requirement
125
- none: false
126
128
  requirements:
127
- - - ! '>='
129
+ - - ">="
128
130
  - !ruby/object:Gem::Version
129
131
  version: '0'
130
132
  requirements: []
131
133
  rubyforge_project:
132
- rubygems_version: 1.8.23
134
+ rubygems_version: 2.4.5
133
135
  signing_key:
134
- specification_version: 3
135
- summary: Fluentd output plugin to send aggregated errors/exception events to sentry
136
- which are a realtime event logging and aggregation platform.
136
+ specification_version: 4
137
+ summary: Fluentd output plugin that sends aggregated errors/exception events to Sentry.
138
+ Sentry is a event logging and aggregation platform.
137
139
  test_files:
138
140
  - test/helper.rb
139
141
  - test/plugin/test_out_sentry.rb