rnotifier 0.0.9 → 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 +4 -4
- data/.travis.yml +11 -0
- data/Gemfile +1 -0
- data/README.md +7 -4
- data/lib/rnotifier/config.rb +15 -2
- data/lib/rnotifier/event_data.rb +31 -0
- data/lib/rnotifier/exception_code.rb +4 -1
- data/lib/rnotifier/exception_data.rb +2 -5
- data/lib/rnotifier/notifier.rb +8 -5
- data/lib/rnotifier/version.rb +1 -1
- data/lib/rnotifier.rb +7 -2
- data/spec/event_data_spec.rb +29 -0
- data/spec/fixtures/fake_app.rb +1 -0
- data/spec/rack_middleware_spec.rb +4 -4
- data/spec/spec_helper.rb +8 -11
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fdda4804509a222da3da5cb876ec831a829659c
|
4
|
+
data.tar.gz: 1b6b2be167646512fd9078ecbd2c711a933d572f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98a2cde857b4e00ef0a5fbd0a8a710c5c5563c07a81f5f8c081f634514ce9e684938df5a9915aa3f8ad2c8afb30008169dd36457294f4626c0dfa192e96133bf
|
7
|
+
data.tar.gz: e76ebcfd6889c2d0ac0a3ae2f8da50e986f85286f742b2caffe79ea000f8702d7e0957b782ec63b01624862bfec2fd9eebc87c9ec70203379ff0e4d96a6e0ebc
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
Exception catcher for rack base applications.
|
4
4
|
|
5
|
+
[](https://travis-ci.org/jiren/rnotifier)
|
6
|
+
[](https://coveralls.io/r/jiren/rnotifier?branch=master)
|
7
|
+
|
5
8
|
## Installation
|
6
9
|
|
7
10
|
Add this line to your application's Gemfile:
|
@@ -22,13 +25,13 @@ rnotifier install 'API-KEY' # This will create 'config/rnotifier.yaml' file.
|
|
22
25
|
|
23
26
|
### Config file options
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
environments: development,test #default is production
|
29
|
+
capture_code: true #default false
|
30
|
+
api_host: 'http://yourapp.com' #default http://rnotifier.com
|
28
31
|
|
29
32
|
### To test config
|
30
33
|
|
31
|
-
rnotifier test
|
34
|
+
rnotifier test #this will send test exception to rnotifier.
|
32
35
|
|
33
36
|
## Contributing
|
34
37
|
|
data/lib/rnotifier/config.rb
CHANGED
@@ -4,15 +4,16 @@ module Rnotifier
|
|
4
4
|
:api_host => 'http://api.rnotifier.com',
|
5
5
|
:api_version => 'v1',
|
6
6
|
:notify_path => 'exception',
|
7
|
+
:event_path => 'event',
|
7
8
|
:ignore_env => ['development', 'test'],
|
8
9
|
:http_open_timeout => 2,
|
9
10
|
:http_read_timeout => 4
|
10
11
|
}
|
11
12
|
|
12
|
-
CLIENT = "
|
13
|
+
CLIENT = "RRG:#{Rnotifier::VERSION}"
|
13
14
|
|
14
15
|
class << self
|
15
|
-
attr_accessor :api_key, :notification_path, :environments, :current_env,
|
16
|
+
attr_accessor :api_key, :notification_path, :event_path, :environments, :current_env,
|
16
17
|
:valid, :app_env, :api_host, :ignore_exceptions, :capture_code
|
17
18
|
|
18
19
|
def [](val)
|
@@ -49,6 +50,8 @@ module Rnotifier
|
|
49
50
|
self.app_env = get_app_env
|
50
51
|
self.ignore_exceptions = self.ignore_exceptions.split(',') if self.ignore_exceptions.is_a?(String)
|
51
52
|
|
53
|
+
self.event_path = '/' + [DEFAULT[:api_version], DEFAULT[:event_path], self.api_key].join('/')
|
54
|
+
|
52
55
|
self.valid = true
|
53
56
|
end
|
54
57
|
|
@@ -80,6 +83,16 @@ module Rnotifier
|
|
80
83
|
(defined?(Rails) && Rails.respond_to?(:root)) ? Rails.root.to_s : Dir.pwd
|
81
84
|
end
|
82
85
|
|
86
|
+
def event_app_env
|
87
|
+
{
|
88
|
+
:env => self.current_env,
|
89
|
+
:pid => $$,
|
90
|
+
:host => (Socket.gethostname rescue ''),
|
91
|
+
:language => 'ruby',
|
92
|
+
:platform => (RUBY_PLATFORM rescue '')
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
83
96
|
end
|
84
97
|
end
|
85
98
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Rnotifier
|
2
|
+
class EventData
|
3
|
+
attr_reader :data
|
4
|
+
|
5
|
+
def initialize(name, data = {})
|
6
|
+
@data = {
|
7
|
+
:name => name,
|
8
|
+
:data => data,
|
9
|
+
:app_env => EventData.app_env,
|
10
|
+
:occurred_at => Time.now.utc.to_s,
|
11
|
+
:data_from => :event,
|
12
|
+
:rnotifier_client => Config::CLIENT,
|
13
|
+
}
|
14
|
+
@data[:context_data] = Thread.current[:rnotifier_context] if Thread.current[:rnotifier_context]
|
15
|
+
end
|
16
|
+
|
17
|
+
def notify
|
18
|
+
begin
|
19
|
+
Notifier.send(data, Rnotifier::Config.event_path)
|
20
|
+
rescue Exception => e
|
21
|
+
Rlogger.error("[EVENT NOTIFY] #{e.message}")
|
22
|
+
Rlogger.error("[EVENT NOTIFY] #{e.backtrace}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.app_env
|
27
|
+
@env ||= Rnotifier::Config.event_app_env
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -4,7 +4,10 @@ module Rnotifier
|
|
4
4
|
|
5
5
|
def get(backtrace)
|
6
6
|
return unless backtrace
|
7
|
-
|
7
|
+
bline = backtrace.find do |l|
|
8
|
+
l.index(Config.app_env[:app_root]) == 0 && !Gem.path.any?{|path| l.index(path) == 0}
|
9
|
+
end
|
10
|
+
filename, line, method = (bline|| backtrace[0]).split(':')
|
8
11
|
self.find(filename, line.to_i, 3)
|
9
12
|
end
|
10
13
|
|
@@ -18,9 +18,8 @@ module Rnotifier
|
|
18
18
|
|
19
19
|
begin
|
20
20
|
data = options[:type] == :rack ? self.rack_exception_data : {:extra => self.env }
|
21
|
-
|
22
21
|
data[:app_env] = Rnotifier::Config.app_env
|
23
|
-
data[:occurred_at] = Time.now.to_s
|
22
|
+
data[:occurred_at] = Time.now.utc.to_s
|
24
23
|
data[:exception] = self.exception_data
|
25
24
|
data[:context_data] = Thread.current[:rnotifier_context] if Thread.current[:rnotifier_context]
|
26
25
|
data[:data_from] = options[:type]
|
@@ -30,10 +29,8 @@ module Rnotifier
|
|
30
29
|
rescue Exception => e
|
31
30
|
Rlogger.error("[NOTIFY] #{e.message}")
|
32
31
|
Rlogger.error("[NOTIFY] #{e.backtrace}")
|
33
|
-
|
34
|
-
Rnotifier.clear_context
|
32
|
+
false
|
35
33
|
end
|
36
|
-
false
|
37
34
|
end
|
38
35
|
|
39
36
|
def rack_exception_data
|
data/lib/rnotifier/notifier.rb
CHANGED
@@ -3,23 +3,26 @@ module Rnotifier
|
|
3
3
|
class << self
|
4
4
|
|
5
5
|
def connection
|
6
|
-
@connection ||= Faraday.new(:url =>
|
6
|
+
@connection ||= Faraday.new(:url => Config.api_host) do |faraday|
|
7
7
|
faraday.adapter Faraday.default_adapter
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
def send(data)
|
11
|
+
def send(data, url = nil)
|
12
12
|
response = self.connection.post do |req|
|
13
|
-
req.url
|
13
|
+
req.url(url || Config.notification_path)
|
14
14
|
req.headers['Content-Type'] = 'application/json'
|
15
|
-
req.
|
16
|
-
req.options[:
|
15
|
+
req.headers['Api-Key'] = Config.api_key
|
16
|
+
req.options[:timeout] = Config[:http_open_timeout]
|
17
|
+
req.options[:open_timeout] = Config[:http_read_timeout]
|
17
18
|
req.body = MultiJson.dump(data)
|
18
19
|
end
|
19
20
|
|
20
21
|
return true if response.status == 200
|
21
22
|
Rlogger.error("[RNOTIFIER SERVER] Response Status:#{response.status}")
|
22
23
|
false
|
24
|
+
ensure
|
25
|
+
Rnotifier.clear_context
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
data/lib/rnotifier/version.rb
CHANGED
data/lib/rnotifier.rb
CHANGED
@@ -9,6 +9,7 @@ require 'rnotifier/config'
|
|
9
9
|
require 'rnotifier/rlogger'
|
10
10
|
require 'rnotifier/notifier'
|
11
11
|
require 'rnotifier/exception_data'
|
12
|
+
require 'rnotifier/event_data'
|
12
13
|
require 'rnotifier/rack_middleware'
|
13
14
|
require 'rnotifier/parameter_filter'
|
14
15
|
require 'rnotifier/exception_code'
|
@@ -45,8 +46,12 @@ module Rnotifier
|
|
45
46
|
Thread.current[:rnotifier_context] = nil
|
46
47
|
end
|
47
48
|
|
48
|
-
def
|
49
|
-
Rnotifier::ExceptionData.new(exception,
|
49
|
+
def exception(exception, params = {})
|
50
|
+
Rnotifier::ExceptionData.new(exception, params, {:type => :rescue}).notify
|
51
|
+
end
|
52
|
+
|
53
|
+
def event(name, params = {})
|
54
|
+
Rnotifier::EventData.new(name, params).notify if Rnotifier::Config.valid?
|
50
55
|
end
|
51
56
|
|
52
57
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rnotifier::EventData do
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
rnotifier_init
|
8
|
+
@name = 'product'
|
9
|
+
@data = {:id => 1, :name => 'ProductX'}
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'is initialize exception_data object' do
|
13
|
+
e_data = Rnotifier::EventData.new(@name, @data)
|
14
|
+
|
15
|
+
expect(e_data.data[:name]).to eq @name
|
16
|
+
expect(e_data.data[:data]).to eq @data
|
17
|
+
expect(e_data.data[:data_from]).to eq :event
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'sends event data to server' do
|
21
|
+
path = '/' + [ Rnotifier::Config::DEFAULT[:api_version], Rnotifier::Config::DEFAULT[:event_path], 'API-KEY'].join('/')
|
22
|
+
stubs = stub_faraday_request({:path => path})
|
23
|
+
|
24
|
+
Rnotifier::EventData.new(@name, @data).notify
|
25
|
+
|
26
|
+
expect { stubs.verify_stubbed_calls }.to_not raise_error
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/fixtures/fake_app.rb
CHANGED
@@ -12,11 +12,11 @@ describe Rnotifier::RackMiddleware do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'sends get request and catch exception' do
|
15
|
-
|
15
|
+
get "/exception/1"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
expect(last_response.errors.split(/:\n/).first).to eq @type_error
|
18
|
+
expect(last_response.status).to eq 500
|
19
|
+
expect { @stubs.verify_stubbed_calls }.to_not raise_error
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
ENV['RACK_ENV'] = 'test'
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'bundler/setup'
|
3
5
|
require 'open-uri'
|
@@ -5,10 +7,14 @@ require 'rack'
|
|
5
7
|
require 'rack/request'
|
6
8
|
require 'rack/mock'
|
7
9
|
require 'rack/test'
|
8
|
-
require '
|
10
|
+
require 'coveralls'
|
9
11
|
|
12
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib/')
|
13
|
+
require 'rnotifier'
|
10
14
|
require File.dirname(__FILE__) + "/fixtures/fake_app"
|
11
15
|
|
16
|
+
Coveralls.wear!
|
17
|
+
|
12
18
|
RSpec.configure do |config|
|
13
19
|
config.color_enabled = true
|
14
20
|
#config.tty = true
|
@@ -20,24 +26,15 @@ RSpec.configure do |config|
|
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
23
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib/')
|
24
|
-
|
25
|
-
ENV['RACK_ENV'] = 'test'
|
26
|
-
|
27
|
-
require 'rnotifier'
|
28
|
-
|
29
29
|
def rnotifier_init
|
30
30
|
ENV['RACK_ENV'] = 'test'
|
31
31
|
Rnotifier.load_config("#{Dir.pwd}/spec/fixtures/rnotifier.yaml")
|
32
32
|
end
|
33
33
|
|
34
|
-
def set_test_adapter
|
35
|
-
end
|
36
|
-
|
37
34
|
def stub_faraday_request(opts = {})
|
38
35
|
opts[:status] ||= 200
|
39
36
|
opts[:message] ||= 'ok'
|
40
|
-
opts[:path]
|
37
|
+
opts[:path] ||= '/' + [ Rnotifier::Config::DEFAULT[:api_version], Rnotifier::Config::DEFAULT[:notify_path], 'API-KEY'].join('/')
|
41
38
|
|
42
39
|
stubs = Faraday::Adapter::Test::Stubs.new
|
43
40
|
conn = Faraday.new do |builder|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rnotifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jiren Patel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -117,6 +117,7 @@ extensions: []
|
|
117
117
|
extra_rdoc_files: []
|
118
118
|
files:
|
119
119
|
- .gitignore
|
120
|
+
- .travis.yml
|
120
121
|
- Gemfile
|
121
122
|
- LICENSE.txt
|
122
123
|
- README.md
|
@@ -127,6 +128,7 @@ files:
|
|
127
128
|
- lib/rnotifier.rb
|
128
129
|
- lib/rnotifier/config.rb
|
129
130
|
- lib/rnotifier/config_test.rb
|
131
|
+
- lib/rnotifier/event_data.rb
|
130
132
|
- lib/rnotifier/exception_code.rb
|
131
133
|
- lib/rnotifier/exception_data.rb
|
132
134
|
- lib/rnotifier/notifier.rb
|
@@ -138,6 +140,7 @@ files:
|
|
138
140
|
- rnotifier.gemspec
|
139
141
|
- spec/code.text
|
140
142
|
- spec/config_spec.rb
|
143
|
+
- spec/event_data_spec.rb
|
141
144
|
- spec/exception_code_spec.rb
|
142
145
|
- spec/exception_data_spec.rb
|
143
146
|
- spec/fixtures/fake_app.rb
|
@@ -172,6 +175,7 @@ summary: Exception catcher for Rails and other Rack apps
|
|
172
175
|
test_files:
|
173
176
|
- spec/code.text
|
174
177
|
- spec/config_spec.rb
|
178
|
+
- spec/event_data_spec.rb
|
175
179
|
- spec/exception_code_spec.rb
|
176
180
|
- spec/exception_data_spec.rb
|
177
181
|
- spec/fixtures/fake_app.rb
|