pliny 0.16.3 → 0.17.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/lib/pliny.rb +1 -0
- data/lib/pliny/error_reporter.rb +42 -0
- data/lib/pliny/log.rb +40 -2
- data/lib/pliny/middleware/rescue_errors.rb +4 -17
- data/lib/pliny/version.rb +1 -1
- data/lib/template/.ruby-version +1 -1
- data/lib/template/Gemfile +4 -4
- data/lib/template/config.ru +1 -0
- data/lib/template/config/config.rb +12 -13
- data/lib/template/config/initializers/rollbar.rb +1 -0
- data/lib/template/lib/routes.rb +0 -1
- data/spec/error_reporter_spec.rb +24 -0
- data/spec/log_spec.rb +8 -0
- data/spec/middleware/rescue_errors_spec.rb +1 -0
- data/spec/spec_helper.rb +1 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a23d5c9332e98aa75fbe6d56ec858314aeafe88
|
4
|
+
data.tar.gz: 832352cd2b15849d452783fa87638b4d8fc7fa68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: caef1b86bf0355f08804ff6d771dc3fb93f8520fc77332a5dd1dd25aad319d70802356198772a12cc70191f0118a6bf1747c50f0dd0362f958b2ff674e828260
|
7
|
+
data.tar.gz: 4253d293b4fac10cdd17d4291ffb77e44fa11c7fd5e31ada8caa0ce15997a7825eb86ad2b779e8658d7ee7e195cb47c5693fc72859dde4f79c3daa8ee2019ea0
|
data/lib/pliny.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rollbar/exception_reporter'
|
2
|
+
require 'rollbar/request_data_extractor'
|
3
|
+
|
4
|
+
class Pliny::ErrorReporter
|
5
|
+
def self.notify(exception, context: {}, rack_env: {})
|
6
|
+
Pliny.log_exception(exception)
|
7
|
+
|
8
|
+
REPORTERS.each do |reporter|
|
9
|
+
begin
|
10
|
+
reporter.new.notify(exception, context: context, rack_env: rack_env)
|
11
|
+
rescue
|
12
|
+
Pliny.log_exception($!)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class RollbarReporter
|
18
|
+
include ::Rollbar::ExceptionReporter
|
19
|
+
include ::Rollbar::RequestDataExtractor
|
20
|
+
|
21
|
+
def notify(exception, context:, rack_env:)
|
22
|
+
Rollbar.reset_notifier!
|
23
|
+
scope = fetch_scope(context: context, rack_env: rack_env)
|
24
|
+
Rollbar.scoped(scope) do
|
25
|
+
report_exception_to_rollbar(rack_env, exception)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def fetch_scope(context:, rack_env:)
|
32
|
+
{
|
33
|
+
request: proc { extract_request_data_from_rack(rack_env) }
|
34
|
+
}
|
35
|
+
rescue Exception => e
|
36
|
+
report_exception_to_rollbar(rack_env, e)
|
37
|
+
raise
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
REPORTERS = [RollbarReporter]
|
42
|
+
end
|
data/lib/pliny/log.rb
CHANGED
@@ -1,8 +1,34 @@
|
|
1
1
|
module Pliny
|
2
2
|
module Log
|
3
3
|
def log(data, &block)
|
4
|
-
|
5
|
-
|
4
|
+
log_to_stream(stdout || $stdout, merge_log_contexts(data), &block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def log_exception(e, data = {})
|
8
|
+
exception_id = e.object_id
|
9
|
+
|
10
|
+
# Log backtrace in reverse order for easier digestion.
|
11
|
+
if e.backtrace
|
12
|
+
e.backtrace.reverse.each do |backtrace|
|
13
|
+
log_to_stream(stderr || $stderr, merge_log_contexts(
|
14
|
+
exception_id: exception_id,
|
15
|
+
backtrace: backtrace
|
16
|
+
))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# then log the exception message last so that it's as close to the end of
|
21
|
+
# a log trace as possible
|
22
|
+
data.merge!(
|
23
|
+
exception: true,
|
24
|
+
class: e.class.name,
|
25
|
+
message: e.message,
|
26
|
+
exception_id: exception_id
|
27
|
+
)
|
28
|
+
|
29
|
+
data[:status] = e.status if e.respond_to?(:status)
|
30
|
+
|
31
|
+
log_to_stream(stderr || $stderr, merge_log_contexts(data))
|
6
32
|
end
|
7
33
|
|
8
34
|
def context(data, &block)
|
@@ -30,8 +56,20 @@ module Pliny
|
|
30
56
|
@stdout
|
31
57
|
end
|
32
58
|
|
59
|
+
def stderr=(stream)
|
60
|
+
@stderr = stream
|
61
|
+
end
|
62
|
+
|
63
|
+
def stderr
|
64
|
+
@stderr
|
65
|
+
end
|
66
|
+
|
33
67
|
private
|
34
68
|
|
69
|
+
def merge_log_contexts(data)
|
70
|
+
default_context.merge(log_context.merge(local_context.merge(data)))
|
71
|
+
end
|
72
|
+
|
35
73
|
def local_context
|
36
74
|
RequestStore.store[:local_context] ||= {}
|
37
75
|
end
|
@@ -8,25 +8,12 @@ module Pliny::Middleware
|
|
8
8
|
def call(env)
|
9
9
|
@app.call(env)
|
10
10
|
rescue Pliny::Errors::Error => e
|
11
|
-
# blank out this field so that the error is not picked up by Rollbar
|
12
|
-
env["sinatra.error"] = nil
|
13
|
-
|
14
11
|
Pliny::Errors::Error.render(e)
|
15
|
-
rescue
|
16
|
-
if @raise
|
17
|
-
raise
|
18
|
-
else
|
19
|
-
dump_error(e, env)
|
20
|
-
Pliny::Errors::Error.render(Pliny::Errors::InternalServerError.new)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
12
|
+
rescue => e
|
13
|
+
raise if @raise
|
25
14
|
|
26
|
-
|
27
|
-
|
28
|
-
message = ["#{e.class} - #{e.message}:", *e.backtrace].join("\n\t")
|
29
|
-
env['rack.errors'].puts(message)
|
15
|
+
Pliny::ErrorReporter.notify(e, rack_env: env)
|
16
|
+
Pliny::Errors::Error.render(Pliny::Errors::InternalServerError.new)
|
30
17
|
end
|
31
18
|
end
|
32
19
|
end
|
data/lib/pliny/version.rb
CHANGED
data/lib/template/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.1
|
data/lib/template/Gemfile
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
|
-
ruby "2.3.
|
2
|
+
ruby "2.3.1"
|
3
3
|
|
4
4
|
gem "multi_json"
|
5
5
|
gem "oj"
|
6
6
|
gem "pg"
|
7
|
-
gem "pliny", "~> 0.
|
7
|
+
gem "pliny", "~> 0.17"
|
8
8
|
gem "pry"
|
9
|
-
gem "puma", "~> 2.
|
9
|
+
gem "puma", "~> 2.16"
|
10
10
|
gem "rack-ssl"
|
11
11
|
gem "rack-timeout", "~> 0.4"
|
12
12
|
gem "rake"
|
13
13
|
gem "rollbar", require: "rollbar/middleware/sinatra"
|
14
|
-
gem "sequel", "~> 4.
|
14
|
+
gem "sequel", "~> 4.34"
|
15
15
|
gem "sequel-paranoid"
|
16
16
|
gem "sequel_pg", "~> 1.6", require: "sequel"
|
17
17
|
gem "sinatra", "~> 1.4", require: "sinatra/base"
|
data/lib/template/config.ru
CHANGED
@@ -14,23 +14,22 @@ module Config
|
|
14
14
|
|
15
15
|
# Optional -- value is returned or `nil` if it wasn't present.
|
16
16
|
optional :app_name, string
|
17
|
-
optional :placeholder, string
|
18
17
|
optional :versioning_default, string
|
19
18
|
optional :versioning_app_name, string
|
20
19
|
|
21
20
|
# Override -- value is returned or the set default.
|
22
|
-
override :database_timeout, 10,
|
23
|
-
override :db_pool, 5,
|
21
|
+
override :database_timeout, 10, int
|
22
|
+
override :db_pool, 5, int
|
24
23
|
override :deployment, 'production', string
|
25
|
-
override :force_ssl, true,
|
26
|
-
override :pliny_env, '
|
27
|
-
override :port, 5000,
|
28
|
-
override :pretty_json, false,
|
29
|
-
override :puma_max_threads, 16,
|
30
|
-
override :puma_min_threads, 1,
|
31
|
-
override :puma_workers, 3,
|
32
|
-
override :raise_errors, false,
|
24
|
+
override :force_ssl, true, bool
|
25
|
+
override :pliny_env, 'production', string
|
26
|
+
override :port, 5000, int
|
27
|
+
override :pretty_json, false, bool
|
28
|
+
override :puma_max_threads, 16, int
|
29
|
+
override :puma_min_threads, 1, int
|
30
|
+
override :puma_workers, 3, int
|
31
|
+
override :raise_errors, false, bool
|
33
32
|
override :root, File.expand_path("../../", __FILE__), string
|
34
|
-
override :timeout, 10,
|
35
|
-
override :versioning, false,
|
33
|
+
override :timeout, 10, int
|
34
|
+
override :versioning, false, bool
|
36
35
|
end
|
data/lib/template/lib/routes.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Pliny::ErrorReporter do
|
5
|
+
subject(:reporter) { described_class }
|
6
|
+
|
7
|
+
describe ".notify" do
|
8
|
+
let(:exception) { RuntimeError.new }
|
9
|
+
let(:context) { { context: "foo" } }
|
10
|
+
let(:rack_env) { { rack_env: "bar" } }
|
11
|
+
|
12
|
+
subject(:notify_reporter) do
|
13
|
+
reporter.notify(exception, context: context, rack_env: rack_env)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "notifies rollbar" do
|
17
|
+
any_instance_of(Pliny::ErrorReporter::RollbarReporter) do |klass|
|
18
|
+
stub(klass).notify(exception, context: context, rack_env: rack_env)
|
19
|
+
end
|
20
|
+
|
21
|
+
notify_reporter
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/log_spec.rb
CHANGED
@@ -4,6 +4,7 @@ describe Pliny::Log do
|
|
4
4
|
before do
|
5
5
|
@io = StringIO.new
|
6
6
|
Pliny.stdout = @io
|
7
|
+
Pliny.stderr = @io
|
7
8
|
stub(@io).print
|
8
9
|
end
|
9
10
|
|
@@ -73,4 +74,11 @@ describe Pliny::Log do
|
|
73
74
|
end
|
74
75
|
Pliny.log(foo: "bar")
|
75
76
|
end
|
77
|
+
|
78
|
+
it "logs exceptions" do
|
79
|
+
Pliny::RequestStore.store[:log_context] = { app: "pliny" }
|
80
|
+
e = RuntimeError.new
|
81
|
+
mock(@io).print "app=pliny exception class=RuntimeError message=RuntimeError exception_id=#{e.object_id}\n"
|
82
|
+
Pliny.log_exception(e)
|
83
|
+
end
|
76
84
|
end
|
@@ -28,6 +28,7 @@ describe Pliny::Middleware::RescueErrors do
|
|
28
28
|
|
29
29
|
it "intercepts exceptions and renders" do
|
30
30
|
@app = new_rack_app
|
31
|
+
mock(Pliny::ErrorReporter).notify.with_any_args
|
31
32
|
get "/"
|
32
33
|
assert_equal 500, last_response.status
|
33
34
|
error_json = MultiJson.decode(last_response.body)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pliny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandur Leach
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-05-
|
12
|
+
date: 2016-05-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -305,6 +305,26 @@ dependencies:
|
|
305
305
|
- - ">="
|
306
306
|
- !ruby/object:Gem::Version
|
307
307
|
version: 0.17.1
|
308
|
+
- !ruby/object:Gem::Dependency
|
309
|
+
name: rollbar
|
310
|
+
requirement: !ruby/object:Gem::Requirement
|
311
|
+
requirements:
|
312
|
+
- - "~>"
|
313
|
+
- !ruby/object:Gem::Version
|
314
|
+
version: '2.11'
|
315
|
+
- - ">="
|
316
|
+
- !ruby/object:Gem::Version
|
317
|
+
version: 2.11.0
|
318
|
+
type: :development
|
319
|
+
prerelease: false
|
320
|
+
version_requirements: !ruby/object:Gem::Requirement
|
321
|
+
requirements:
|
322
|
+
- - "~>"
|
323
|
+
- !ruby/object:Gem::Version
|
324
|
+
version: '2.11'
|
325
|
+
- - ">="
|
326
|
+
- !ruby/object:Gem::Version
|
327
|
+
version: 2.11.0
|
308
328
|
- !ruby/object:Gem::Dependency
|
309
329
|
name: sequel
|
310
330
|
requirement: !ruby/object:Gem::Requirement
|
@@ -354,6 +374,7 @@ files:
|
|
354
374
|
- lib/pliny/commands/updater.rb
|
355
375
|
- lib/pliny/config_helpers.rb
|
356
376
|
- lib/pliny/db_support.rb
|
377
|
+
- lib/pliny/error_reporter.rb
|
357
378
|
- lib/pliny/errors.rb
|
358
379
|
- lib/pliny/helpers/encode.rb
|
359
380
|
- lib/pliny/helpers/params.rb
|
@@ -438,6 +459,7 @@ files:
|
|
438
459
|
- spec/commands/updater_spec.rb
|
439
460
|
- spec/config_helpers_spec.rb
|
440
461
|
- spec/db_support_spec.rb
|
462
|
+
- spec/error_reporter_spec.rb
|
441
463
|
- spec/errors_spec.rb
|
442
464
|
- spec/helpers/encode_spec.rb
|
443
465
|
- spec/helpers/serialize_spec.rb
|