smoke_detector 1.0.0 → 1.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/README.md +16 -5
- data/lib/smoke_detector/providers/provider.rb +5 -0
- data/lib/smoke_detector/providers/rollbar.rb +25 -16
- data/lib/smoke_detector/version.rb +1 -1
- data/spec/dummy/log/test.log +14938 -2201
- data/spec/models/providers/rollbar_spec.rb +35 -1
- data/spec/requests/middleware/javascript_monitors_spec.rb +47 -10
- metadata +25 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9539101ddc9c4b9edb48332bb8aa1e1261cf44fb
|
4
|
+
data.tar.gz: 6369af09d39456576eda2a3f3a27e41698b45e6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6bb76bf4122dc930759b1d4b80c3089c5880d388bd5c03e5d22d18ff0a55e8d6deb3d4b385ec793e99cfa269ce2fbce68a2d228a81c7ef57d198c4e5639960c
|
7
|
+
data.tar.gz: 90cde341fae602a40906b703a83bdadc76418f3141898b9c01d345bf81dc10f330292367fab85eeaaca5384db96bd633d2c87f32e276135bfc4222b520ce30d7
|
data/README.md
CHANGED
@@ -13,7 +13,6 @@ Add the following to your `Gemfile`:
|
|
13
13
|
```
|
14
14
|
gem 'smoke_detector'
|
15
15
|
```
|
16
|
-
This assumes you're using Lumos Labs' gemfury account.
|
17
16
|
|
18
17
|
Then add the provider's gem to your gemfile. Smoke Detector currently supports Rollbar and Airbrake. For example,
|
19
18
|
```
|
@@ -67,8 +66,10 @@ by Rollbar.js unless you do some additional filtering.
|
|
67
66
|
|
68
67
|
The following config demonstrates how to filter JavaScript exceptions by
|
69
68
|
the exception's message, and also, by the offending exception's source host url.
|
70
|
-
You can choose to filter by `
|
71
|
-
up to you.
|
69
|
+
You can choose to filter by `hostWhitelist` or `ignoredMessages` or both. It's
|
70
|
+
up to you. Note the lower, camel-case of the setting keys. They should match
|
71
|
+
[rollbar.js's](https://github.com/rollbar/rollbar.js) documentation in order to
|
72
|
+
be passed-along to the rollbar.js framework appropriately.
|
72
73
|
|
73
74
|
```
|
74
75
|
config.providers = [
|
@@ -77,13 +78,23 @@ config.providers = [
|
|
77
78
|
api_key: ENV['ROLLBAR_KEY'],
|
78
79
|
client_settings: {
|
79
80
|
api_key: ENV['ROLLBAR_CLIENT_KEY'],
|
80
|
-
|
81
|
-
|
81
|
+
ignoredMessages: ["Error: Clippy.bmp not found. The end is nigh."],
|
82
|
+
hostWhitelist: ["yourdomain.com", "cdn.anotherdomain.com"]
|
82
83
|
}
|
83
84
|
}
|
84
85
|
]
|
85
86
|
```
|
86
87
|
|
88
|
+
All key-value pairs under `client_settings` will be passed along to the javascript
|
89
|
+
client tracking library (in this case, Rollbar).
|
90
|
+
|
91
|
+
### Rollbar.js Person data
|
92
|
+
|
93
|
+
By default, there is no person data sent to rollbar. In order to do that, you will have to override the rollbar person data config:
|
94
|
+
|
95
|
+
```javascript
|
96
|
+
window._rollbarConfig.payload.person = { id: 1, email: 'someemail@example.com', username: 'someuser' }
|
97
|
+
```
|
87
98
|
|
88
99
|
TODO
|
89
100
|
----
|
@@ -2,6 +2,7 @@ module SmokeDetector::Providers
|
|
2
2
|
|
3
3
|
class Provider
|
4
4
|
attr_accessor :controller_proc
|
5
|
+
attr_reader :client_settings
|
5
6
|
|
6
7
|
def initialize(api_key, client_settings = {}, settings = {})
|
7
8
|
@client_settings = client_settings || {}
|
@@ -20,6 +21,10 @@ module SmokeDetector::Providers
|
|
20
21
|
''
|
21
22
|
end
|
22
23
|
|
24
|
+
def default_client_settings
|
25
|
+
{}
|
26
|
+
end
|
27
|
+
|
23
28
|
private
|
24
29
|
|
25
30
|
def client_api_key
|
@@ -1,9 +1,7 @@
|
|
1
|
+
require 'json'
|
1
2
|
module SmokeDetector::Providers
|
2
3
|
|
3
4
|
class Rollbar < Provider
|
4
|
-
|
5
|
-
attr_accessor :client_host_whitelist, :client_ignore_partial_messages
|
6
|
-
|
7
5
|
def initialize(api_key, client_settings = {}, settings = {})
|
8
6
|
super
|
9
7
|
::Rollbar.configure do |c|
|
@@ -19,8 +17,9 @@ module SmokeDetector::Providers
|
|
19
17
|
c.filepath ||= ::Rails.application.class.parent_name + '.rollbar'
|
20
18
|
end
|
21
19
|
|
22
|
-
@
|
23
|
-
|
20
|
+
@client_settings = default_client_settings
|
21
|
+
migrate_old_client_setting_syntax(client_settings)
|
22
|
+
@client_settings.deep_merge!(client_settings) if client_settings.present?
|
24
23
|
end
|
25
24
|
|
26
25
|
def alert(exception, options = {})
|
@@ -36,20 +35,19 @@ module SmokeDetector::Providers
|
|
36
35
|
::Rollbar.report_message(message, level, options)
|
37
36
|
end
|
38
37
|
|
38
|
+
def default_client_settings
|
39
|
+
{ captureUncaught: true, payload: { environment: ::Rails.env } }
|
40
|
+
end
|
41
|
+
|
39
42
|
def client_monitoring_code
|
40
|
-
return '' if
|
43
|
+
return '' if client_settings[:api_key].blank?
|
44
|
+
client_settings[:accessToken] = client_settings.delete(:api_key)
|
41
45
|
@client_monitoring_code ||= <<-JS
|
42
46
|
<script>
|
43
|
-
var _rollbarConfig = {
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
environment: "#{::Rails.env}"
|
48
|
-
},
|
49
|
-
hostWhiteList: #{@client_host_whitelist.to_s},
|
50
|
-
ignoredMessages: #{@client_ignored_messages.to_s}
|
51
|
-
};
|
52
|
-
!function(a,b){function c(b){this.shimId=++h,this.notifier=null,this.parentShim=b,this.logger=function(){},a.console&&void 0===a.console.shimId&&(this.logger=a.console.log)}function d(b,c,d){!d[4]&&a._rollbarWrappedError&&(d[4]=a._rollbarWrappedError,a._rollbarWrappedError=null),b.uncaughtError.apply(b,d),c&&c.apply(a,d)}function e(b){var d=c;return g(function(){if(this.notifier)return this.notifier[b].apply(this.notifier,arguments);var c=this,e="scope"===b;e&&(c=new d(this));var f=Array.prototype.slice.call(arguments,0),g={shim:c,method:b,args:f,ts:new Date};return a._rollbarShimQueue.push(g),e?c:void 0})}function f(a,b){if(b.hasOwnProperty&&b.hasOwnProperty("addEventListener")){var c=b.addEventListener;b.addEventListener=function(b,d,e){c.call(this,b,a.wrap(d),e)};var d=b.removeEventListener;b.removeEventListener=function(a,b,c){d.call(this,a,b&&b._wrapped?b._wrapped:b,c)}}}function g(a,b){return b=b||this.logger,function(){try{return a.apply(this,arguments)}catch(c){b("Rollbar internal error:",c)}}}var h=0;c.init=function(a,b){var e=b.globalAlias||"Rollbar";if("object"==typeof a[e])return a[e];a._rollbarShimQueue=[],a._rollbarWrappedError=null,b=b||{};var h=new c;return g(function(){if(h.configure(b),b.captureUncaught){var c=a.onerror;a.onerror=function(){var a=Array.prototype.slice.call(arguments,0);d(h,c,a)};var g,i,j=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"];for(g=0;g<j.length;++g)i=j[g],a[i]&&a[i].prototype&&f(h,a[i].prototype)}return a[e]=h,h},h.logger)()},c.prototype.loadFull=function(a,b,c,d){var e=g(function(){var a=b.createElement("script"),e=b.getElementsByTagName("script")[0];a.src=d.rollbarJsUrl,a.async=!c,a.onload=f,e.parentNode.insertBefore(a,e)},this.logger),f=g(function(){if(void 0===a._rollbarPayloadQueue)for(var b,c,d,e,f=new Error("rollbar.js did not load");b=a._rollbarShimQueue.shift();)for(d=b.args,e=0;e<d.length;++e)if(c=d[e],"function"==typeof c){c(f);break}},this.logger);g(function(){c?e():a.addEventListener?a.addEventListener("load",e,!1):a.attachEvent("onload",e)},this.logger)()},c.prototype.wrap=function(b){try{if("function"!=typeof b)return b;if(b._isWrap)return b;if(!b._wrapped){b._wrapped=function(){try{return b.apply(this,arguments)}catch(c){throw a._rollbarWrappedError=c,c}},b._wrapped._isWrap=!0;for(var c in b)b.hasOwnProperty(c)&&(b._wrapped[c]=b[c])}return b._wrapped}catch(d){return b}};for(var i="log,debug,info,warn,warning,error,critical,global,configure,scope,uncaughtError".split(","),j=0;j<i.length;++j)c.prototype[i[j]]=e(i[j]);var k="//d37gvrvc0wt4s1.cloudfront.net/js/v1.1/rollbar.min.js";_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||k;var l=c.init(a,_rollbarConfig);l.loadFull(a,b,!1,_rollbarConfig)}(window,document);
|
47
|
+
var _rollbarConfig = #{client_settings.to_json};
|
48
|
+
</script>
|
49
|
+
<script>
|
50
|
+
!function(a,b){function c(b){this.shimId=++h,this.notifier=null,this.parentShim=b,this.logger=function(){},a.console&&void 0===a.console.shimId&&(this.logger=a.console.log)}function d(b,c,d){a._rollbarWrappedError&&(d[4]||(d[4]=a._rollbarWrappedError),d[5]||(d[5]=a._rollbarWrappedError._rollbarContext),a._rollbarWrappedError=null),b.uncaughtError.apply(b,d),c&&c.apply(a,d)}function e(b){var d=c;return g(function(){if(this.notifier)return this.notifier[b].apply(this.notifier,arguments);var c=this,e="scope"===b;e&&(c=new d(this));var f=Array.prototype.slice.call(arguments,0),g={shim:c,method:b,args:f,ts:new Date};return a._rollbarShimQueue.push(g),e?c:void 0})}function f(a,b){if(b.hasOwnProperty&&b.hasOwnProperty("addEventListener")){var c=b.addEventListener;b.addEventListener=function(b,d,e){c.call(this,b,a.wrap(d),e)};var d=b.removeEventListener;b.removeEventListener=function(a,b,c){d.call(this,a,b&&b._wrapped?b._wrapped:b,c)}}}function g(a,b){return b=b||this.logger,function(){try{return a.apply(this,arguments)}catch(c){b("Rollbar internal error:",c)}}}var h=0;c.init=function(a,b){var e=b.globalAlias||"Rollbar";if("object"==typeof a[e])return a[e];a._rollbarShimQueue=[],a._rollbarWrappedError=null,b=b||{};var h=new c;return g(function(){if(h.configure(b),b.captureUncaught){var c=a.onerror;a.onerror=function(){var a=Array.prototype.slice.call(arguments,0);d(h,c,a)};var g,i,j="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(g=0;g<j.length;++g)i=j[g],a[i]&&a[i].prototype&&f(h,a[i].prototype)}return a[e]=h,h},h.logger)()},c.prototype.loadFull=function(a,b,c,d,e){var f=g(function(){var a=b.createElement("script"),e=b.getElementsByTagName("script")[0];a.src=d.rollbarJsUrl,a.async=!c,a.onload=h,e.parentNode.insertBefore(a,e)},this.logger),h=g(function(){var b;if(void 0===a._rollbarPayloadQueue){var c,d,f,g;for(b=new Error("rollbar.js did not load");c=a._rollbarShimQueue.shift();)for(f=c.args,g=0;g<f.length;++g)if(d=f[g],"function"==typeof d){d(b);break}}"function"==typeof e&&e(b)},this.logger);g(function(){c?f():a.addEventListener?a.addEventListener("load",f,!1):a.attachEvent("onload",f)},this.logger)()},c.prototype.wrap=function(b,c){try{var d;if(d="function"==typeof c?c:function(){return c||{}},"function"!=typeof b)return b;if(b._isWrap)return b;if(!b._wrapped){b._wrapped=function(){try{return b.apply(this,arguments)}catch(c){throw c._rollbarContext=d(),c._rollbarContext._wrappedSource=b.toString(),a._rollbarWrappedError=c,c}},b._wrapped._isWrap=!0;for(var e in b)b.hasOwnProperty(e)&&(b._wrapped[e]=b[e])}return b._wrapped}catch(f){return b}};for(var i="log,debug,info,warn,warning,error,critical,global,configure,scope,uncaughtError".split(","),j=0;j<i.length;++j)c.prototype[i[j]]=e(i[j]);var k="//d37gvrvc0wt4s1.cloudfront.net/js/v1.1/rollbar.min.js";_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||k;var l=c.init(a,_rollbarConfig);l.loadFull(a,b,!1,_rollbarConfig)}(window,document);
|
53
51
|
</script>
|
54
52
|
JS
|
55
53
|
end
|
@@ -65,5 +63,16 @@ module SmokeDetector::Providers
|
|
65
63
|
::Rollbar.report_exception(exception, rollbar_request_data, rollbar_person_data)
|
66
64
|
end
|
67
65
|
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def migrate_old_client_setting_syntax(settings)
|
69
|
+
return unless settings.present?
|
70
|
+
whitelist = settings.delete(:host_whitelist)
|
71
|
+
ignored_msgs = settings.delete(:ignored_messages)
|
72
|
+
|
73
|
+
settings[:hostWhiteList] = whitelist if whitelist
|
74
|
+
settings[:ignoredMessages] = ignored_msgs if ignored_msgs
|
75
|
+
settings
|
76
|
+
end
|
68
77
|
end
|
69
78
|
end
|