roqua-support 0.1.16 → 0.1.17
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/CHANGELOG.md +5 -0
- data/Gemfile.lock +3 -1
- data/lib/roqua-support/version.rb +1 -1
- data/lib/roqua/support.rb +12 -2
- data/lib/roqua/support/instrumentation.rb +31 -0
- data/lib/roqua/support/request_logger.rb +2 -2
- data/lib/roqua/support/stats.rb +28 -0
- data/lib/roqua/support/stats/hosted_graphite_backend.rb +13 -0
- data/roqua-support.gemspec +1 -0
- data/spec/roqua/support/helpers_spec.rb +50 -0
- data/spec/roqua/support/{logging_spec.rb → logwrapper_spec.rb} +1 -20
- data/spec/roqua/support/request_logger_spec.rb +1 -1
- data/spec/roqua/support/stats_spec.rb +18 -0
- metadata +25 -5
- data/lib/roqua/support/logging.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a54ca79cd7b20e4121b8aa54b9d707ef1418680
|
4
|
+
data.tar.gz: e06d9c5eadc2fd970adaa4ef0c7602e485c743df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3eefb5cab8aaa04bd445f57d24535baf4247a28fdb081f93f14241cb39e9533699191d7e70fea13c9ff90bbc7202609b433ee85d216c656cc4837279a2f9f4f
|
7
|
+
data.tar.gz: 856eb8e8a015bf97ce6b88aea46c0008a8045d60900301dd8e8e5c4f7a55b29ca6e450cd592c5a113d4019488bfb128e0957a291780a51fbc8aee4b57c3a2373
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roqua-support (0.1.
|
4
|
+
roqua-support (0.1.17)
|
5
5
|
activesupport (>= 3.2, < 5.0)
|
6
|
+
naught (~> 1.0)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
@@ -61,6 +62,7 @@ GEM
|
|
61
62
|
lumberjack (1.0.9)
|
62
63
|
method_source (0.8.2)
|
63
64
|
minitest (5.4.2)
|
65
|
+
naught (1.0.0)
|
64
66
|
pry (0.10.1)
|
65
67
|
coderay (~> 1.1.0)
|
66
68
|
method_source (~> 0.8.1)
|
data/lib/roqua/support.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'logger'
|
2
|
-
require 'roqua/support/
|
2
|
+
require 'roqua/support/instrumentation'
|
3
|
+
require 'roqua/support/log_wrapper'
|
3
4
|
require 'roqua/support/errors'
|
5
|
+
require 'roqua/support/stats'
|
4
6
|
|
5
7
|
module Roqua
|
6
8
|
class << self
|
@@ -19,5 +21,13 @@ module Roqua
|
|
19
21
|
def logger=(logger)
|
20
22
|
@logger = LogWrapper.new(logger)
|
21
23
|
end
|
24
|
+
|
25
|
+
def stats
|
26
|
+
@stats ||= Stats.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def stats=(stats)
|
30
|
+
@stats = stats
|
31
|
+
end
|
22
32
|
end
|
23
|
-
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'active_support/core_ext/module/aliasing'
|
2
|
+
require 'roqua/support/log_wrapper'
|
3
|
+
|
4
|
+
module Roqua
|
5
|
+
module Support
|
6
|
+
module Instrumentation
|
7
|
+
def with_instrumentation(message, options = {})
|
8
|
+
started_at = Time.now.to_f
|
9
|
+
Roqua.logger.info("#{message}:started", options)
|
10
|
+
value = yield
|
11
|
+
finished_at = Time.now.to_f
|
12
|
+
duration = finished_at - started_at
|
13
|
+
Roqua.logger.info("#{message}:finished", {duration: duration}.merge(options))
|
14
|
+
Roqua.stats.submit("#{message}.finished", 1)
|
15
|
+
Roqua.stats.submit("#{message}.duration", duration)
|
16
|
+
value
|
17
|
+
rescue => e
|
18
|
+
Roqua.logger.error("#{message}:failed", {exception: e.class.name, message: e.message}.merge(options))
|
19
|
+
Roqua.stats.submit("#{message}.failed", 1)
|
20
|
+
raise
|
21
|
+
end
|
22
|
+
|
23
|
+
def eventlog
|
24
|
+
Roqua.logger
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Roqua::Logging is deprecated, this will keep it alive for now
|
30
|
+
Logging = Support::Instrumentation
|
31
|
+
end
|
@@ -11,7 +11,7 @@ module Roqua
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class RequestLogger < ActiveSupport::LogSubscriber
|
14
|
-
include Roqua::
|
14
|
+
include Roqua::Support::Instrumentation
|
15
15
|
|
16
16
|
def process_action(event)
|
17
17
|
payload = event.payload
|
@@ -105,4 +105,4 @@ module Roqua
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
end
|
108
|
-
end
|
108
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'naught'
|
2
|
+
|
3
|
+
module Roqua
|
4
|
+
module Support
|
5
|
+
class Stats
|
6
|
+
NullBackend = Naught.build do |config|
|
7
|
+
config.singleton
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :backend
|
11
|
+
|
12
|
+
def initialize(backend = NullBackend.instance)
|
13
|
+
@backend = backend
|
14
|
+
end
|
15
|
+
|
16
|
+
# Report a value to the stats backend
|
17
|
+
def submit(key, value)
|
18
|
+
backend.submit(prefix(key), value)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def prefix(key)
|
24
|
+
"#{Roqua.appname}.#{key}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/roqua-support.gemspec
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'roqua/support/instrumentation'
|
2
|
+
|
3
|
+
describe 'Helper methods' do
|
4
|
+
describe '#with_instrumentation' do
|
5
|
+
include Roqua::Support::Instrumentation
|
6
|
+
|
7
|
+
let(:logger) { double("Logger", info: nil, error: nil) }
|
8
|
+
let(:stats) { double("Stats", submit: nil) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(Roqua).to receive(:logger).and_return(logger)
|
12
|
+
allow(Roqua).to receive(:stats).and_return(stats)
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when the block returns a value' do
|
16
|
+
it 'logs the start and finish lifecycle of a block' do
|
17
|
+
expect(logger).to receive(:info).with('testevent:started', {extra: "params"}).ordered
|
18
|
+
expect(logger).to receive(:info).with('testevent:finished', hash_including({extra: "params"})).ordered
|
19
|
+
expect(stats).to receive(:submit).with('testevent.finished', 1)
|
20
|
+
expect(stats).to receive(:submit).with('testevent.duration', an_instance_of(Float))
|
21
|
+
|
22
|
+
with_instrumentation('testevent', extra: 'params') { 1 + 1 }
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns the value returned by the block' do
|
26
|
+
with_instrumentation('testevent') { 1 + 1 }.should == 2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when an exception happens during the block' do
|
31
|
+
it 'logs the start and failure of a block if it raises' do
|
32
|
+
expect(logger).to receive(:info).with('testevent:started', instance_of(Hash)).ordered
|
33
|
+
expect(logger).to receive(:error).with('testevent:failed', instance_of(Hash)).ordered
|
34
|
+
expect(stats).to receive(:submit).with('testevent.failed', 1)
|
35
|
+
|
36
|
+
with_instrumentation 'testevent' do
|
37
|
+
raise StandardError, "Foo"
|
38
|
+
end rescue nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'reraises the exception' do
|
42
|
+
expect {
|
43
|
+
with_instrumentation 'testevent' do
|
44
|
+
raise "Foo"
|
45
|
+
end
|
46
|
+
}.to raise_error('Foo')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'roqua/support/
|
1
|
+
require 'roqua/support/log_wrapper'
|
2
2
|
require 'logger'
|
3
3
|
require 'stringio'
|
4
4
|
|
@@ -65,24 +65,5 @@ module Roqua
|
|
65
65
|
}.to raise_error('Foo')
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
69
|
-
describe '.lifecycle' do
|
70
|
-
it 'wraps given method' do
|
71
|
-
::Roqua.stub(:logger => logwrapper)
|
72
|
-
|
73
|
-
test = Class.new do
|
74
|
-
include Logging
|
75
|
-
|
76
|
-
def foo
|
77
|
-
'bar'
|
78
|
-
end
|
79
|
-
log :foo, 'roqua.testevent.foo'
|
80
|
-
end
|
81
|
-
|
82
|
-
test.new.foo.should == 'bar'
|
83
|
-
log.should include('roqua.testevent.foo:started')
|
84
|
-
log.should include('roqua.testevent.foo:finished')
|
85
|
-
end
|
86
|
-
end
|
87
68
|
end
|
88
69
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'roqua/support/stats'
|
3
|
+
|
4
|
+
describe 'Stats' do
|
5
|
+
let(:backend) { double("StatsBackend") }
|
6
|
+
let(:stats) { Roqua::Support::Stats.new(backend) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
Roqua.appname = 'appname'
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'tracking a value' do
|
13
|
+
it 'reports to backend' do
|
14
|
+
expect(backend).to receive(:submit).with('appname.data_export.duration', 2.3)
|
15
|
+
stats.submit('data_export.duration', 2.3)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roqua-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marten Veldthuis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '5.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: naught
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: bundler
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,9 +123,11 @@ files:
|
|
109
123
|
- lib/roqua/support.rb
|
110
124
|
- lib/roqua/support/command_runner.rb
|
111
125
|
- lib/roqua/support/errors.rb
|
126
|
+
- lib/roqua/support/instrumentation.rb
|
112
127
|
- lib/roqua/support/log_wrapper.rb
|
113
|
-
- lib/roqua/support/logging.rb
|
114
128
|
- lib/roqua/support/request_logger.rb
|
129
|
+
- lib/roqua/support/stats.rb
|
130
|
+
- lib/roqua/support/stats/hosted_graphite_backend.rb
|
115
131
|
- roqua-support.gemspec
|
116
132
|
- spec/roqua/core_ext/active_interaction/date_time_as_unix_extension_spec.rb
|
117
133
|
- spec/roqua/core_ext/active_interaction/duration_filter_spec.rb
|
@@ -123,8 +139,10 @@ files:
|
|
123
139
|
- spec/roqua/responders/active_interaction_aware_responder_spec.rb
|
124
140
|
- spec/roqua/responders/api_errors_responder_spec.rb
|
125
141
|
- spec/roqua/support/errors_spec.rb
|
126
|
-
- spec/roqua/support/
|
142
|
+
- spec/roqua/support/helpers_spec.rb
|
143
|
+
- spec/roqua/support/logwrapper_spec.rb
|
127
144
|
- spec/roqua/support/request_logger_spec.rb
|
145
|
+
- spec/roqua/support/stats_spec.rb
|
128
146
|
- spec/roqua/support_spec.rb
|
129
147
|
- spec/spec_helper.rb
|
130
148
|
homepage: https://github.com/roqua/roqua-support
|
@@ -162,7 +180,9 @@ test_files:
|
|
162
180
|
- spec/roqua/responders/active_interaction_aware_responder_spec.rb
|
163
181
|
- spec/roqua/responders/api_errors_responder_spec.rb
|
164
182
|
- spec/roqua/support/errors_spec.rb
|
165
|
-
- spec/roqua/support/
|
183
|
+
- spec/roqua/support/helpers_spec.rb
|
184
|
+
- spec/roqua/support/logwrapper_spec.rb
|
166
185
|
- spec/roqua/support/request_logger_spec.rb
|
186
|
+
- spec/roqua/support/stats_spec.rb
|
167
187
|
- spec/roqua/support_spec.rb
|
168
188
|
- spec/spec_helper.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/module/aliasing'
|
2
|
-
require 'roqua/support/log_wrapper'
|
3
|
-
|
4
|
-
module Roqua
|
5
|
-
module Logging
|
6
|
-
def self.included(base)
|
7
|
-
base.extend ClassMethods
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
def log(method_name, message, options = {})
|
12
|
-
define_method(:"#{method_name}_with_log") do |*args, &block|
|
13
|
-
eventlog.lifecycle(message, options) do
|
14
|
-
send(:"#{method_name}_without_log", *args, &block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
alias_method_chain method_name, 'log'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def eventlog
|
23
|
-
Roqua.logger
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|