raygun4ruby 0.0.3
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.
- data/lib/generators/raygun/install_generator.rb +17 -0
- data/lib/raygun.rb +75 -0
- data/lib/raygun/client.rb +104 -0
- data/lib/raygun/configuration.rb +45 -0
- data/lib/raygun/rack_exception_interceptor.rb +16 -0
- data/lib/raygun/railtie.rb +26 -0
- data/lib/raygun/testable.rb +19 -0
- data/lib/raygun/version.rb +3 -0
- data/lib/raygun4ruby.rb +1 -0
- data/lib/tasks/raygun.tasks +8 -0
- metadata +183 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Raygun
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
|
4
|
+
argument :api_key
|
5
|
+
|
6
|
+
desc "This generator creates a configuration file for the Raygun ruby adapter inside config/initializers"
|
7
|
+
def create_configuration_file
|
8
|
+
initializer "raygun.rb" do
|
9
|
+
<<-EOS
|
10
|
+
Raygun.setup do |config|
|
11
|
+
config.api_key = "#{api_key}"
|
12
|
+
end
|
13
|
+
EOS
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/raygun.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require "bundler"
|
2
|
+
Bundler.setup(:default)
|
3
|
+
|
4
|
+
require "httparty"
|
5
|
+
require "logger"
|
6
|
+
require "json"
|
7
|
+
require "socket"
|
8
|
+
require "rack"
|
9
|
+
require "active_support/core_ext"
|
10
|
+
|
11
|
+
require "raygun/version"
|
12
|
+
require "raygun/configuration"
|
13
|
+
require "raygun/client"
|
14
|
+
require "raygun/rack_exception_interceptor"
|
15
|
+
require "raygun/testable"
|
16
|
+
require "raygun/railtie" if defined?(Rails)
|
17
|
+
|
18
|
+
module Raygun
|
19
|
+
|
20
|
+
# used to identify ourselves to Raygun
|
21
|
+
CLIENT_URL = "https://github.com/MindscapeHQ/raygun4ruby"
|
22
|
+
CLIENT_NAME = "Raygun4Ruby Gem"
|
23
|
+
|
24
|
+
class << self
|
25
|
+
|
26
|
+
include Testable
|
27
|
+
|
28
|
+
# Configuration Object (instance of Raygun::Configuration)
|
29
|
+
attr_writer :configuration
|
30
|
+
|
31
|
+
def setup
|
32
|
+
yield(configuration)
|
33
|
+
end
|
34
|
+
|
35
|
+
def configuration
|
36
|
+
@configuration ||= Configuration.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def track_exception(exception_instance, env = {})
|
40
|
+
if should_report?(exception_instance)
|
41
|
+
log("[Raygun] Tracking Exception...")
|
42
|
+
Client.new.track_exception(exception_instance, env)
|
43
|
+
end
|
44
|
+
rescue Exception => e
|
45
|
+
if configuration.failsafe_logger
|
46
|
+
failsafe_log("Problem reporting exception to Raygun: #{e.class}: #{e.message}\n\n#{e.backrace.join("\n")}")
|
47
|
+
else
|
48
|
+
raise e
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def track_exceptions
|
53
|
+
yield
|
54
|
+
rescue => e
|
55
|
+
track_exception(e)
|
56
|
+
end
|
57
|
+
|
58
|
+
def log(message)
|
59
|
+
configuration.logger.info(message) if configuration.logger
|
60
|
+
end
|
61
|
+
|
62
|
+
def failsafe_log(message)
|
63
|
+
configuration.failsafe_logger.info(message)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def should_report?(exception)
|
69
|
+
return false if configuration.silence_reporting
|
70
|
+
return false if configuration.ignore.include?(exception.class.to_s)
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Raygun
|
2
|
+
# client for the Raygun REST APIv1
|
3
|
+
# as per http://raygun.io/raygun-providers/rest-json-api?v=1
|
4
|
+
class Client
|
5
|
+
include HTTParty
|
6
|
+
|
7
|
+
base_uri "https://api.raygun.io/"
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@headers = {
|
11
|
+
"X-ApiKey" => Raygun.configuration.api_key
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def track_exception(exception_instance, env = {})
|
16
|
+
create_entry(build_payload_hash(exception_instance, env))
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def client_details
|
22
|
+
{
|
23
|
+
name: Raygun::CLIENT_NAME,
|
24
|
+
version: Raygun::VERSION,
|
25
|
+
clientUrl: Raygun::CLIENT_URL
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def error_details(exception)
|
30
|
+
{
|
31
|
+
className: exception.class.to_s,
|
32
|
+
message: exception.message,
|
33
|
+
stackTrace: exception.backtrace.map { |line| stack_trace_for(line) }
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def stack_trace_for(line)
|
38
|
+
# see http://www.ruby-doc.org/core-2.0/Exception.html#method-i-backtrace
|
39
|
+
file_name, line_number, method = line.split(":")
|
40
|
+
{
|
41
|
+
lineNumber: line_number,
|
42
|
+
fileName: file_name,
|
43
|
+
methodName: method.gsub(/^in `(.*?)'$/, "\\1")
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
def hostname
|
48
|
+
Socket.gethostname
|
49
|
+
end
|
50
|
+
|
51
|
+
def version
|
52
|
+
Raygun.configuration.version
|
53
|
+
end
|
54
|
+
|
55
|
+
def request_information(env)
|
56
|
+
return {} if env.blank?
|
57
|
+
|
58
|
+
{
|
59
|
+
hostName: env["SERVER_NAME"],
|
60
|
+
url: env["PATH_INFO"],
|
61
|
+
httpMethod: env["REQUEST_METHOD"],
|
62
|
+
ipAddress: env["REMOTE_ADDR"],
|
63
|
+
queryString: Rack::Utils.parse_nested_query(env["QUERY_STRING"]),
|
64
|
+
form: form_data(env),
|
65
|
+
headers: headers(env),
|
66
|
+
rawData: []
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def headers(rack_env)
|
71
|
+
rack_env.select do |k, v|
|
72
|
+
k.starts_with?("HTTP_")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def form_data(rack_env)
|
77
|
+
request = Rack::Request.new(rack_env)
|
78
|
+
|
79
|
+
if request.form_data?
|
80
|
+
request.body
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# see http://raygun.io/raygun-providers/rest-json-api?v=1
|
85
|
+
def build_payload_hash(exception_instance, env)
|
86
|
+
{
|
87
|
+
occurredOn: Time.now.utc.iso8601,
|
88
|
+
details: {
|
89
|
+
machineName: hostname,
|
90
|
+
version: version,
|
91
|
+
client: client_details,
|
92
|
+
error: error_details(exception_instance),
|
93
|
+
userCustomData: Raygun.configuration.custom_data,
|
94
|
+
request: request_information(env)
|
95
|
+
}
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
def create_entry(payload_hash)
|
100
|
+
self.class.post("/entries", headers: @headers, body: JSON.generate(payload_hash))
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Raygun
|
2
|
+
class Configuration
|
3
|
+
|
4
|
+
# Your Raygun API Key - this can be found on your dashboard at Raygun.io
|
5
|
+
attr_accessor :api_key
|
6
|
+
|
7
|
+
# Array of exception classes to ignore
|
8
|
+
attr_accessor :ignore
|
9
|
+
|
10
|
+
# Version to use
|
11
|
+
attr_accessor :version
|
12
|
+
|
13
|
+
# Custom Data to send with each exception
|
14
|
+
attr_accessor :custom_data
|
15
|
+
|
16
|
+
# Logger to use when if we find an exception :)
|
17
|
+
attr_accessor :logger
|
18
|
+
|
19
|
+
# Should we silence exception reporting (e.g in Development environments)
|
20
|
+
attr_accessor :silence_reporting
|
21
|
+
|
22
|
+
# Failsafe logger (for exceptions that happen when we're attempting to report exceptions)
|
23
|
+
attr_accessor :failsafe_logger
|
24
|
+
|
25
|
+
# Exception classes to ignore by default
|
26
|
+
IGNORE_DEFAULT = ['ActiveRecord::RecordNotFound',
|
27
|
+
'ActionController::RoutingError',
|
28
|
+
'ActionController::InvalidAuthenticityToken',
|
29
|
+
'CGI::Session::CookieStore::TamperedWithCookie',
|
30
|
+
'ActionController::UnknownAction',
|
31
|
+
'AbstractController::ActionNotFound',
|
32
|
+
'Mongoid::Errors::DocumentNotFound']
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
# set default attribute values
|
36
|
+
@ignore = IGNORE_DEFAULT
|
37
|
+
@custom_data = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
def [](key)
|
41
|
+
send(key)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Raygun
|
2
|
+
class RackExceptionInterceptor
|
3
|
+
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
response = @app.call(env)
|
10
|
+
rescue Exception => exception
|
11
|
+
Raygun.track_exception(exception, env)
|
12
|
+
raise exception
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Raygun::Railtie < Rails::Railtie
|
2
|
+
|
3
|
+
initializer "raygun.configure_rails_initialization" do |app|
|
4
|
+
|
5
|
+
# Thanks Airbrake: See https://github.com/rails/rails/pull/8624
|
6
|
+
middleware = if defined?(ActionDispatch::DebugExceptions)
|
7
|
+
# Rails >= 3.2.0
|
8
|
+
"ActionDispatch::DebugExceptions"
|
9
|
+
else
|
10
|
+
# Rails < 3.2.0
|
11
|
+
"ActionDispatch::ShowExceptions"
|
12
|
+
end
|
13
|
+
|
14
|
+
app.config.middleware.insert_after middleware, "Raygun::RackExceptionInterceptor"
|
15
|
+
end
|
16
|
+
|
17
|
+
config.to_prepare do
|
18
|
+
Raygun.configuration.logger ||= Rails.logger
|
19
|
+
Raygun.configuration.silence_reporting ||= Rails.env.development?
|
20
|
+
end
|
21
|
+
|
22
|
+
rake_tasks do
|
23
|
+
load "tasks/raygun.tasks"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Raygun
|
2
|
+
|
3
|
+
class ItWorksException < StandardError; end
|
4
|
+
|
5
|
+
module Testable
|
6
|
+
|
7
|
+
def track_test_exception
|
8
|
+
Raygun.configuration.silence_reporting = false
|
9
|
+
raise ItWorksException.new("Woohoo! Your Raygun<->Ruby connection is set up correctly")
|
10
|
+
rescue ItWorksException => e
|
11
|
+
if Raygun.track_exception(e).success?
|
12
|
+
puts "Success! Now go check your Raygun.io Dashboard"
|
13
|
+
else
|
14
|
+
puts "Oh-oh, something went wrong - double check your API key"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/raygun4ruby.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "raygun"
|
metadata
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: raygun4ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Mindscape
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2013-07-31 00:00:00 +12:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: httparty
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 11
|
30
|
+
version: "0.11"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: json
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
segments:
|
41
|
+
- 0
|
42
|
+
version: "0"
|
43
|
+
type: :runtime
|
44
|
+
version_requirements: *id002
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: activesupport
|
47
|
+
prerelease: false
|
48
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
version: "0"
|
55
|
+
type: :runtime
|
56
|
+
version_requirements: *id003
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rack
|
59
|
+
prerelease: false
|
60
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id004
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 1
|
78
|
+
- 1
|
79
|
+
version: "1.1"
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id005
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rake
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
type: :development
|
93
|
+
version_requirements: *id006
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: fakeweb
|
96
|
+
prerelease: false
|
97
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
segments:
|
102
|
+
- 1
|
103
|
+
- 3
|
104
|
+
version: "1.3"
|
105
|
+
type: :development
|
106
|
+
version_requirements: *id007
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: timecop
|
109
|
+
prerelease: false
|
110
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
version: "0"
|
117
|
+
type: :development
|
118
|
+
version_requirements: *id008
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
name: minitest
|
121
|
+
prerelease: false
|
122
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
segments:
|
127
|
+
- 4
|
128
|
+
- 2
|
129
|
+
version: "4.2"
|
130
|
+
type: :development
|
131
|
+
version_requirements: *id009
|
132
|
+
description: Ruby Adapter for Raygun.io
|
133
|
+
email:
|
134
|
+
- hello@raygun.io
|
135
|
+
executables: []
|
136
|
+
|
137
|
+
extensions: []
|
138
|
+
|
139
|
+
extra_rdoc_files: []
|
140
|
+
|
141
|
+
files:
|
142
|
+
- lib/raygun.rb
|
143
|
+
- lib/raygun/client.rb
|
144
|
+
- lib/raygun/configuration.rb
|
145
|
+
- lib/raygun/rack_exception_interceptor.rb
|
146
|
+
- lib/raygun/railtie.rb
|
147
|
+
- lib/raygun/version.rb
|
148
|
+
- lib/raygun4ruby.rb
|
149
|
+
- lib/generators/raygun/install_generator.rb
|
150
|
+
- lib/raygun/testable.rb
|
151
|
+
- lib/tasks/raygun.tasks
|
152
|
+
has_rdoc: true
|
153
|
+
homepage: http://raygun.io
|
154
|
+
licenses:
|
155
|
+
- MIT
|
156
|
+
post_install_message:
|
157
|
+
rdoc_options: []
|
158
|
+
|
159
|
+
require_paths:
|
160
|
+
- lib
|
161
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
segments:
|
173
|
+
- 0
|
174
|
+
version: "0"
|
175
|
+
requirements: []
|
176
|
+
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 1.3.6
|
179
|
+
signing_key:
|
180
|
+
specification_version: 3
|
181
|
+
summary: This gem provides support for Ruby and Ruby on Rails for the Raygun.io error reporter
|
182
|
+
test_files: []
|
183
|
+
|