getaround_utils 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +12 -0
- data/README.md +25 -0
- data/lib/getaround_utils/log_formatters/deep_key_value.rb +42 -49
- data/lib/getaround_utils/mixins/loggable.rb +33 -0
- data/lib/getaround_utils/mixins.rb +3 -0
- data/lib/getaround_utils/patches/fix_tagged_logging_string_coercion.rb +32 -0
- data/lib/getaround_utils/patches/key_value_log_tags.rb +21 -5
- data/lib/getaround_utils/patches.rb +4 -0
- data/lib/getaround_utils/railties/lograge.rb +1 -3
- data/lib/getaround_utils/utils/deep_key_value_serializer.rb +40 -0
- data/lib/getaround_utils/utils.rb +3 -0
- data/lib/getaround_utils/version.rb +1 -1
- data/lib/getaround_utils.rb +3 -0
- metadata +32 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b8b08a78e3737d628b9e809bb89c670252fc37ba
|
4
|
+
data.tar.gz: 34aa0786e2093c01af30981539cf971c275e5f14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96e165d62becbae525d2c717b2fa503149745ec3d8ca74ca70677d373dded88acdcdd67aadb05aa1474c89dff88ed2e4e34b2ceef2a001d2b13f391c0deecc50
|
7
|
+
data.tar.gz: 92a70522d2ba91b312bf5c985d3394f18a54d2dd7e2217ab1fbf973b5f666cafc26c309be3ee11287cf3f604a22bc903b666404b6068823307b2983ebf328940
|
data/.rubocop.yml
CHANGED
@@ -5,3 +5,15 @@ inherit_gem:
|
|
5
5
|
getaround-rubocop:
|
6
6
|
- .rubocop.yml
|
7
7
|
- .rubocop-rspec.yml
|
8
|
+
|
9
|
+
Layout/MultilineAssignmentLayout:
|
10
|
+
Description: Vertical alignment results in awkward diffs.
|
11
|
+
EnforcedStyle: same_line
|
12
|
+
|
13
|
+
Layout/ElseAlignment:
|
14
|
+
Description: Vertical alignment results in awkward diffs.
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Layout/EndAlignment:
|
18
|
+
Description: Vertical alignment results in awkward diffs.
|
19
|
+
EnforcedStyleAlignWith: start_of_line
|
data/README.md
CHANGED
@@ -14,6 +14,31 @@ require 'getaround_utils/railties/lograge'
|
|
14
14
|
|
15
15
|
For more details, [read the spec](spec/getaround_utils/railties/lograge_spec.rb)
|
16
16
|
|
17
|
+
## Mixins
|
18
|
+
|
19
|
+
### GetaroundUtils::Mixins::Loggable
|
20
|
+
|
21
|
+
Enables lograge (http logs) with favored default.
|
22
|
+
```
|
23
|
+
class MyClass
|
24
|
+
include Getaround::Mixins::Loggable
|
25
|
+
|
26
|
+
def append_infos_to_loggable(payload)
|
27
|
+
payload[:static] = 'value'
|
28
|
+
end
|
29
|
+
|
30
|
+
def action
|
31
|
+
loggable(:info, dynamic: 'value')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
MyClass.new.action # :info { origin: 'MyClass', static: 'value', dynamic: 'value' }
|
36
|
+
|
37
|
+
```
|
38
|
+
|
39
|
+
For more details, [read the spec](spec/getaround_utils/mixins/loggable.rb)
|
40
|
+
|
41
|
+
|
17
42
|
## Patches
|
18
43
|
|
19
44
|
### GetaroundUtils::Patches::KeyValueLogTags
|
@@ -1,62 +1,55 @@
|
|
1
1
|
module GetaroundUtils; end
|
2
2
|
module GetaroundUtils::LogFormatters; end
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
4
|
+
require 'getaround_utils/utils/deep_key_value_serializer'
|
5
|
+
|
6
|
+
##
|
7
|
+
# Format logs using key=value notation
|
8
|
+
#
|
9
|
+
# This logger leverage the fact that ruby Logger does not especially expect message to be string
|
10
|
+
# It will attempt to serialize message it is a string otherwise adding it as message=value
|
11
|
+
|
12
|
+
class GetaroundUtils::LogFormatters::DeepKeyValue < GetaroundUtils::Utils::DeepKeyValueSerializer
|
13
|
+
def call(severity, _datetime, appname, message)
|
14
|
+
payload = { severity: severity, appname: appname }
|
15
|
+
if message.is_a?(Hash)
|
16
|
+
"#{serialize(payload.merge(message).compact)}\n"
|
17
|
+
else
|
18
|
+
"#{serialize(payload.merge(message: message.to_s).compact)}\n"
|
19
19
|
end
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
value.each.with_index(0) do |v, i|
|
26
|
-
flattify(v, result, path + [i])
|
27
|
-
end
|
28
|
-
when Hash
|
29
|
-
value.each do |k, v|
|
30
|
-
flattify(v, result, path + [k])
|
31
|
-
end
|
32
|
-
when Numeric
|
33
|
-
result[path.join(".")] = value.to_s
|
34
|
-
when String
|
35
|
-
result[path.join(".")] = value =~ /^".*"$/ ? value : value.inspect
|
36
|
-
else
|
37
|
-
result[path.join(".")] = value.to_s.inspect
|
38
|
-
end
|
39
|
-
result
|
22
|
+
module Lograge
|
23
|
+
def call(data)
|
24
|
+
data.compact! if data.is_a?(Hash)
|
25
|
+
serialize(data)
|
40
26
|
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Return a lograge-style LogFormatter
|
31
|
+
#
|
32
|
+
# This formatter will only take one argument and serialize it
|
41
33
|
|
34
|
+
def self.for_lograge
|
35
|
+
new.extend(Lograge)
|
36
|
+
end
|
37
|
+
|
38
|
+
module Sidekiq
|
42
39
|
def call(severity, datetime, appname, message)
|
43
|
-
payload = {
|
44
|
-
|
45
|
-
|
46
|
-
else
|
47
|
-
payload[:message] = message.to_s
|
48
|
-
end
|
49
|
-
serialize(payload)
|
40
|
+
payload = { tid: Thread.current['sidekiq_tid'] }
|
41
|
+
payload.merge!(Thread.current[:sidekiq_context] || {})
|
42
|
+
"#{super.chomp} #{serialize(sidekiq: payload.compact)}\n"
|
50
43
|
end
|
44
|
+
end
|
51
45
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
46
|
+
##
|
47
|
+
# Return a sidekiq-style LogFormatter
|
48
|
+
#
|
49
|
+
# This formatter replicates the default Sidekiq LogFormatter behavior of merging context
|
50
|
+
# values from the current Thread's store
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
end
|
52
|
+
def self.for_sidekiq
|
53
|
+
new.extend(Sidekiq)
|
61
54
|
end
|
62
55
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'logger'
|
2
|
+
module GetaroundUtils; end
|
3
|
+
module GetaroundUtils::Mixins; end
|
4
|
+
|
5
|
+
module GetaroundUtils::Mixins::Loggable
|
6
|
+
def class_name
|
7
|
+
@class_name ||= is_a?(Class) ? name : self.class.name
|
8
|
+
end
|
9
|
+
|
10
|
+
def base_append_infos_to_loggable(payload)
|
11
|
+
payload[:origin] = class_name
|
12
|
+
return unless respond_to?(:append_infos_to_loggable)
|
13
|
+
|
14
|
+
append_infos_to_loggable(payload)
|
15
|
+
end
|
16
|
+
|
17
|
+
def base_loggable_logger
|
18
|
+
@base_loggable_logger ||= if respond_to?(:logger)
|
19
|
+
logger
|
20
|
+
elsif defined?(Rails)
|
21
|
+
Rails.logger
|
22
|
+
else
|
23
|
+
Logger.new(STDOUT)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def loggable(severity, payload)
|
28
|
+
extra_infos = {}
|
29
|
+
base_append_infos_to_loggable(extra_infos)
|
30
|
+
payload = payload.merge(extra_infos).compact
|
31
|
+
base_loggable_logger.send(severity.to_sym, payload)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
module GetaroundUtils; end
|
3
|
+
module GetaroundUtils::Patches; end
|
4
|
+
|
5
|
+
##
|
6
|
+
# Fixes the ActiveSupport::TaggedLogging::Formatter string coercion
|
7
|
+
#
|
8
|
+
# Ruby Logger and child classes don't necessarilly expect message to be string.
|
9
|
+
# In theory, they should preserve the message value intact until it is passed to the formatter.
|
10
|
+
#
|
11
|
+
# ActiveSupport::TaggedLogging breaks this by injecting the tags via string concatenation,
|
12
|
+
# which coerces messages of any type into String.
|
13
|
+
# This patches works around this by instead appending the tags to the result of the
|
14
|
+
# original formatter result, which is garanteed to be a string
|
15
|
+
|
16
|
+
class GetaroundUtils::Patches::FixTaggedLoggingStringCoercion
|
17
|
+
module TaggedLoggingFormatter
|
18
|
+
def fixed_tags_text
|
19
|
+
" #{tags_text.strip}" if tags_text
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(severity, datetime, appname, message)
|
23
|
+
original_method = method(__method__).super_method.super_method
|
24
|
+
payload = original_method.call(severity, datetime, appname, message)
|
25
|
+
"#{payload.chomp}#{fixed_tags_text}\n"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.enable
|
30
|
+
ActiveSupport::TaggedLogging::Formatter.prepend TaggedLoggingFormatter
|
31
|
+
end
|
32
|
+
end
|
@@ -1,9 +1,22 @@
|
|
1
1
|
require 'rails/railtie'
|
2
|
-
require 'getaround_utils/
|
2
|
+
require 'getaround_utils/utils/deep_key_value_serializer'
|
3
3
|
|
4
4
|
module GetaroundUtils; end
|
5
5
|
module GetaroundUtils::Patches; end
|
6
6
|
|
7
|
+
##
|
8
|
+
# Augment the ActiveRecord::TaggedLogging tag formatting
|
9
|
+
#
|
10
|
+
# Tags are defined either as String, Proc or a property of request
|
11
|
+
#
|
12
|
+
# Originally they will be formatted as `[tag_value]`
|
13
|
+
# This patch will instead attempt to serialize the tag with GetaroundUtils::DeepKeyValueSerializer
|
14
|
+
#
|
15
|
+
# ie:
|
16
|
+
# - for a String `value` it would yield `"value"`
|
17
|
+
# - for a Symbol `:request_id` it would yield `request_id="request_id_value"`
|
18
|
+
# - for a Proc `-> {key: :val}` it would yield `key="value"`
|
19
|
+
|
7
20
|
class GetaroundUtils::Patches::KeyValueLogTags
|
8
21
|
module TaggedLoggingFormatter
|
9
22
|
def tags_text
|
@@ -12,16 +25,19 @@ class GetaroundUtils::Patches::KeyValueLogTags
|
|
12
25
|
end
|
13
26
|
|
14
27
|
module RackLogger
|
28
|
+
def kv_formatter
|
29
|
+
@kv_formatter ||= GetaroundUtils::Utils::DeepKeyValueSerializer.new
|
30
|
+
end
|
31
|
+
|
15
32
|
def compute_tags(request)
|
16
|
-
@kv_formatter ||= GetaroundUtils::LogFormatters::DeepKeyValue.new
|
17
33
|
@taggers.collect do |tag|
|
18
34
|
case tag
|
19
35
|
when Proc
|
20
|
-
|
36
|
+
kv_formatter.serialize(tag.call(request))
|
21
37
|
when Symbol
|
22
|
-
|
38
|
+
kv_formatter.serialize(tag => request.send(tag))
|
23
39
|
else
|
24
|
-
|
40
|
+
kv_formatter.serialize(tag)
|
25
41
|
end
|
26
42
|
end
|
27
43
|
end
|
@@ -27,7 +27,5 @@ class GetaroundUtils::Railties::Lograge < Rails::Railtie
|
|
27
27
|
|
28
28
|
config.lograge.enabled = true
|
29
29
|
config.lograge.formatter = GetaroundUtils::LogFormatters::DeepKeyValue.for_lograge
|
30
|
-
config.lograge.custom_options =
|
31
|
-
event.payload[:lograge].compact
|
32
|
-
end
|
30
|
+
config.lograge.custom_options = ->(event) { event.payload[:lograge] }
|
33
31
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module GetaroundUtils; end
|
2
|
+
module GetaroundUtils::Utils; end
|
3
|
+
|
4
|
+
class GetaroundUtils::Utils::DeepKeyValueSerializer
|
5
|
+
def serialize(data)
|
6
|
+
case data
|
7
|
+
when Array
|
8
|
+
flattify(data).map { |key, value| "#{key}=#{value}" }.join(' ')
|
9
|
+
when Hash
|
10
|
+
flattify(data).map { |key, value| "#{key}=#{value}" }.join(' ')
|
11
|
+
when Numeric
|
12
|
+
data.to_s
|
13
|
+
when String
|
14
|
+
data =~ /^".*"$/ ? data : data.inspect
|
15
|
+
else
|
16
|
+
data.to_s.inspect
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# https://stackoverflow.com/questions/48836464/how-to-flatten-a-hash-making-each-key-a-unique-value
|
21
|
+
def flattify(value, result = {}, path = [])
|
22
|
+
case value
|
23
|
+
when Array
|
24
|
+
value.each.with_index(0) do |v, i|
|
25
|
+
flattify(v, result, path + [i])
|
26
|
+
end
|
27
|
+
when Hash
|
28
|
+
value.each do |k, v|
|
29
|
+
flattify(v, result, path + [k])
|
30
|
+
end
|
31
|
+
when Numeric
|
32
|
+
result[path.join(".")] = value.to_s
|
33
|
+
when String
|
34
|
+
result[path.join(".")] = value =~ /^".*"$/ ? value : value.inspect
|
35
|
+
else
|
36
|
+
result[path.join(".")] = value.to_s.inspect
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
40
|
+
end
|
data/lib/getaround_utils.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: getaround_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Drivy
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-11-
|
12
|
+
date: 2019-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -29,20 +29,20 @@ dependencies:
|
|
29
29
|
name: getaround-rubocop
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 0.1.0
|
35
|
-
- - "
|
35
|
+
- - ">="
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: 0.1.0
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- - "
|
42
|
+
- - "~>"
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: 0.1.0
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.1.0
|
48
48
|
- !ruby/object:Gem::Dependency
|
@@ -105,22 +105,22 @@ dependencies:
|
|
105
105
|
name: rspec
|
106
106
|
requirement: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 3.9.0
|
111
108
|
- - "~>"
|
112
109
|
- !ruby/object:Gem::Version
|
113
110
|
version: '3.9'
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 3.9.0
|
114
114
|
type: :development
|
115
115
|
prerelease: false
|
116
116
|
version_requirements: !ruby/object:Gem::Requirement
|
117
117
|
requirements:
|
118
|
-
- - ">="
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: 3.9.0
|
121
118
|
- - "~>"
|
122
119
|
- !ruby/object:Gem::Version
|
123
120
|
version: '3.9'
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 3.9.0
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rspec-rails
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,42 +139,42 @@ dependencies:
|
|
139
139
|
name: rubocop
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
|
-
- - ">="
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: 0.75.0
|
145
142
|
- - "~>"
|
146
143
|
- !ruby/object:Gem::Version
|
147
144
|
version: '0.75'
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 0.75.0
|
148
148
|
type: :development
|
149
149
|
prerelease: false
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
|
-
- - ">="
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
version: 0.75.0
|
155
152
|
- - "~>"
|
156
153
|
- !ruby/object:Gem::Version
|
157
154
|
version: '0.75'
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.75.0
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
159
|
name: rubocop-rspec
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
|
-
- - ">="
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: 0.36.0
|
165
162
|
- - "~>"
|
166
163
|
- !ruby/object:Gem::Version
|
167
164
|
version: '1.36'
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 0.36.0
|
168
168
|
type: :development
|
169
169
|
prerelease: false
|
170
170
|
version_requirements: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
|
-
- - ">="
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
version: 0.36.0
|
175
172
|
- - "~>"
|
176
173
|
- !ruby/object:Gem::Version
|
177
174
|
version: '1.36'
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: 0.36.0
|
178
178
|
description: Shared base utility classes for Getaround Backend Applications.
|
179
179
|
email:
|
180
180
|
- oss@drivy.com
|
@@ -190,8 +190,14 @@ files:
|
|
190
190
|
- lib/getaround_utils.rb
|
191
191
|
- lib/getaround_utils/log_formatters.rb
|
192
192
|
- lib/getaround_utils/log_formatters/deep_key_value.rb
|
193
|
+
- lib/getaround_utils/mixins.rb
|
194
|
+
- lib/getaround_utils/mixins/loggable.rb
|
195
|
+
- lib/getaround_utils/patches.rb
|
196
|
+
- lib/getaround_utils/patches/fix_tagged_logging_string_coercion.rb
|
193
197
|
- lib/getaround_utils/patches/key_value_log_tags.rb
|
194
198
|
- lib/getaround_utils/railties/lograge.rb
|
199
|
+
- lib/getaround_utils/utils.rb
|
200
|
+
- lib/getaround_utils/utils/deep_key_value_serializer.rb
|
195
201
|
- lib/getaround_utils/version.rb
|
196
202
|
homepage: https://github.com/drivy
|
197
203
|
licenses:
|
@@ -212,7 +218,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
218
|
- !ruby/object:Gem::Version
|
213
219
|
version: '0'
|
214
220
|
requirements: []
|
215
|
-
|
221
|
+
rubyforge_project:
|
222
|
+
rubygems_version: 2.5.2.3
|
216
223
|
signing_key:
|
217
224
|
specification_version: 4
|
218
225
|
summary: Backend shared utility classes
|