errplane 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.3-p125@errplane_rails --create
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem "capybara"
7
+ gem "combustion"
8
+ gem "rspec-rails"
9
+ gem "sqlite3"
10
+ gem "webmock"
11
+ end
@@ -0,0 +1,6 @@
1
+ Errplane
2
+ ========
3
+
4
+ This gem helps you integrate your Ruby on Rails applications with [Errplane](http://errplane.com), a cloud-based tool for handling exceptions, log aggregation, uptime monitoring, and alerting.
5
+
6
+ It's a gem. You can figure out the rest.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "errplane/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "errplane"
7
+ s.version = Errplane::VERSION
8
+ s.authors = ["Todd Persen"]
9
+ s.email = ["todd@errplane.com"]
10
+ s.homepage = "http://errplane.com"
11
+ s.summary = %q{Rails exception reporting for Errplane.}
12
+ s.description = %q{This gem provides exception reporting with Errplane for Rails 3.x applications.}
13
+
14
+ s.rubyforge_project = "errplane"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # s.add_development_dependency "combustion"
22
+ # s.add_runtime_dependency "rest-client"
23
+ end
@@ -0,0 +1,57 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'rubygems'
4
+
5
+ begin
6
+ require 'active_support'
7
+ require 'active_support/core_ext'
8
+ rescue LoadError
9
+ require 'activesupport'
10
+ require 'activesupport/core_ext'
11
+ end
12
+
13
+ require "errplane/version"
14
+ require "errplane/black_box"
15
+ require "errplane/configuration"
16
+ require "errplane/transmitter"
17
+ require "errplane/rack"
18
+
19
+ require "errplane/railtie" #if defined?(Rails)
20
+
21
+ module Errplane
22
+ API_HOST = "api.errplane.com"
23
+
24
+ class << self
25
+ attr_writer :configuration
26
+ attr_accessor :transmitter
27
+
28
+ def configure(silent = false)
29
+ yield(configuration)
30
+ self.transmitter = Transmitter.new(configuration)
31
+ end
32
+
33
+ def configuration
34
+ @configuration ||= Configuration.new
35
+ end
36
+
37
+ def transmit_to_api(exception)
38
+ transmitter.relay(assemble_black_box_for(exception))
39
+ end
40
+
41
+ private
42
+ def assemble_black_box_for(exception, options = {})
43
+ exception = unwrap_exception(exception)
44
+ black_box = BlackBox.new(exception: exception)
45
+ end
46
+
47
+ def unwrap_exception(exception)
48
+ if exception.respond_to?(:original_exception)
49
+ exception.original_exception
50
+ elsif exception.respond_to?(:continued_exception)
51
+ exception.continued_exception
52
+ else
53
+ exception
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,17 @@
1
+ module Errplane
2
+ class BlackBox
3
+ attr_reader :exception
4
+
5
+ def initialize(params = {})
6
+ @exception = params[:exception]
7
+ end
8
+
9
+ def to_json
10
+ {
11
+ :time => Time.now.to_i,
12
+ :message => @exception.message,
13
+ :backtrace => @exception.backtrace
14
+ }.to_json
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module Errplane
2
+ class Configuration
3
+ attr_accessor :api_key
4
+ attr_accessor :application_id
5
+
6
+ attr_accessor :logger
7
+ attr_accessor :environment_name
8
+ attr_accessor :project_root
9
+ attr_accessor :framework
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Errplane
2
+ class Rack
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ begin
9
+ response = @app.call(env)
10
+ rescue => e
11
+ Errplane.transmit_to_api(e)
12
+ raise
13
+ end
14
+
15
+ response
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Errplane
2
+ module Rails
3
+ module Middleware
4
+ module HijackRenderException
5
+ def self.included(base)
6
+ base.send(:alias_method_chain,:render_exception,:errplane)
7
+ end
8
+
9
+ def render_exception_with_errplane(env,exception)
10
+ Errplane.transmit_to_api(exception)
11
+ render_exception_without_errplane(env,exception)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,30 @@
1
+ require 'errplane'
2
+ require 'rails'
3
+
4
+ module Errplane
5
+ class Railtie < ::Rails::Railtie
6
+ rake_tasks do
7
+ end
8
+
9
+ initializer "errplane.insert_rack_middleware" do |app|
10
+ app.config.middleware.insert 0, Errplane::Rack
11
+ end
12
+
13
+ config.after_initialize do
14
+ Errplane.configure(true) do |config|
15
+ config.logger ||= ::Rails.logger
16
+ config.environment_name ||= ::Rails.env
17
+ config.project_root ||= ::Rails.root
18
+ config.framework = "Rails: #{::Rails::VERSION::STRING}"
19
+ end
20
+
21
+ if defined?(::ActionDispatch::DebugExceptions)
22
+ require 'errplane/rails/middleware/hijack_render_exception'
23
+ ::ActionDispatch::DebugExceptions.send(:include,Errplane::Rails::Middleware::HijackRenderException)
24
+ elsif defined?(::ActionDispatch::ShowExceptions)
25
+ require 'errplane/rails/middleware/hijack_render_exception'
26
+ ::ActionDispatch::ShowExceptions.send(:include,Errplane::Rails::Middleware::HijackRenderException)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ module Errplane
2
+ class Transmitter
3
+ def initialize(params = {})
4
+ end
5
+
6
+ def relay(black_box)
7
+ http = initialize_http_connection
8
+ data = black_box.to_json
9
+ response = begin
10
+ url = "/api/v1/applications/#{Errplane.configuration.application_id}/exceptions/#{Errplane.configuration.environment_name}?api_key=#{Errplane.configuration.api_key}"
11
+ ::Rails.logger.info(url)
12
+ http.post("/api/v1/applications/#{Errplane.configuration.application_id}/exceptions/#{Errplane.configuration.environment_name}?api_key=#{Errplane.configuration.api_key}", data)
13
+ rescue Exception => e
14
+ e
15
+ end
16
+ ::Rails.logger.info("Exception Data: #{data}")
17
+ ::Rails.logger.info("Exception Body: #{response.body}")
18
+ ::Rails.logger.info("Exception Response: #{response.inspect}")
19
+
20
+ case response
21
+ when Net::HTTPSuccess
22
+ # Success
23
+ else
24
+ # Failure
25
+ end
26
+ end
27
+
28
+ private
29
+ def initialize_http_connection
30
+ connection = Net::HTTP.new(API_HOST, "80")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ module Errplane
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+
3
+ class ErrplaneGenerator < Rails::Generators::Base
4
+ desc "Description:\n This creates a Rails initializer for Errplane."
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ argument :api_key,
8
+ required: false,
9
+ type: :string,
10
+ description: "API Key for your Errplane Organization"
11
+ argument :application_id,
12
+ required: false,
13
+ default: lambda { Time.now.to_s },
14
+ type: :string,
15
+ description: "API Key for your Errplane Organization"
16
+
17
+ def copy_initializer_file
18
+ template "initializer.rb", "config/initializers/errplane.rb"
19
+ end
20
+
21
+ def install
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ Errplane.configure do |config|
2
+ config.api_key = "<%= api_key %>"
3
+ config.application_id = "<%= application_id %>"
4
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe WidgetsController do
4
+ describe "#new" do
5
+ it "should raise an exception" do
6
+ expect { get :new }.to raise_error(ZeroDivisionError)
7
+ end
8
+ end
9
+
10
+ describe "#index" do
11
+ it "should not raise an exception" do
12
+ expect { get :index }.to_not raise_error
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/integration_helper"
2
+
3
+ feature "exception handling" do
4
+ describe "in an action that raises an exception" do
5
+ scenario "should make an HTTP call to the API" do
6
+ stub_request(:post, "#{Errplane::API_HOST}/exceptions").to_return(status: 200)
7
+
8
+ lambda { visit new_widget_path }.should raise_error
9
+
10
+ assert_requested :post, "#{Errplane::API_HOST}/api/v1/applications/#{Errplane.configuration.application_id}/exceptions/test?api_key=f123-e456-d789c012"
11
+ end
12
+ end
13
+
14
+ describe "in an action that does not raise an exception" do
15
+ scenario "should not make an HTTP call to the API" do
16
+ lambda { visit widgets_path }.should_not raise_error
17
+
18
+ assert_not_requested :post, "#{Errplane::API_HOST}/api/v1/applications/#{Errplane.configuration.application_id}/exceptions/test?api_key=f123-e456-d789c012"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,9 @@
1
+ class WidgetsController < ApplicationController
2
+ def index
3
+ render :nothing => true
4
+ end
5
+
6
+ def new
7
+ return 1/0
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/combustion_test.sqlite
@@ -0,0 +1,4 @@
1
+ Errplane.configure do |config|
2
+ config.api_key = "f123-e456-d789c012"
3
+ config.application_id = "b12r8c72"
4
+ end
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resources :widgets
3
+ end
@@ -0,0 +1,3 @@
1
+ ActiveRecord::Schema.define do
2
+ #
3
+ end
@@ -0,0 +1 @@
1
+ *.log
File without changes
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ require 'capybara/rspec'
7
+ require 'webmock/rspec'
8
+
9
+ Combustion.initialize!
10
+
11
+ require 'rspec/rails'
12
+ require 'capybara/rails'
13
+
14
+ RSpec.configure do |config|
15
+ config.use_transactional_fixtures = true
16
+ end
17
+
18
+ class Combustion::Application < Rails::Application
19
+ config.action_dispatch.show_exceptions = false
20
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Errplane::BlackBox do
4
+ before do
5
+ begin
6
+ 1/0
7
+ rescue Exception => e
8
+ @exception = e
9
+ end
10
+ end
11
+
12
+ describe ".new" do
13
+ it "should create a new BlackBox" do
14
+ black_box = Errplane::BlackBox.new
15
+ end
16
+
17
+ it "should accept an exception as a parameter" do
18
+
19
+ black_box = Errplane::BlackBox.new(exception: @exception)
20
+ black_box.should_not be_nil
21
+ end
22
+ end
23
+
24
+ describe "#to_json" do
25
+ it "should return a JSON string" do
26
+ black_box = Errplane::BlackBox.new(exception: @exception)
27
+ json = JSON.parse(black_box.to_json)
28
+
29
+ json["message"].should == "divided by 0"
30
+ json["time"].should_not be_nil
31
+ json["backtrace"].should_not be_nil
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: errplane
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Todd Persen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-08 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: This gem provides exception reporting with Errplane for Rails 3.x applications.
15
+ email:
16
+ - todd@errplane.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - .rvmrc
23
+ - Gemfile
24
+ - README.md
25
+ - Rakefile
26
+ - config.ru
27
+ - errplane.gemspec
28
+ - lib/errplane.rb
29
+ - lib/errplane/black_box.rb
30
+ - lib/errplane/configuration.rb
31
+ - lib/errplane/rack.rb
32
+ - lib/errplane/rails/middleware/hijack_render_exception.rb
33
+ - lib/errplane/railtie.rb
34
+ - lib/errplane/transmitter.rb
35
+ - lib/errplane/version.rb
36
+ - lib/rails/generators/errplane/errplane_generator.rb
37
+ - lib/rails/generators/errplane/templates/initializer.rb
38
+ - spec/controllers/widgets_controller_spec.rb
39
+ - spec/integration/exceptions_spec.rb
40
+ - spec/integration/integration_helper.rb
41
+ - spec/internal/app/controllers/application_controller.rb
42
+ - spec/internal/app/controllers/widgets_controller.rb
43
+ - spec/internal/config/database.yml
44
+ - spec/internal/config/initializers/errplane.rb
45
+ - spec/internal/config/routes.rb
46
+ - spec/internal/db/combustion_test.sqlite
47
+ - spec/internal/db/schema.rb
48
+ - spec/internal/log/.gitignore
49
+ - spec/internal/public/favicon.ico
50
+ - spec/spec_helper.rb
51
+ - spec/unit/black_box_spec.rb
52
+ homepage: http://errplane.com
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project: errplane
72
+ rubygems_version: 1.8.24
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Rails exception reporting for Errplane.
76
+ test_files:
77
+ - spec/controllers/widgets_controller_spec.rb
78
+ - spec/integration/exceptions_spec.rb
79
+ - spec/integration/integration_helper.rb
80
+ - spec/internal/app/controllers/application_controller.rb
81
+ - spec/internal/app/controllers/widgets_controller.rb
82
+ - spec/internal/config/database.yml
83
+ - spec/internal/config/initializers/errplane.rb
84
+ - spec/internal/config/routes.rb
85
+ - spec/internal/db/combustion_test.sqlite
86
+ - spec/internal/db/schema.rb
87
+ - spec/internal/log/.gitignore
88
+ - spec/internal/public/favicon.ico
89
+ - spec/spec_helper.rb
90
+ - spec/unit/black_box_spec.rb