betterlog 1.1.1 → 2.0.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/.all_images.yml +17 -0
- data/.tool-versions +1 -1
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/betterlog.gemspec +9 -5
- data/lib/betterlog/global_metadata.rb +17 -6
- data/lib/betterlog/log/event.rb +19 -41
- data/lib/betterlog/log.rb +12 -50
- data/lib/betterlog/log_event_formatter.rb +1 -0
- data/lib/betterlog/notifiers.rb +5 -3
- data/lib/betterlog/version.rb +1 -1
- data/spec/betterlog/global_metadata_spec.rb +70 -14
- data/spec/betterlog/log_spec.rb +14 -101
- data/spec/spec_helper.rb +1 -1
- metadata +32 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 41bb65aafa33ccbe83390a1d8a4a68a98f9a88ff94c50de62b71afe32f81fac2
|
|
4
|
+
data.tar.gz: e4c9c13fdb23f7448744ef34dfd6667cb1ce8de6a6e8dda6017ccbf874d19fd2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 55b3b6f9ac7ed4d641902c798cb6c372c082302c2a3a8b93373b333055168e7647f90229c285a287b886d5f90d8cd09ef4c49fefa268e720cd25b3f6590a902b
|
|
7
|
+
data.tar.gz: 96415752787e2ac1e3345bdfa448fdb6f752dad4d338d0ef940473c7596c167635ea9e5660ef7d8313af3a1201ae2efd21a80a92eb6838f25cbaa37e1051853d
|
data/.all_images.yml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
dockerfile: |-
|
|
2
|
+
RUN apk add --no-cache build-base git
|
|
3
|
+
RUN gem update --system
|
|
4
|
+
RUN gem install gem_hadar bundler
|
|
5
|
+
|
|
6
|
+
script: &script |-
|
|
7
|
+
echo -e "\e[1m"
|
|
8
|
+
ruby -v
|
|
9
|
+
echo -e "\e[0m"
|
|
10
|
+
bundle
|
|
11
|
+
rake spec
|
|
12
|
+
|
|
13
|
+
fail_fast: yes
|
|
14
|
+
|
|
15
|
+
images:
|
|
16
|
+
ruby:3.2-alpine: *script
|
|
17
|
+
ruby:3.1-alpine: *script
|
data/.tool-versions
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
ruby 3.1.
|
|
1
|
+
ruby 3.1.4
|
|
2
2
|
bundler 2.3.17
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2.0.0
|
data/betterlog.gemspec
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
# stub: betterlog
|
|
2
|
+
# stub: betterlog 2.0.0 ruby lib
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = "betterlog".freeze
|
|
6
|
-
s.version = "
|
|
6
|
+
s.version = "2.0.0"
|
|
7
7
|
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
9
9
|
s.require_paths = ["lib".freeze]
|
|
10
10
|
s.authors = ["betterplace Developers".freeze]
|
|
11
|
-
s.date = "2023-08-
|
|
11
|
+
s.date = "2023-08-17"
|
|
12
12
|
s.description = "This library provides structure json logging for our rails projects".freeze
|
|
13
13
|
s.email = "developers@betterplace.org".freeze
|
|
14
14
|
s.executables = ["betterlog".freeze]
|
|
15
15
|
s.extra_rdoc_files = ["README.md".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/notifiers.rb".freeze, "lib/betterlog/railtie.rb".freeze, "lib/betterlog/version.rb".freeze]
|
|
16
|
-
s.files = [".github/workflows/codeql-analysis.yml".freeze, ".gitignore".freeze, ".semaphore/semaphore.yml".freeze, ".tool-versions".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "betterlog.gemspec".freeze, "bin/betterlog".freeze, "config/log.yml".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/notifiers.rb".freeze, "lib/betterlog/railtie.rb".freeze, "lib/betterlog/version.rb".freeze, "spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/version_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
|
16
|
+
s.files = [".all_images.yml".freeze, ".github/workflows/codeql-analysis.yml".freeze, ".gitignore".freeze, ".semaphore/semaphore.yml".freeze, ".tool-versions".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "betterlog.gemspec".freeze, "bin/betterlog".freeze, "config/log.yml".freeze, "lib/betterlog.rb".freeze, "lib/betterlog/global_metadata.rb".freeze, "lib/betterlog/log.rb".freeze, "lib/betterlog/log/event.rb".freeze, "lib/betterlog/log/event_formatter.rb".freeze, "lib/betterlog/log/severity.rb".freeze, "lib/betterlog/log_event_formatter.rb".freeze, "lib/betterlog/notifiers.rb".freeze, "lib/betterlog/railtie.rb".freeze, "lib/betterlog/version.rb".freeze, "spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/version_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
|
17
17
|
s.homepage = "http://github.com/betterplace/betterlog".freeze
|
|
18
18
|
s.rdoc_options = ["--title".freeze, "Betterlog".freeze, "--main".freeze, "README.md".freeze]
|
|
19
|
-
s.rubygems_version = "3.3.
|
|
19
|
+
s.rubygems_version = "3.3.26".freeze
|
|
20
20
|
s.summary = "Structured logging support for bp".freeze
|
|
21
21
|
s.test_files = ["spec/betterlog/global_metadata_spec.rb".freeze, "spec/betterlog/log/event_spec.rb".freeze, "spec/betterlog/log/severity_spec.rb".freeze, "spec/betterlog/log_event_formatter_spec.rb".freeze, "spec/betterlog/log_spec.rb".freeze, "spec/betterlog/version_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
|
22
22
|
|
|
@@ -29,6 +29,8 @@ Gem::Specification.new do |s|
|
|
|
29
29
|
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
|
30
30
|
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
|
31
31
|
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
32
|
+
s.add_development_dependency(%q<debug>.freeze, [">= 0"])
|
|
33
|
+
s.add_development_dependency(%q<all_images>.freeze, [">= 0"])
|
|
32
34
|
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.3", ">= 1.22.0"])
|
|
33
35
|
s.add_runtime_dependency(%q<complex_config>.freeze, [">= 0"])
|
|
34
36
|
s.add_runtime_dependency(%q<file-tail>.freeze, ["~> 1.0"])
|
|
@@ -41,6 +43,8 @@ Gem::Specification.new do |s|
|
|
|
41
43
|
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
|
42
44
|
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
|
43
45
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
46
|
+
s.add_dependency(%q<debug>.freeze, [">= 0"])
|
|
47
|
+
s.add_dependency(%q<all_images>.freeze, [">= 0"])
|
|
44
48
|
s.add_dependency(%q<tins>.freeze, ["~> 1.3", ">= 1.22.0"])
|
|
45
49
|
s.add_dependency(%q<complex_config>.freeze, [">= 0"])
|
|
46
50
|
s.add_dependency(%q<file-tail>.freeze, ["~> 1.0"])
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
# To retrieve thread-global metadata that is used to enrich data that is sent
|
|
2
2
|
# to logging and debugging tools. In addition to holding the data
|
|
3
|
-
# thread-global, this will also attempt to update
|
|
3
|
+
# thread-global, this will also attempt to update current of error reporting
|
|
4
4
|
# tools etc.
|
|
5
5
|
|
|
6
6
|
module Betterlog
|
|
7
7
|
class GlobalMetadata
|
|
8
8
|
include Tins::SexySingleton
|
|
9
9
|
|
|
10
|
-
thread_local(:
|
|
10
|
+
thread_local(:current) { {} }
|
|
11
11
|
|
|
12
|
-
def add(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Notifiers.context(data_hash)
|
|
12
|
+
def add(data)
|
|
13
|
+
data = data.symbolize_keys_recursive
|
|
14
|
+
self.current = data | current
|
|
16
15
|
self
|
|
17
16
|
end
|
|
17
|
+
|
|
18
|
+
def remove(data)
|
|
19
|
+
keys = data.ask_and_send_or_self(:keys).map(&:to_sym)
|
|
20
|
+
keys.each { current.delete(_1) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def with_context(data = {})
|
|
24
|
+
add data
|
|
25
|
+
yield current.dup.freeze
|
|
26
|
+
ensure
|
|
27
|
+
remove data
|
|
28
|
+
end
|
|
18
29
|
end
|
|
19
30
|
end
|
data/lib/betterlog/log/event.rb
CHANGED
|
@@ -3,42 +3,23 @@ module Betterlog
|
|
|
3
3
|
class Event
|
|
4
4
|
require 'socket'
|
|
5
5
|
|
|
6
|
-
def self.ify(arg,
|
|
7
|
-
|
|
6
|
+
def self.ify(arg, **rest)
|
|
7
|
+
rest = rest.symbolize_keys_recursive(circular: :circular)
|
|
8
8
|
if e = arg.ask_and_send(:exception)
|
|
9
|
-
|
|
9
|
+
new(
|
|
10
10
|
{
|
|
11
11
|
error_class: e.class.name,
|
|
12
12
|
message: "#{e.class.name}: #{e.message}",
|
|
13
13
|
backtrace: e.backtrace,
|
|
14
|
-
},
|
|
15
|
-
severity: severity,
|
|
16
|
-
rest: rest,
|
|
17
|
-
notify: notify,
|
|
18
|
-
)
|
|
19
|
-
elsif s = arg.ask_and_send(:to_str)
|
|
20
|
-
new(
|
|
21
|
-
({ notify: s } if notify).to_h |
|
|
22
|
-
{
|
|
23
|
-
message: s,
|
|
24
|
-
severity: severity,
|
|
25
14
|
} | rest
|
|
26
15
|
)
|
|
27
|
-
elsif
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
arg
|
|
32
|
-
)
|
|
16
|
+
elsif message = arg.ask_and_send(:to_str)
|
|
17
|
+
new({ message: } | rest)
|
|
18
|
+
elsif hash = arg.ask_and_send(:to_hash)
|
|
19
|
+
new(hash | rest)
|
|
33
20
|
else
|
|
34
21
|
message = "Logging #{arg.inspect}"
|
|
35
|
-
new(
|
|
36
|
-
({ notify: message } if notify).to_h |
|
|
37
|
-
{
|
|
38
|
-
message: message,
|
|
39
|
-
severity: severity,
|
|
40
|
-
} | rest
|
|
41
|
-
)
|
|
22
|
+
new({ message: } | rest)
|
|
42
23
|
end
|
|
43
24
|
end
|
|
44
25
|
|
|
@@ -57,16 +38,16 @@ module Betterlog
|
|
|
57
38
|
end
|
|
58
39
|
|
|
59
40
|
def initialize(data = {})
|
|
60
|
-
data = data.symbolize_keys_recursive(circular: :circular)
|
|
61
|
-
unless data.key?(:message)
|
|
62
|
-
data[:message] = "a #{data[:type]} type log message of severity #{data[:severity]}"
|
|
63
|
-
end
|
|
41
|
+
data = compute_data(data.symbolize_keys_recursive(circular: :circular))
|
|
64
42
|
data[:severity] =
|
|
65
43
|
begin
|
|
66
44
|
Severity.new((data[:severity] || :debug))
|
|
67
45
|
rescue
|
|
68
46
|
Severity.new(:debug)
|
|
69
47
|
end
|
|
48
|
+
unless data.key?(:message)
|
|
49
|
+
data[:message] = "a #{data[:type]} type log message of severity #{data[:severity]}"
|
|
50
|
+
end
|
|
70
51
|
@data = Hash[data.sort_by(&:first)]
|
|
71
52
|
end
|
|
72
53
|
|
|
@@ -124,8 +105,8 @@ module Betterlog
|
|
|
124
105
|
|
|
125
106
|
private
|
|
126
107
|
|
|
127
|
-
def
|
|
128
|
-
|
|
108
|
+
def compute_data(data)
|
|
109
|
+
d = data | {
|
|
129
110
|
timestamp: Time.now.utc.iso8601(3),
|
|
130
111
|
pid: $$,
|
|
131
112
|
program: File.basename($0),
|
|
@@ -133,15 +114,12 @@ module Betterlog
|
|
|
133
114
|
type: 'rails',
|
|
134
115
|
facility: 'local0',
|
|
135
116
|
host: (Socket.gethostname rescue nil),
|
|
136
|
-
thread_id:
|
|
117
|
+
thread_id: Thread.current.object_id,
|
|
137
118
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
m |= Sidekiq::Context.current&.symbolize_keys_recursive
|
|
143
|
-
end
|
|
144
|
-
m
|
|
119
|
+
d[:meta] ||= {}
|
|
120
|
+
d[:meta] |= (GlobalMetadata.current |
|
|
121
|
+
(Sidekiq::Context.current&.symbolize_keys_recursive if defined?(Sidekiq::Context)))
|
|
122
|
+
d
|
|
145
123
|
end
|
|
146
124
|
end
|
|
147
125
|
end
|
data/lib/betterlog/log.rb
CHANGED
|
@@ -26,7 +26,8 @@ module Betterlog
|
|
|
26
26
|
# @return [ Log ] this object itself.
|
|
27
27
|
def info(object, **rest)
|
|
28
28
|
protect do
|
|
29
|
-
|
|
29
|
+
rest = { severity: __method__ } | rest
|
|
30
|
+
emit Log::Event.ify(object, **rest)
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
|
|
@@ -37,7 +38,8 @@ module Betterlog
|
|
|
37
38
|
# @return [ Log ] this object itself.
|
|
38
39
|
def warn(object, **rest)
|
|
39
40
|
protect do
|
|
40
|
-
|
|
41
|
+
rest = { severity: __method__ } | rest
|
|
42
|
+
emit Log::Event.ify(object, **rest)
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
|
|
@@ -48,7 +50,8 @@ module Betterlog
|
|
|
48
50
|
# @return [ Log ] this object itself.
|
|
49
51
|
def debug(object, **rest)
|
|
50
52
|
protect do
|
|
51
|
-
|
|
53
|
+
rest = { severity: __method__ } | rest
|
|
54
|
+
emit Log::Event.ify(object, **rest)
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
|
|
@@ -59,7 +62,8 @@ module Betterlog
|
|
|
59
62
|
# @return [ Log ] this object itself.
|
|
60
63
|
def error(object, **rest)
|
|
61
64
|
protect do
|
|
62
|
-
|
|
65
|
+
rest = { severity: __method__ } | rest
|
|
66
|
+
emit Log::Event.ify(object, **rest)
|
|
63
67
|
end
|
|
64
68
|
end
|
|
65
69
|
|
|
@@ -70,7 +74,8 @@ module Betterlog
|
|
|
70
74
|
# @return [ Log ] this object itself.
|
|
71
75
|
def fatal(object, **rest)
|
|
72
76
|
protect do
|
|
73
|
-
|
|
77
|
+
rest = { severity: __method__ } | rest
|
|
78
|
+
emit Log::Event.ify(object, **rest)
|
|
74
79
|
end
|
|
75
80
|
end
|
|
76
81
|
|
|
@@ -82,51 +87,12 @@ module Betterlog
|
|
|
82
87
|
# @return [ Log ] this object itself.
|
|
83
88
|
def output(object, **rest)
|
|
84
89
|
protect do
|
|
85
|
-
emit Log::Event.ify(object,
|
|
90
|
+
emit Log::Event.ify(object, **rest)
|
|
86
91
|
end
|
|
87
92
|
end
|
|
88
93
|
|
|
89
|
-
# Logs a metric on severity debug, by default, this can be changed by passing
|
|
90
|
-
# the severity: keyword. +name+ is for example 'Donation.Confirmation' and
|
|
91
|
-
# +value+ can be any value, but has to be somewhat consistent in terms of
|
|
92
|
-
# structure with +name+ to allow for correct
|
|
93
|
-
# evaluation.
|
|
94
|
-
#
|
|
95
|
-
# @param name the name of the recorded metric.
|
|
96
|
-
# @param value of the recorded metric, defaults to duration if block was given.
|
|
97
|
-
# @param success a Proc with parameter +result+ that returns true iff block
|
|
98
|
-
# result was asuccessful
|
|
99
|
-
# @param **rest additional rest is logged as well.
|
|
100
|
-
# @return [ Log ] this object itself.
|
|
101
94
|
def metric(name:, value: nil, success: -> result { true }, **rest, &block)
|
|
102
|
-
|
|
103
|
-
rescue => error
|
|
104
|
-
e = Log::Event.ify(error)
|
|
105
|
-
rest |= e.as_json.subhash(:error_class, :backtrace, :message)
|
|
106
|
-
rest[:message] = "#{rest[:message].inspect} while measuring metric #{name}"
|
|
107
|
-
raise error
|
|
108
|
-
ensure
|
|
109
|
-
protect do
|
|
110
|
-
if timed_duration
|
|
111
|
-
rest[:duration] = timed_duration
|
|
112
|
-
end
|
|
113
|
-
event = build_metric(
|
|
114
|
-
name: name,
|
|
115
|
-
value: value || timed_duration,
|
|
116
|
-
success: success.(result),
|
|
117
|
-
**rest
|
|
118
|
-
)
|
|
119
|
-
emit event
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def context(data_hash)
|
|
124
|
-
GlobalMetadata.add data_hash
|
|
125
|
-
self
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def self.context(data_hash)
|
|
129
|
-
instance.context(data_hash)
|
|
95
|
+
warn "#{self.class}##{__method__} is deprecated"
|
|
130
96
|
end
|
|
131
97
|
|
|
132
98
|
def emit(event)
|
|
@@ -140,8 +106,6 @@ module Betterlog
|
|
|
140
106
|
notify(event)
|
|
141
107
|
logger.send(event.severity.to_sym, JSON.generate(event))
|
|
142
108
|
self
|
|
143
|
-
ensure
|
|
144
|
-
GlobalMetadata.data.clear
|
|
145
109
|
end
|
|
146
110
|
|
|
147
111
|
private
|
|
@@ -163,7 +127,6 @@ module Betterlog
|
|
|
163
127
|
end
|
|
164
128
|
|
|
165
129
|
def build_metric(name:, value:, **rest)
|
|
166
|
-
severity = rest.fetch(:severity, :info)
|
|
167
130
|
rest |= {
|
|
168
131
|
message: "a metric #{name}=#{value}",
|
|
169
132
|
}
|
|
@@ -173,7 +136,6 @@ module Betterlog
|
|
|
173
136
|
value: value,
|
|
174
137
|
type: 'metric'
|
|
175
138
|
} | rest,
|
|
176
|
-
severity: severity
|
|
177
139
|
)
|
|
178
140
|
end
|
|
179
141
|
|
data/lib/betterlog/notifiers.rb
CHANGED
|
@@ -13,15 +13,17 @@ module Betterlog
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def self.notify(event)
|
|
16
|
+
event.notify? or return
|
|
16
17
|
notifiers.each do |notifier|
|
|
17
|
-
|
|
18
|
+
context(event.as_json)
|
|
19
|
+
notifier.notify(event[:message], event.as_json)
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
def self.context(
|
|
23
|
+
def self.context(data)
|
|
22
24
|
notifiers.each do |notifier|
|
|
23
25
|
notifier.respond_to?(:context) or next
|
|
24
|
-
notifier.context(
|
|
26
|
+
notifier.context(data)
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
end
|
data/lib/betterlog/version.rb
CHANGED
|
@@ -1,6 +1,72 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Betterlog::GlobalMetadata do
|
|
4
|
+
describe '.add' do
|
|
5
|
+
it 'can add to context' do
|
|
6
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
7
|
+
Betterlog::GlobalMetadata.add(
|
|
8
|
+
'foo' => 'bar',
|
|
9
|
+
)
|
|
10
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar')
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '.remove' do
|
|
15
|
+
it 'can remove by hash' do
|
|
16
|
+
Betterlog::GlobalMetadata.add(
|
|
17
|
+
'foo' => 'bar',
|
|
18
|
+
)
|
|
19
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar')
|
|
20
|
+
Betterlog::GlobalMetadata.remove(
|
|
21
|
+
'foo' => 'bar',
|
|
22
|
+
)
|
|
23
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'can remove by array' do
|
|
27
|
+
Betterlog::GlobalMetadata.add(
|
|
28
|
+
'foo' => 'bar',
|
|
29
|
+
)
|
|
30
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar')
|
|
31
|
+
Betterlog::GlobalMetadata.remove(%i[ foo ])
|
|
32
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe '.with_context' do
|
|
37
|
+
it 'can add to context and remove it' do
|
|
38
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
39
|
+
Betterlog::GlobalMetadata.with_context(
|
|
40
|
+
'foo' => 'bar',
|
|
41
|
+
:bar => 'foo',
|
|
42
|
+
) do |my_context|
|
|
43
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar', bar: 'foo')
|
|
44
|
+
expect(my_context).to eq(foo: 'bar', bar: 'foo')
|
|
45
|
+
expect(my_context).to be_frozen
|
|
46
|
+
end
|
|
47
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'can add to nested context and remove it' do
|
|
51
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
52
|
+
Betterlog::GlobalMetadata.with_context(
|
|
53
|
+
'foo' => 'bar',
|
|
54
|
+
:bar => 'foo',
|
|
55
|
+
) do |my_context|
|
|
56
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar', bar: 'foo')
|
|
57
|
+
expect(my_context).to eq(foo: 'bar', bar: 'foo')
|
|
58
|
+
expect(my_context).to be_frozen
|
|
59
|
+
Betterlog::GlobalMetadata.with_context('quux' => 'quark') do |my_context|
|
|
60
|
+
expect(my_context).to be_frozen
|
|
61
|
+
expect(Betterlog::GlobalMetadata.current).to eq(foo: 'bar', bar: 'foo', quux: 'quark')
|
|
62
|
+
expect(my_context).to eq(foo: 'bar', bar: 'foo', quux: 'quark')
|
|
63
|
+
end
|
|
64
|
+
expect(my_context).to eq(foo: 'bar', bar: 'foo')
|
|
65
|
+
end
|
|
66
|
+
expect(Betterlog::GlobalMetadata.current).to be_empty
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
4
70
|
class FakeNotifierClass
|
|
5
71
|
def notify(message, hash) end
|
|
6
72
|
|
|
@@ -16,25 +82,15 @@ describe Betterlog::GlobalMetadata do
|
|
|
16
82
|
example.run
|
|
17
83
|
ensure
|
|
18
84
|
Betterlog::Notifiers.notifiers.clear
|
|
19
|
-
described_class.
|
|
85
|
+
described_class.current.clear
|
|
20
86
|
end
|
|
21
87
|
|
|
22
88
|
it 'can haz empty data' do
|
|
23
|
-
expect(described_class.
|
|
89
|
+
expect(described_class.current).to eq({})
|
|
24
90
|
end
|
|
25
91
|
|
|
26
92
|
it 'can haz some data' do
|
|
27
|
-
described_class.
|
|
28
|
-
expect(described_class.
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it 'can "add" data' do
|
|
32
|
-
expect_any_instance_of(FakeNotifierClass).to receive(:context).with(foo: 'bar')
|
|
33
|
-
expect(described_class.add(foo: 'bar')).to eq described_class.instance
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it 'can "add" data via Log.context' do
|
|
37
|
-
expect_any_instance_of(FakeNotifierClass).to receive(:context).with(foo: 'bar')
|
|
38
|
-
Betterlog::Log.context(foo: 'bar')
|
|
93
|
+
described_class.current |= { foo: 'bar' }
|
|
94
|
+
expect(described_class.current).to eq({ foo: 'bar' })
|
|
39
95
|
end
|
|
40
96
|
end
|
data/spec/betterlog/log_spec.rb
CHANGED
|
@@ -78,6 +78,8 @@ describe Betterlog::Log do
|
|
|
78
78
|
let :notifier do
|
|
79
79
|
Class.new do
|
|
80
80
|
def notify(message, hash) end
|
|
81
|
+
|
|
82
|
+
def context(data) end
|
|
81
83
|
end.new
|
|
82
84
|
end
|
|
83
85
|
|
|
@@ -103,9 +105,19 @@ describe Betterlog::Log do
|
|
|
103
105
|
it 'can send explicit notifications with additional hash values' do
|
|
104
106
|
expect(notifier).to receive(:notify).with(
|
|
105
107
|
'test',
|
|
106
|
-
hash_including(
|
|
108
|
+
hash_including(meta: { foo: 'bar' }),
|
|
107
109
|
)
|
|
108
|
-
Log.info({ message: 'test', foo: 'bar' }, notify: true)
|
|
110
|
+
Log.info({ message: 'test', meta: { foo: 'bar' } }, notify: true)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'can send notifications with additional hash values for context' do
|
|
114
|
+
expect(notifier).to receive(:notify).with(
|
|
115
|
+
'test',
|
|
116
|
+
hash_including(meta: { foo: 'bar' }),
|
|
117
|
+
)
|
|
118
|
+
Betterlog::GlobalMetadata.with_context(foo: 'bar') do
|
|
119
|
+
Log.info('test', notify: true)
|
|
120
|
+
end
|
|
109
121
|
end
|
|
110
122
|
|
|
111
123
|
it 'can send explicit notifications for exceptions' do
|
|
@@ -147,103 +159,4 @@ describe Betterlog::Log do
|
|
|
147
159
|
Log.error(exception, foo: 'bar')
|
|
148
160
|
end
|
|
149
161
|
end
|
|
150
|
-
|
|
151
|
-
describe '#metric' do
|
|
152
|
-
after do
|
|
153
|
-
Time.dummy = nil
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
it 'logs metrics with a specific structure on info log level' do
|
|
157
|
-
expected_event = Log::Event.new(
|
|
158
|
-
message: 'a metric controller.action=0.123',
|
|
159
|
-
name: 'controller.action',
|
|
160
|
-
value: 0.123,
|
|
161
|
-
success: true,
|
|
162
|
-
type: 'metric',
|
|
163
|
-
severity: 'info'
|
|
164
|
-
)
|
|
165
|
-
expect(instance).to receive(:emit).with(expected_event)
|
|
166
|
-
Log.metric(name: 'controller.action', value: 0.123)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
it 'logs metrics on a given log level' do
|
|
170
|
-
expected_event = Log::Event.new(
|
|
171
|
-
message: 'a metric controller.action=0.123',
|
|
172
|
-
name: 'controller.action',
|
|
173
|
-
value: 0.123,
|
|
174
|
-
success: true,
|
|
175
|
-
type: 'metric',
|
|
176
|
-
severity: :info,
|
|
177
|
-
)
|
|
178
|
-
expect(instance).to receive(:emit).with(expected_event)
|
|
179
|
-
Log.metric(severity: :info, name: 'controller.action', value: 0.123)
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
it 'logs metrics with additional data' do
|
|
183
|
-
expected_event = Log::Event.new(
|
|
184
|
-
message: 'a metric controller.action=0.123',
|
|
185
|
-
foo: 'bar',
|
|
186
|
-
name: 'controller.action',
|
|
187
|
-
value: 0.123,
|
|
188
|
-
success: true,
|
|
189
|
-
type: 'metric',
|
|
190
|
-
severity: 'info'
|
|
191
|
-
)
|
|
192
|
-
expect(instance).to receive(:emit).with(expected_event)
|
|
193
|
-
Log.metric(name: 'controller.action', value: 0.123, foo: 'bar')
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
it 'can be sent after measuring times' do
|
|
197
|
-
expected_event = Log::Event.new(
|
|
198
|
-
message: 'a metric foo=10.0',
|
|
199
|
-
name: 'foo',
|
|
200
|
-
value: 10.0,
|
|
201
|
-
success: true,
|
|
202
|
-
duration: 10.0,
|
|
203
|
-
timestamp: "2011-11-11T10:11:21.000Z",
|
|
204
|
-
type: 'metric',
|
|
205
|
-
severity: 'info'
|
|
206
|
-
)
|
|
207
|
-
expect(instance).to receive(:emit).with(expected_event)
|
|
208
|
-
Log.metric(name: 'foo', success: -> result { result == :success }) do
|
|
209
|
-
Time.dummy = Time.now + 10
|
|
210
|
-
:success
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
class MyEx < StandardError
|
|
215
|
-
def backtrace
|
|
216
|
-
%w[ backtrace ]
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
it 'adds exception information if block raises' do
|
|
221
|
-
expected_event = Log::Event.new(
|
|
222
|
-
name: 'foo',
|
|
223
|
-
value: 3.0,
|
|
224
|
-
success: false,
|
|
225
|
-
duration: 3.0,
|
|
226
|
-
timestamp: "2011-11-11T10:11:14.000Z",
|
|
227
|
-
message: '"MyEx: we were fucked" while measuring metric foo',
|
|
228
|
-
error_class: 'MyEx',
|
|
229
|
-
backtrace: %w[ backtrace ],
|
|
230
|
-
type: 'metric',
|
|
231
|
-
severity: 'info'
|
|
232
|
-
)
|
|
233
|
-
expect(instance).to receive(:emit).with(expected_event)
|
|
234
|
-
raised = false
|
|
235
|
-
begin
|
|
236
|
-
Log.metric(name: 'foo', success: -> result { result == :success }) do
|
|
237
|
-
Time.dummy = Time.now + 3
|
|
238
|
-
raise MyEx, "we were fucked"
|
|
239
|
-
Time.dummy = Time.now + 7
|
|
240
|
-
:success
|
|
241
|
-
end
|
|
242
|
-
rescue MyEx
|
|
243
|
-
raised = true
|
|
244
|
-
end
|
|
245
|
-
expect(raised).to eq true
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
end
|
|
249
162
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: betterlog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- betterplace Developers
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-08-
|
|
11
|
+
date: 2023-08-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: gem_hadar
|
|
@@ -66,6 +66,34 @@ dependencies:
|
|
|
66
66
|
- - ">="
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: debug
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: all_images
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
69
97
|
- !ruby/object:Gem::Dependency
|
|
70
98
|
name: tins
|
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -188,6 +216,7 @@ extra_rdoc_files:
|
|
|
188
216
|
- lib/betterlog/railtie.rb
|
|
189
217
|
- lib/betterlog/version.rb
|
|
190
218
|
files:
|
|
219
|
+
- ".all_images.yml"
|
|
191
220
|
- ".github/workflows/codeql-analysis.yml"
|
|
192
221
|
- ".gitignore"
|
|
193
222
|
- ".semaphore/semaphore.yml"
|
|
@@ -239,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
239
268
|
- !ruby/object:Gem::Version
|
|
240
269
|
version: '0'
|
|
241
270
|
requirements: []
|
|
242
|
-
rubygems_version: 3.3.
|
|
271
|
+
rubygems_version: 3.3.26
|
|
243
272
|
signing_key:
|
|
244
273
|
specification_version: 4
|
|
245
274
|
summary: Structured logging support for bp
|