pliny 0.19.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|