pliny 0.17.1 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56651d8e3b670e7954a475c9d8cb04cc0124099f
4
- data.tar.gz: ad7701bdf942d068994be11da8b3ceb7bc231082
3
+ metadata.gz: 50ee2327594f7a24b91de1931315b9d56857a6db
4
+ data.tar.gz: 19764f159ec7799e68d4d704ff679b2101eddf43
5
5
  SHA512:
6
- metadata.gz: d73cbdd0b3dcde8423dc2743af931738bc41a5d608281a031f29a160ac9cee73d8e40a7dac34274e0b619e9b695487c464286efcd412c20e79f8e61f4b03d09d
7
- data.tar.gz: cf7bc5313022abc17ebee414f53ad004d66cd3177bee895daf8b7ba755451ee93602f41a0b128c9b1f9658cdeda1bebbf291a67a8ed2f424f8867246421978e0
6
+ metadata.gz: 9c20a3261666622c51f92614f2c4c49bd3d169b34fed20f8359ba6647a45ed4fc5bdbde260127ea9f4d6dae66a909a80bf2cc756d28845900afed16449bc5838
7
+ data.tar.gz: d29a0d1bf16fd8cc623b7ee302113cf61b131bab0d171fc41e96cef1703d6bc4c3b097b352b3b4c4b6ddb6f0a3ea88ba2fcb8fb5c4946da23f0d4e4fd4db3a4c
data/lib/pliny.rb CHANGED
@@ -2,12 +2,13 @@ require "multi_json"
2
2
  require "sinatra/base"
3
3
 
4
4
  require_relative "pliny/version"
5
- require_relative "pliny/error_reporter"
5
+ require_relative "pliny/error_reporters"
6
6
  require_relative "pliny/errors"
7
7
  require_relative "pliny/helpers/encode"
8
8
  require_relative "pliny/helpers/params"
9
9
  require_relative "pliny/helpers/serialize"
10
10
  require_relative "pliny/log"
11
+ require_relative "pliny/metrics"
11
12
  require_relative "pliny/request_store"
12
13
  require_relative "pliny/rollbar_logger"
13
14
  require_relative "pliny/router"
@@ -0,0 +1,19 @@
1
+ module Pliny::ErrorReporters
2
+ extend self
3
+
4
+ @error_reporters = []
5
+
6
+ attr_accessor :error_reporters
7
+
8
+ def notify(exception, context: {}, rack_env: {})
9
+ Pliny.log_exception(exception)
10
+
11
+ error_reporters.each do |reporter|
12
+ begin
13
+ reporter.new.notify(exception, context: context, rack_env: rack_env)
14
+ rescue
15
+ Pliny.log_exception($!)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ require 'rollbar/exception_reporter'
2
+ require 'rollbar/request_data_extractor'
3
+
4
+ module Pliny
5
+ module ErrorReporters
6
+ class Rollbar
7
+ include ::Rollbar::ExceptionReporter
8
+ include ::Rollbar::RequestDataExtractor
9
+
10
+ def notify(exception, context:, rack_env:)
11
+ ::Rollbar.reset_notifier!
12
+ scope = fetch_scope(context: context, rack_env: rack_env)
13
+ ::Rollbar.scoped(scope) do
14
+ report_exception_to_rollbar(rack_env, exception)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def fetch_scope(context:, rack_env:)
21
+ {
22
+ request: proc { extract_request_data_from_rack(rack_env) }
23
+ }
24
+ rescue Exception => e
25
+ report_exception_to_rollbar(rack_env, e)
26
+ raise
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ module Pliny
2
+ module Metrics
3
+ def self.count(*names, value: 1)
4
+ counts = Hash[names.map { |n| [metric_prefix(:count, n), value] }]
5
+ Pliny.log(counts)
6
+ end
7
+
8
+ def self.measure(*names, &block)
9
+ elapsed, return_value = time_elapsed(&block)
10
+ measures = Hash[names.map { |n| [metric_prefix(:measure, n), elapsed] }]
11
+ Pliny.log(measures)
12
+
13
+ return_value
14
+ end
15
+
16
+ private
17
+
18
+ def self.metric_prefix(type, name)
19
+ "#{type.to_s}##{Config.app_name}.#{name}"
20
+ end
21
+
22
+ def self.time_elapsed(&block)
23
+ start = Time.now
24
+ return_value = block.call
25
+ [Time.now - start, return_value]
26
+ end
27
+ end
28
+ end
29
+
@@ -12,7 +12,7 @@ module Pliny::Middleware
12
12
  rescue => e
13
13
  raise if @raise
14
14
 
15
- Pliny::ErrorReporter.notify(e, rack_env: env)
15
+ Pliny::ErrorReporters.notify(e, rack_env: env)
16
16
  Pliny::Errors::Error.render(Pliny::Errors::InternalServerError.new)
17
17
  end
18
18
  end
data/lib/pliny/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pliny
2
- VERSION = "0.17.1"
2
+ VERSION = "0.18.0"
3
3
  end
data/lib/template/Gemfile CHANGED
@@ -4,13 +4,13 @@ ruby "2.3.1"
4
4
  gem "multi_json"
5
5
  gem "oj"
6
6
  gem "pg"
7
- gem "pliny", "~> 0.17"
7
+ gem "pliny", "~> 0.18"
8
8
  gem "pry"
9
9
  gem "puma", "~> 2.16"
10
10
  gem "rack-ssl"
11
11
  gem "rack-timeout", "~> 0.4"
12
12
  gem "rake"
13
- gem "rollbar", require: "rollbar/middleware/sinatra"
13
+ gem "rollbar"
14
14
  gem "sequel", "~> 4.34"
15
15
  gem "sequel-paranoid"
16
16
  gem "sequel_pg", "~> 1.6", require: "sequel"
@@ -1,3 +1,7 @@
1
+ require 'pliny/error_reporters/rollbar'
2
+
3
+ Pliny::ErrorReporters.error_reporters << Pliny::ErrorReporters::Rollbar
4
+
1
5
  Rollbar.configure do |config|
2
6
  config.enabled = ENV.has_key?('ROLLBAR_ACCESS_TOKEN')
3
7
  config.disable_rack_monkey_patch = true
@@ -1,9 +1,10 @@
1
-
2
1
  require "spec_helper"
3
2
 
4
- describe Pliny::ErrorReporter do
3
+ describe Pliny::ErrorReporters do
5
4
  subject(:reporter) { described_class }
6
5
 
6
+ let(:reporter_double) { double("reporter").as_null_object }
7
+
7
8
  describe ".notify" do
8
9
  let(:exception) { RuntimeError.new }
9
10
  let(:context) { { context: "foo" } }
@@ -13,12 +14,18 @@ describe Pliny::ErrorReporter do
13
14
  reporter.notify(exception, context: context, rack_env: rack_env)
14
15
  end
15
16
 
16
- it "notifies rollbar" do
17
- expect_any_instance_of(Pliny::ErrorReporter::RollbarReporter).
18
- to receive(:notify).
19
- with(exception, context: context, rack_env: rack_env)
17
+ before do
18
+ Pliny::ErrorReporters.error_reporters << reporter_double
20
19
 
20
+ allow(reporter_double).to receive(:notify)
21
+ end
22
+
23
+ it "notifies rollbar" do
21
24
  notify_reporter
25
+
26
+ expect(reporter_double).to have_received(:notify)
27
+ .once
28
+ .with(exception, context: context, rack_env: rack_env)
22
29
  end
23
30
  end
24
31
  end
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+
3
+ describe Pliny::Metrics do
4
+ let(:io) { double }
5
+
6
+ subject(:metrics) { Pliny::Metrics }
7
+
8
+ before do
9
+ Pliny.stdout = io
10
+
11
+ allow(io).to receive(:print)
12
+ allow(Config).to receive(:app_name).and_return('pliny')
13
+ end
14
+
15
+ context "#count" do
16
+ it "counts a single key with a default value" do
17
+ metrics.count(:foo)
18
+ expect(io).to have_received(:print).with("count#pliny.foo=1\n")
19
+ end
20
+
21
+ it "counts a single key with a provided value" do
22
+ metrics.count(:foo, value: 2)
23
+ expect(io).to have_received(:print).with("count#pliny.foo=2\n")
24
+ end
25
+
26
+ it "counts multiple keys" do
27
+ metrics.count(:foo, :bar)
28
+ expect(io).to have_received(:print).with(
29
+ "count#pliny.foo=1 count#pliny.bar=1\n")
30
+ end
31
+ end
32
+
33
+ context "#measure" do
34
+ before do
35
+ Timecop.freeze(Time.now)
36
+ end
37
+
38
+ it "measures a single key" do
39
+ metrics.measure(:foo) { }
40
+ expect(io).to have_received(:print).with("measure#pliny.foo=0.000\n")
41
+ end
42
+
43
+ it "measures a single key over a minute" do
44
+ metrics.measure(:foo) do
45
+ Timecop.travel(60)
46
+ end
47
+ expect(io).to have_received(:print).with("measure#pliny.foo=60.000\n")
48
+ end
49
+
50
+ it "measures multiple keys" do
51
+ metrics.measure(:foo, :bar) { }
52
+ expect(io).to have_received(:print).with(
53
+ "measure#pliny.foo=0.000 measure#pliny.bar=0.000\n")
54
+ end
55
+ end
56
+ end
@@ -28,7 +28,7 @@ describe Pliny::Middleware::RescueErrors do
28
28
 
29
29
  it "intercepts exceptions and renders" do
30
30
  @app = new_rack_app
31
- expect(Pliny::ErrorReporter).to receive(:notify)
31
+ expect(Pliny::ErrorReporters).to receive(:notify)
32
32
  get "/"
33
33
  assert_equal 500, last_response.status
34
34
  error_json = MultiJson.decode(last_response.body)
data/spec/router_spec.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Pliny::Router do
4
-
5
4
  describe "specifying a version" do
6
5
  def app
7
6
  Rack::Builder.new do
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.17.1
4
+ version: 0.18.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-06-20 00:00:00.000000000 Z
12
+ date: 2016-08-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -354,12 +354,14 @@ files:
354
354
  - lib/pliny/commands/updater.rb
355
355
  - lib/pliny/config_helpers.rb
356
356
  - lib/pliny/db_support.rb
357
- - lib/pliny/error_reporter.rb
357
+ - lib/pliny/error_reporters.rb
358
+ - lib/pliny/error_reporters/rollbar.rb
358
359
  - lib/pliny/errors.rb
359
360
  - lib/pliny/helpers/encode.rb
360
361
  - lib/pliny/helpers/params.rb
361
362
  - lib/pliny/helpers/serialize.rb
362
363
  - lib/pliny/log.rb
364
+ - lib/pliny/metrics.rb
363
365
  - lib/pliny/middleware/cors.rb
364
366
  - lib/pliny/middleware/instruments.rb
365
367
  - lib/pliny/middleware/request_id.rb
@@ -439,12 +441,13 @@ files:
439
441
  - spec/commands/updater_spec.rb
440
442
  - spec/config_helpers_spec.rb
441
443
  - spec/db_support_spec.rb
442
- - spec/error_reporter_spec.rb
444
+ - spec/error_reporters_spec.rb
443
445
  - spec/errors_spec.rb
444
446
  - spec/helpers/encode_spec.rb
445
447
  - spec/helpers/serialize_spec.rb
446
448
  - spec/integration_spec.rb
447
449
  - spec/log_spec.rb
450
+ - spec/metrics_spec.rb
448
451
  - spec/middleware/cors_spec.rb
449
452
  - spec/middleware/instruments_spec.rb
450
453
  - spec/middleware/request_id_spec.rb
@@ -1,42 +0,0 @@
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