pliny 0.19.0 → 0.20.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/config_helpers.rb +25 -1
- data/lib/pliny/metrics.rb +27 -12
- data/lib/pliny/metrics/backends/logger.rb +21 -0
- data/lib/pliny/version.rb +1 -1
- data/lib/template/.env.sample.erb +1 -1
- data/lib/template/.env.test.erb +1 -1
- data/lib/template/Gemfile +1 -1
- data/lib/template/app.json.erb +1 -1
- data/lib/template/config/config.rb +1 -1
- data/lib/template/config/initializers/metrics.rb +1 -0
- data/spec/config_helpers_spec.rb +89 -10
- data/spec/helpers/serialize_spec.rb +1 -1
- data/spec/metrics/backends/logger_spec.rb +44 -0
- data/spec/metrics_spec.rb +40 -21
- data/spec/middleware/cors_spec.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 686ea485950159a4111ea7d2a0cf08d1a9945a57
|
4
|
+
data.tar.gz: 600951ff54aabd3e2cc39094b305daed9b1fb284
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f8964c9b05a857ae80961fba8551eaa8634f864faad1dc7f3305e73fbc4aeb63663e1ded6fbe7ac585042542a50d92cb7ec62b836037586d0413b17de7d512e
|
7
|
+
data.tar.gz: 5cf995f52ea9273783ec42cc4f19cb57fa7e762a6ec24cab57ca98b5653f0fcdc404f83529bebde057e95d1040ff39a58ffe3aa07f22e45953fe8831b491201c
|
data/lib/pliny.rb
CHANGED
@@ -8,6 +8,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/backends/logger"
|
11
12
|
require_relative "pliny/metrics"
|
12
13
|
require_relative "pliny/request_store"
|
13
14
|
require_relative "pliny/rollbar_logger"
|
data/lib/pliny/config_helpers.rb
CHANGED
@@ -50,13 +50,23 @@ module Pliny
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def rack_env
|
53
|
-
if
|
53
|
+
if env == "development" || env == "test"
|
54
54
|
"development"
|
55
55
|
else
|
56
56
|
"deployment"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
# DEPRECATED: pliny_env is deprecated in favour of app_env.
|
61
|
+
# See more at https://github.com/interagent/pliny/issues/277
|
62
|
+
#
|
63
|
+
# This method is kept temporary in case it is used somewhere in the app.
|
64
|
+
def pliny_env
|
65
|
+
warn "Config.pliny_env is deprecated and will be removed, " \
|
66
|
+
"use Config.app_env instead."
|
67
|
+
env
|
68
|
+
end
|
69
|
+
|
60
70
|
private
|
61
71
|
|
62
72
|
def cast(value, method)
|
@@ -70,6 +80,20 @@ module Pliny
|
|
70
80
|
instance_eval "def #{name}?; !!@#{name} end", __FILE__, __LINE__
|
71
81
|
end
|
72
82
|
end
|
83
|
+
|
84
|
+
# This method helps with transition from PLINY_ENV to APP_ENV.
|
85
|
+
def env
|
86
|
+
legacy_env || app_env
|
87
|
+
end
|
88
|
+
|
89
|
+
# PLINY_ENV is deprecated, but it might be still used by someone.
|
90
|
+
def legacy_env
|
91
|
+
if ENV.key?('PLINY_ENV')
|
92
|
+
warn "PLINY_ENV is deprecated in favour of APP_ENV, " \
|
93
|
+
"update .env file or application configuration."
|
94
|
+
ENV['PLINY_ENV']
|
95
|
+
end
|
96
|
+
end
|
73
97
|
end
|
74
98
|
|
75
99
|
module ConfigHelpers
|
data/lib/pliny/metrics.rb
CHANGED
@@ -1,29 +1,44 @@
|
|
1
1
|
module Pliny
|
2
2
|
module Metrics
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
extend self
|
4
|
+
|
5
|
+
attr_accessor :backends
|
6
|
+
|
7
|
+
@backends = [Backends::Logger]
|
8
|
+
|
9
|
+
def count(*names, value: 1)
|
10
|
+
counts = Hash[names.map { |n| ["#{Config.app_name}.#{n}", value] }]
|
11
|
+
|
12
|
+
backends.each do |backend|
|
13
|
+
report_and_catch { backend.report_counts(counts) }
|
14
|
+
end
|
15
|
+
|
16
|
+
counts
|
6
17
|
end
|
7
18
|
|
8
|
-
def
|
19
|
+
def measure(*names, &block)
|
9
20
|
elapsed, return_value = time_elapsed(&block)
|
10
|
-
measures = Hash[names.map { |n| [
|
11
|
-
|
21
|
+
measures = Hash[names.map { |n| ["#{Config.app_name}.#{n}", elapsed] }]
|
22
|
+
|
23
|
+
backends.each do |backend|
|
24
|
+
report_and_catch { backend.report_measures(measures) }
|
25
|
+
end
|
12
26
|
|
13
27
|
return_value
|
14
28
|
end
|
15
29
|
|
16
30
|
private
|
17
31
|
|
18
|
-
def
|
19
|
-
"#{type.to_s}##{Config.app_name}.#{name}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.time_elapsed(&block)
|
32
|
+
def time_elapsed(&block)
|
23
33
|
start = Time.now
|
24
34
|
return_value = block.call
|
25
35
|
[Time.now - start, return_value]
|
26
36
|
end
|
37
|
+
|
38
|
+
def report_and_catch
|
39
|
+
yield
|
40
|
+
rescue => error
|
41
|
+
Pliny.log_exception(error)
|
42
|
+
end
|
27
43
|
end
|
28
44
|
end
|
29
|
-
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pliny
|
2
|
+
module Metrics
|
3
|
+
module Backends
|
4
|
+
class Logger
|
5
|
+
def self.report_counts(counts)
|
6
|
+
Pliny.log(add_prefix(:count, counts))
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.report_measures(measures)
|
10
|
+
Pliny.log(add_prefix(:measure, measures))
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def self.add_prefix(type, metrics)
|
16
|
+
metrics.map { |k, v| [ "#{type}##{k}", v ] }.to_h
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/pliny/version.rb
CHANGED
data/lib/template/.env.test.erb
CHANGED
data/lib/template/Gemfile
CHANGED
data/lib/template/app.json.erb
CHANGED
@@ -22,7 +22,7 @@ module Config
|
|
22
22
|
override :db_pool, 5, int
|
23
23
|
override :deployment, 'production', string
|
24
24
|
override :force_ssl, true, bool
|
25
|
-
override :
|
25
|
+
override :app_env, 'production', string
|
26
26
|
override :port, 5000, int
|
27
27
|
override :pretty_json, false, bool
|
28
28
|
override :puma_max_threads, 16, int
|
@@ -0,0 +1 @@
|
|
1
|
+
Pliny::Metrics.backends = [Pliny::Metrics::Backends::Logger]
|
data/spec/config_helpers_spec.rb
CHANGED
@@ -4,49 +4,128 @@ require "pliny/config_helpers"
|
|
4
4
|
describe Pliny::CastingConfigHelpers do
|
5
5
|
|
6
6
|
describe "#rack_env" do
|
7
|
-
it "is development if
|
7
|
+
it "is development if app_env is development" do
|
8
8
|
config = Class.new do
|
9
9
|
extend Pliny::CastingConfigHelpers
|
10
|
-
override :
|
10
|
+
override :app_env, 'development', string
|
11
11
|
end
|
12
12
|
|
13
13
|
assert_equal "development", config.rack_env
|
14
14
|
end
|
15
15
|
|
16
|
-
it "is development if
|
16
|
+
it "is development if app_env is test" do
|
17
17
|
config = Class.new do
|
18
18
|
extend Pliny::CastingConfigHelpers
|
19
|
-
override :
|
19
|
+
override :app_env, 'test', string
|
20
20
|
end
|
21
21
|
|
22
22
|
assert_equal "development", config.rack_env
|
23
23
|
end
|
24
24
|
|
25
|
-
it "is deployment if
|
25
|
+
it "is deployment if app_env is production" do
|
26
26
|
config = Class.new do
|
27
27
|
extend Pliny::CastingConfigHelpers
|
28
|
-
override :
|
28
|
+
override :app_env, 'production', string
|
29
29
|
end
|
30
30
|
|
31
31
|
assert_equal "deployment", config.rack_env
|
32
32
|
end
|
33
33
|
|
34
|
-
it "is deployment if
|
34
|
+
it "is deployment if app_env is nil" do
|
35
35
|
config = Class.new do
|
36
36
|
extend Pliny::CastingConfigHelpers
|
37
|
-
override :
|
37
|
+
override :app_env, '', string
|
38
38
|
end
|
39
39
|
|
40
40
|
assert_equal "deployment", config.rack_env
|
41
41
|
end
|
42
42
|
|
43
|
-
it "is deployment if
|
43
|
+
it "is deployment if app_env is another value" do
|
44
44
|
config = Class.new do
|
45
45
|
extend Pliny::CastingConfigHelpers
|
46
|
-
override :
|
46
|
+
override :app_env, 'staging', string
|
47
47
|
end
|
48
48
|
|
49
49
|
assert_equal "deployment", config.rack_env
|
50
50
|
end
|
51
|
+
|
52
|
+
context "when legacy PLINY_ENV is still defined" do
|
53
|
+
before do
|
54
|
+
ENV['ORIGINAL_PLINY_ENV'] = ENV['PLINY_ENV']
|
55
|
+
ENV['PLINY_ENV'] = 'staging'
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
ENV['PLINY_ENV'] = ENV.delete('ORIGINAL_PLINY_ENV')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "uses PLINY_ENV value instead of APP_ENV" do
|
63
|
+
config = Class.new do
|
64
|
+
extend Pliny::CastingConfigHelpers
|
65
|
+
override :app_env, 'development', string
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_equal "deployment", config.rack_env
|
69
|
+
end
|
70
|
+
|
71
|
+
it "displays deprecation warning" do
|
72
|
+
config = Class.new do
|
73
|
+
extend Pliny::CastingConfigHelpers
|
74
|
+
override :app_env, 'development', string
|
75
|
+
end
|
76
|
+
|
77
|
+
io = StringIO.new
|
78
|
+
$stderr = io
|
79
|
+
config.rack_env
|
80
|
+
$stderr = STDERR
|
81
|
+
|
82
|
+
assert_includes io.string, "PLINY_ENV is deprecated"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#pliny_env" do
|
88
|
+
it "displays deprecation warning if pliny_env is used" do
|
89
|
+
config = Class.new do
|
90
|
+
extend Pliny::CastingConfigHelpers
|
91
|
+
override :app_env, 'development', string
|
92
|
+
end
|
93
|
+
|
94
|
+
io = StringIO.new
|
95
|
+
$stderr = io
|
96
|
+
config.pliny_env
|
97
|
+
$stderr = STDERR
|
98
|
+
|
99
|
+
assert_includes io.string, "Config.pliny_env is deprecated"
|
100
|
+
end
|
101
|
+
|
102
|
+
it "returns app_env value" do
|
103
|
+
config = Class.new do
|
104
|
+
extend Pliny::CastingConfigHelpers
|
105
|
+
override :app_env, 'foo', string
|
106
|
+
end
|
107
|
+
|
108
|
+
assert_equal "foo", config.pliny_env
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when legacy PLINY_ENV is still defined" do
|
112
|
+
before do
|
113
|
+
ENV['ORIGINAL_PLINY_ENV'] = ENV['PLINY_ENV']
|
114
|
+
ENV['PLINY_ENV'] = 'staging'
|
115
|
+
end
|
116
|
+
|
117
|
+
after do
|
118
|
+
ENV['PLINY_ENV'] = ENV.delete('ORIGINAL_PLINY_ENV')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "returns PLINY_ENV value" do
|
122
|
+
config = Class.new do
|
123
|
+
extend Pliny::CastingConfigHelpers
|
124
|
+
override :app_env, 'development', string
|
125
|
+
end
|
126
|
+
|
127
|
+
assert_equal "staging", config.pliny_env
|
128
|
+
end
|
129
|
+
end
|
51
130
|
end
|
52
131
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Pliny::Metrics::Backends::Logger do
|
4
|
+
let(:io) { double }
|
5
|
+
|
6
|
+
subject(:backend) { Pliny::Metrics::Backends::Logger }
|
7
|
+
|
8
|
+
before do
|
9
|
+
@stdout = Pliny.stdout
|
10
|
+
Pliny.stdout = io
|
11
|
+
|
12
|
+
allow(io).to receive(:print)
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
Pliny.stdout = @stdout
|
17
|
+
end
|
18
|
+
|
19
|
+
context "#count" do
|
20
|
+
it "logs a single key with a value" do
|
21
|
+
backend.report_counts('app.foo' => 1)
|
22
|
+
expect(io).to have_received(:print).with("count#app.foo=1\n")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "logs multiple keys with values" do
|
26
|
+
backend.report_counts('app.foo' => 1, 'app.bar' => 2)
|
27
|
+
expect(io).to have_received(:print).with(
|
28
|
+
"count#app.foo=1 count#app.bar=2\n")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "#measure" do
|
33
|
+
it "logs a single key with a value" do
|
34
|
+
backend.report_measures('pliny.foo' => 0.001)
|
35
|
+
expect(io).to have_received(:print).with("measure#pliny.foo=0.001\n")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "logs multiple keys with values" do
|
39
|
+
backend.report_measures('pliny.foo' => 0.3, 'pliny.bar' => 0.5)
|
40
|
+
expect(io).to have_received(:print).with(
|
41
|
+
"measure#pliny.foo=0.300 measure#pliny.bar=0.500\n")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/spec/metrics_spec.rb
CHANGED
@@ -1,61 +1,80 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Pliny::Metrics do
|
4
|
-
let(:io) { double }
|
5
|
-
|
6
4
|
subject(:metrics) { Pliny::Metrics }
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
let(:test_backend) do
|
7
|
+
double(:test_backend, report_counts: nil, report_measures: nil)
|
8
|
+
end
|
11
9
|
|
12
|
-
|
10
|
+
before do
|
13
11
|
allow(Config).to receive(:app_name).and_return('pliny')
|
14
12
|
end
|
15
13
|
|
16
|
-
|
17
|
-
|
14
|
+
around do |example|
|
15
|
+
original_backends = Pliny::Metrics.backends
|
16
|
+
begin
|
17
|
+
example.run
|
18
|
+
ensure
|
19
|
+
Pliny::Metrics.backends = original_backends
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "uses the logger as the default backend" do
|
24
|
+
assert_equal(metrics.backends, [Pliny::Metrics::Backends::Logger])
|
18
25
|
end
|
19
26
|
|
20
|
-
|
21
|
-
|
27
|
+
describe "#count" do
|
28
|
+
before { Pliny::Metrics.backends = [test_backend] }
|
29
|
+
|
30
|
+
it "sends a hash to the backend with a default value" do
|
22
31
|
metrics.count(:foo)
|
23
|
-
expect(
|
32
|
+
expect(test_backend).to have_received(:report_counts).once.with("pliny.foo" => 1)
|
24
33
|
end
|
25
34
|
|
26
|
-
it "
|
35
|
+
it "sends a hash to the backend with a provided value" do
|
27
36
|
metrics.count(:foo, value: 2)
|
28
|
-
expect(
|
37
|
+
expect(test_backend).to have_received(:report_counts).once.with("pliny.foo" => 2)
|
29
38
|
end
|
30
39
|
|
31
|
-
it "
|
40
|
+
it "sends a hash with multiple key counts to the backend" do
|
32
41
|
metrics.count(:foo, :bar)
|
33
|
-
expect(
|
34
|
-
"
|
42
|
+
expect(test_backend).to have_received(:report_counts).once.with(
|
43
|
+
"pliny.foo" => 1,
|
44
|
+
"pliny.bar" => 1
|
45
|
+
)
|
35
46
|
end
|
36
47
|
end
|
37
48
|
|
38
|
-
|
49
|
+
describe "#measure" do
|
39
50
|
before do
|
40
51
|
Timecop.freeze(Time.now)
|
52
|
+
Pliny::Metrics.backends = [test_backend]
|
41
53
|
end
|
42
54
|
|
43
55
|
it "measures a single key" do
|
44
56
|
metrics.measure(:foo) { }
|
45
|
-
expect(
|
57
|
+
expect(test_backend).to have_received(:report_measures).once.with(
|
58
|
+
"pliny.foo" => 0
|
59
|
+
)
|
46
60
|
end
|
47
61
|
|
48
62
|
it "measures a single key over a minute" do
|
49
63
|
metrics.measure(:foo) do
|
50
64
|
Timecop.travel(60)
|
51
65
|
end
|
52
|
-
|
66
|
+
|
67
|
+
expect(test_backend).to have_received(:report_measures) do |opts|
|
68
|
+
assert(60 <= opts['pliny.foo'] && opts['pliny.foo'] <= 61)
|
69
|
+
end
|
53
70
|
end
|
54
71
|
|
55
72
|
it "measures multiple keys" do
|
56
73
|
metrics.measure(:foo, :bar) { }
|
57
|
-
expect(
|
58
|
-
"
|
74
|
+
expect(test_backend).to have_received(:report_measures).once.with(
|
75
|
+
"pliny.foo" => 0,
|
76
|
+
"pliny.bar" => 0
|
77
|
+
)
|
59
78
|
end
|
60
79
|
end
|
61
80
|
end
|
@@ -17,7 +17,7 @@ describe Pliny::Middleware::CORS do
|
|
17
17
|
get "/"
|
18
18
|
assert_equal 200, last_response.status
|
19
19
|
assert_equal "hi", last_response.body
|
20
|
-
|
20
|
+
assert_nil last_response.headers["Access-Control-Allow-Origin"]
|
21
21
|
end
|
22
22
|
|
23
23
|
it "intercepts OPTION requests to render a stub (preflight request)" 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.
|
4
|
+
version: 0.20.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-
|
12
|
+
date: 2016-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -362,6 +362,7 @@ files:
|
|
362
362
|
- lib/pliny/helpers/serialize.rb
|
363
363
|
- lib/pliny/log.rb
|
364
364
|
- lib/pliny/metrics.rb
|
365
|
+
- lib/pliny/metrics/backends/logger.rb
|
365
366
|
- lib/pliny/middleware/cors.rb
|
366
367
|
- lib/pliny/middleware/instruments.rb
|
367
368
|
- lib/pliny/middleware/request_id.rb
|
@@ -408,6 +409,7 @@ files:
|
|
408
409
|
- lib/template/config/config.rb
|
409
410
|
- lib/template/config/initializers/database.rb
|
410
411
|
- lib/template/config/initializers/log.rb
|
412
|
+
- lib/template/config/initializers/metrics.rb
|
411
413
|
- lib/template/config/initializers/rollbar.rb
|
412
414
|
- lib/template/config/puma.rb
|
413
415
|
- lib/template/db/schema.sql
|
@@ -448,6 +450,7 @@ files:
|
|
448
450
|
- spec/helpers/serialize_spec.rb
|
449
451
|
- spec/integration_spec.rb
|
450
452
|
- spec/log_spec.rb
|
453
|
+
- spec/metrics/backends/logger_spec.rb
|
451
454
|
- spec/metrics_spec.rb
|
452
455
|
- spec/middleware/cors_spec.rb
|
453
456
|
- spec/middleware/instruments_spec.rb
|