l2meter 0.0.9 → 0.1.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/l2meter.rb +5 -4
- data/lib/l2meter/configuration.rb +22 -21
- data/lib/l2meter/emitter.rb +20 -11
- data/lib/l2meter/thread_safe.rb +41 -0
- data/lib/l2meter/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f503003e9477cf9593c912bbe56e0ec5732e5888
|
4
|
+
data.tar.gz: 5c0f2b7eeb06f8600b8a9204a397f46457dfea51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70852339270abfbf8abcf19a5b287e92cb7244e496e5aad7a1bb64598feb9e12e4dc0e7bd888887eb3bf84ec7c1661f82ecf31602c472a4484f529259e87e8a1
|
7
|
+
data.tar.gz: cd3cb10da8ccb5c15a6576d81812689dc4c7d6a04781613caa9f2f647b13033f595e48b0639a1ff08dac37162d5e6b2d24c2acf5a7487a16ef9e12b618819fdf
|
data/lib/l2meter.rb
CHANGED
@@ -6,10 +6,11 @@ module L2meter
|
|
6
6
|
autoload :Configuration, "l2meter/configuration"
|
7
7
|
autoload :Emitter, "l2meter/emitter"
|
8
8
|
autoload :NullObject, "l2meter/null_object"
|
9
|
+
autoload :ThreadSafe, "l2meter/thread_safe"
|
9
10
|
|
10
|
-
def build
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def build(configuration: Configuration.new)
|
12
|
+
yield configuration if block_given?
|
13
|
+
emitter = Emitter.new(configuration: configuration.freeze)
|
14
|
+
ThreadSafe.new(emitter)
|
14
15
|
end
|
15
16
|
end
|
@@ -2,51 +2,52 @@ module L2meter
|
|
2
2
|
class Configuration
|
3
3
|
attr_writer :output
|
4
4
|
attr_accessor :source, :prefix
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :context, :key_formatter, :value_formatter, :output
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
DEFAULT_KEY_FORMATTER = ->(key) do
|
8
|
+
key.to_s.strip.downcase.gsub(/[^-a-z\d.#]+/, ?-)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
DEFAULT_VALUE_FORMATTER = ->(value) do
|
12
|
+
value = value.to_s
|
13
|
+
value =~ /\s/ ? value.inspect : value
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
private_constant :DEFAULT_KEY_FORMATTER, :DEFAULT_VALUE_FORMATTER
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@sort = false
|
20
|
+
@key_formatter = DEFAULT_KEY_FORMATTER
|
21
|
+
@value_formatter = DEFAULT_VALUE_FORMATTER
|
22
|
+
@output = $stdout
|
19
23
|
end
|
20
24
|
|
21
25
|
def format_keys(&block)
|
22
26
|
@key_formatter = block
|
23
27
|
end
|
24
28
|
|
25
|
-
def value_formatter
|
26
|
-
@value_formatter ||= ->(value) do
|
27
|
-
value = value.to_s
|
28
|
-
value =~ /\s/ ? value.inspect : value
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
29
|
def format_values(&block)
|
33
30
|
@value_formatter = block
|
34
31
|
end
|
35
32
|
|
36
33
|
def sort?
|
37
|
-
|
34
|
+
@sort
|
38
35
|
end
|
39
36
|
|
40
37
|
def sort=(value)
|
41
|
-
@
|
38
|
+
@sort = !!value
|
42
39
|
end
|
43
40
|
|
44
|
-
def context
|
45
|
-
|
41
|
+
def context
|
42
|
+
if block_given?
|
43
|
+
@context = Proc.new
|
44
|
+
else
|
45
|
+
@context
|
46
|
+
end
|
46
47
|
end
|
47
48
|
|
48
49
|
def context=(block_or_value)
|
49
|
-
@
|
50
|
+
@context = block_or_value
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
data/lib/l2meter/emitter.rb
CHANGED
@@ -5,6 +5,8 @@ module L2meter
|
|
5
5
|
def initialize(configuration: Configuration.new)
|
6
6
|
@configuration = configuration
|
7
7
|
@start_times = []
|
8
|
+
@contexts = []
|
9
|
+
@outputs = []
|
8
10
|
end
|
9
11
|
|
10
12
|
def log(*args)
|
@@ -26,11 +28,10 @@ module L2meter
|
|
26
28
|
end
|
27
29
|
|
28
30
|
def silence
|
29
|
-
|
30
|
-
configuration.output = NullObject.new
|
31
|
+
@outputs.push NullObject.new
|
31
32
|
yield
|
32
33
|
ensure
|
33
|
-
|
34
|
+
@outputs.pop
|
34
35
|
end
|
35
36
|
|
36
37
|
def measure(metric, value, unit: nil)
|
@@ -50,10 +51,14 @@ module L2meter
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def context(hash_or_proc)
|
53
|
-
|
54
|
+
@contexts.push hash_or_proc
|
54
55
|
yield
|
55
56
|
ensure
|
56
|
-
|
57
|
+
@contexts.pop
|
58
|
+
end
|
59
|
+
|
60
|
+
def clone
|
61
|
+
self.class.new(configuration: configuration)
|
57
62
|
end
|
58
63
|
|
59
64
|
private
|
@@ -81,12 +86,8 @@ module L2meter
|
|
81
86
|
params.merge(elapsed: "%.4fs" % elapsed)
|
82
87
|
end
|
83
88
|
|
84
|
-
def configuration_contexts
|
85
|
-
configuration.contexts
|
86
|
-
end
|
87
|
-
|
88
89
|
def current_context
|
89
|
-
|
90
|
+
contexts_queue.inject({}) do |result, c|
|
90
91
|
current = c.respond_to?(:call) ? c.call.to_h : c.clone
|
91
92
|
result.merge(current)
|
92
93
|
end.to_a.reverse.to_h
|
@@ -113,7 +114,7 @@ module L2meter
|
|
113
114
|
|
114
115
|
tokens.sort! if configuration.sort?
|
115
116
|
|
116
|
-
|
117
|
+
output_queue.last.print tokens.join(" ") + "\n"
|
117
118
|
end
|
118
119
|
|
119
120
|
def log_with_prefix(method, key, value, unit: nil)
|
@@ -150,5 +151,13 @@ module L2meter
|
|
150
151
|
ensure
|
151
152
|
return [ result, caught_exception, Time.now - time_at_start ]
|
152
153
|
end
|
154
|
+
|
155
|
+
def contexts_queue
|
156
|
+
[ configuration.context, *@contexts ].compact
|
157
|
+
end
|
158
|
+
|
159
|
+
def output_queue
|
160
|
+
[ configuration.output, *@outputs ].compact
|
161
|
+
end
|
153
162
|
end
|
154
163
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module L2meter
|
2
|
+
# This class is a wrapper around Emitter that makes sure that we have a
|
3
|
+
# completely separate clone of Emitter per thread running. It doesn't truly
|
4
|
+
# make Emitter thread-safe, it makes sure that you don't access the same
|
5
|
+
# instance of emitter from different threads.
|
6
|
+
class ThreadSafe
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
EMITTER_METHODS = %i[
|
10
|
+
configuration
|
11
|
+
context
|
12
|
+
count
|
13
|
+
log
|
14
|
+
measure
|
15
|
+
sample
|
16
|
+
silence
|
17
|
+
unique
|
18
|
+
with_elapsed
|
19
|
+
]
|
20
|
+
|
21
|
+
private_constant :EMITTER_METHODS
|
22
|
+
|
23
|
+
def initialize(emitter)
|
24
|
+
@emitter = emitter.freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
def_delegators :current_emitter, *EMITTER_METHODS
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :emitter
|
32
|
+
|
33
|
+
def current_emitter
|
34
|
+
Thread.current[thread_key] ||= emitter.clone
|
35
|
+
end
|
36
|
+
|
37
|
+
def thread_key
|
38
|
+
@thread_key ||= "_l2meter_emitter_#{emitter.object_id}".freeze
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/l2meter/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: l2meter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Pravosud
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- lib/l2meter/configuration.rb
|
24
24
|
- lib/l2meter/emitter.rb
|
25
25
|
- lib/l2meter/null_object.rb
|
26
|
+
- lib/l2meter/thread_safe.rb
|
26
27
|
- lib/l2meter/version.rb
|
27
28
|
homepage: https://github.com/heroku/l2meter
|
28
29
|
licenses:
|
@@ -44,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
44
45
|
version: '0'
|
45
46
|
requirements: []
|
46
47
|
rubyforge_project:
|
47
|
-
rubygems_version: 2.4.
|
48
|
+
rubygems_version: 2.4.5.1
|
48
49
|
signing_key:
|
49
50
|
specification_version: 4
|
50
51
|
summary: L2met friendly log formatter
|