kiev 4.4.0 → 4.8.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/.github/workflows/push.yml +1 -0
- data/README.md +60 -1
- data/gemfiles/que_0.12.3.gemfile +1 -1
- data/gemfiles/ruby_kafka.gemfile +11 -0
- data/gemfiles/sidekiq_4.2.gemfile +3 -0
- data/kiev.gemspec +2 -2
- data/lib/kiev/aws_sns/context_injector.rb +22 -0
- data/lib/kiev/aws_sns.rb +16 -0
- data/lib/kiev/base.rb +32 -5
- data/lib/kiev/config.rb +38 -3
- data/lib/kiev/kafka/context_extractor.rb +26 -0
- data/lib/kiev/kafka/context_injector.rb +20 -0
- data/lib/kiev/kafka/message_context.rb +27 -0
- data/lib/kiev/kafka.rb +22 -0
- data/lib/kiev/logger.rb +10 -8
- data/lib/kiev/param_filter.rb +27 -4
- data/lib/kiev/rack/request_logger.rb +0 -2
- data/lib/kiev/shoryuken/middleware/message_tracer.rb +4 -7
- data/lib/kiev/version.rb +1 -1
- data/lib/kiev.rb +2 -0
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80613e919661165f768bd2a96b293c1908447e2cf936d7bf0f3b47e2338dec26
|
4
|
+
data.tar.gz: a49dffa5584e4a326ca21b10cdb6a82f091caf23a49d18241db3225343193ef8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddb0cc47d3f960a1e761ed9e6647a9f3048ef6a4ed85ddd46c4c21c1f78d4dd2975f3842172570fba2570f968a23107d1d28133c5cc0a82c171fcc8892fa16f3
|
7
|
+
data.tar.gz: c54860b71c585ef469c9f425601e55d282cedaafde4860bcf0f46474bab9b5b7fe4f6cef460729c11de7af61636c9b099f6c7865f5ac336d8b6d3301a2444d69
|
data/.github/workflows/push.yml
CHANGED
data/README.md
CHANGED
@@ -154,6 +154,36 @@ Kiev::Shoryuken.enable
|
|
154
154
|
|
155
155
|
The name of the worker class is not logged by default. Configure [`persistent_log_fields` option](#persistent_log_fields) to include `"shoryuken_class"` if you want this.
|
156
156
|
|
157
|
+
### AWS SNS
|
158
|
+
|
159
|
+
To enhance messages published to SNS topics you can use the ContextInjector:
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
sns_message = { topic_arn: "...", message: "{...}" }
|
163
|
+
Kiev::Kafka.inject_context(sns_message[:message_attributes])
|
164
|
+
|
165
|
+
```
|
166
|
+
|
167
|
+
After this operation the message attributes will also include required context for the Kiev logger.
|
168
|
+
|
169
|
+
### Kafka
|
170
|
+
|
171
|
+
To enhance messages published to Kafka topics you can use the ContextInjector:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
Kiev::Kafka.inject_context(headers)
|
175
|
+
```
|
176
|
+
|
177
|
+
After this operation the headers variable will also include required context for the Kiev logger.
|
178
|
+
|
179
|
+
If you have a consumed `Kafka::FetchedMessage` you can extract logger context with:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
Kiev::Kafka.extract_context(message)
|
183
|
+
```
|
184
|
+
|
185
|
+
This will work regardless if headers are in HTTP format, e.g. `X-Tracking-Id` or plain field names: `tracking_id`. Plus the `message_key` field will contain the key of processed message. In case you want to log some more fields configure `persistent_log_fields` and `jobs_propagated_fields`.
|
186
|
+
|
157
187
|
### Que
|
158
188
|
|
159
189
|
Add the following lines to your initializer code:
|
@@ -219,7 +249,9 @@ For web requests the Kiev middleware will log the following information by defau
|
|
219
249
|
|
220
250
|
* `params` attribute will store both query parameters and request body fields (as long as they are parseable). Sensitive fields will be filtered out - see the `#filtered_params` option.
|
221
251
|
|
222
|
-
* `request_id` is the correlation ID and will be the same across all requests within a chain of requests. It's represented as a UUID (version 4).
|
252
|
+
* `request_id` is the correlation ID and will be the same across all requests within a chain of requests. It's represented as a UUID (version 4). (currently deprecated in favor of a new name: `tracking_id`)
|
253
|
+
|
254
|
+
* `tracking_id` is the correlation ID and will be the same across all requests within a chain of requests. It's represented as a UUID (version 4). If not provided the value is seeded from deprecated `request_id`.
|
223
255
|
|
224
256
|
* `request_depth` represents the position of the current request within a chain of requests. It starts with 0.
|
225
257
|
|
@@ -285,6 +317,11 @@ Kiev.event(:my_event, { some_array: [1, 2, 3] })
|
|
285
317
|
|
286
318
|
# Log other data types (will be available under the `message` key)
|
287
319
|
Kiev.event(:my_event, "hello world")
|
320
|
+
|
321
|
+
# Log with given severity [debug, info, warn, error, fatal]
|
322
|
+
Kiev.info(:my_event)
|
323
|
+
Kiev.info(:my_event, { some_array: [1, 2, 3] })
|
324
|
+
Kiev.info(:my_event, "hello world")
|
288
325
|
```
|
289
326
|
|
290
327
|
However, `Kiev.logger` implements the Ruby `Logger` class, so all the other methods are available as well:
|
@@ -407,6 +444,28 @@ get "/" do
|
|
407
444
|
end
|
408
445
|
```
|
409
446
|
|
447
|
+
### log_level
|
448
|
+
You can specify log level.
|
449
|
+
|
450
|
+
```ruby
|
451
|
+
Kiev.configure do |config|
|
452
|
+
# One of: 0, 1, 2, 3, 4 (DEBUG, INFO, WARN, ERROR, FATAL)
|
453
|
+
config.log_level = 0
|
454
|
+
end
|
455
|
+
```
|
456
|
+
|
457
|
+
### enable_filter_for_log_levels
|
458
|
+
You can specify for which log levels personal identifying information filter will be applied.
|
459
|
+
|
460
|
+
```ruby
|
461
|
+
Kiev.configure do |config|
|
462
|
+
# [DEBUG, INFO, WARN, ERROR, FATAL]
|
463
|
+
config.enable_filter_for_log_levels = [0, 1, 2, 3, 4]
|
464
|
+
end
|
465
|
+
```
|
466
|
+
|
467
|
+
**By default enabled for all suppported log levels.**
|
468
|
+
|
410
469
|
## nginx
|
411
470
|
|
412
471
|
If you want to log 499 and 50x errors in nginx, which will not be captured by Ruby application, consider adding this to your nginx configuration:
|
data/gemfiles/que_0.12.3.gemfile
CHANGED
@@ -11,5 +11,8 @@ gem "rspec", require: false
|
|
11
11
|
gem "minitest-reporters", require: false
|
12
12
|
|
13
13
|
gem "her"
|
14
|
+
# We need to do it, since her gem doesn't lock upper boundry
|
15
|
+
# https://github.com/remi/her/blob/master/her.gemspec#L26
|
16
|
+
gem "faraday", "~> 1.9.3"
|
14
17
|
|
15
18
|
gemspec path: "../"
|
data/kiev.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "rack", ">= 1", "< 3"
|
25
25
|
spec.add_dependency "request_store", ">= 1.0", "< 1.4"
|
26
26
|
spec.add_dependency "ruby_dig", "~> 0.0.2" # to support ruby 2.2
|
27
|
-
spec.add_development_dependency "rake",
|
28
|
-
spec.add_development_dependency "rspec",
|
27
|
+
spec.add_development_dependency "rake", "~> 0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.10"
|
29
29
|
spec.add_development_dependency "rubocop", "~> 0.54"
|
30
30
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kiev/config"
|
4
|
+
require "kiev/subrequest_helper"
|
5
|
+
|
6
|
+
module Kiev
|
7
|
+
module AwsSns
|
8
|
+
class ContextInjector
|
9
|
+
# @param [Hash] message_attributes Injects context headers
|
10
|
+
# @return [Hash]
|
11
|
+
def call(message_attributes = {})
|
12
|
+
Kiev::SubrequestHelper.payload.each do |key, value|
|
13
|
+
message_attributes[key] = {
|
14
|
+
data_type: "String",
|
15
|
+
string_value: value.to_s
|
16
|
+
}
|
17
|
+
end
|
18
|
+
message_attributes
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/kiev/aws_sns.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base"
|
4
|
+
|
5
|
+
module Kiev
|
6
|
+
module AwsSns
|
7
|
+
require_relative "kafka/context_injector"
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# @param [Hash] headers
|
11
|
+
def inject_context(headers = {})
|
12
|
+
Kiev::AwsSns::ContextInjector.new.call(headers)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/kiev/base.rb
CHANGED
@@ -13,21 +13,38 @@ require_relative "config"
|
|
13
13
|
require_relative "util"
|
14
14
|
require_relative "subrequest_helper"
|
15
15
|
require_relative "hanami"
|
16
|
+
require "forwardable"
|
17
|
+
require "logger"
|
16
18
|
|
17
19
|
module Kiev
|
18
20
|
class << self
|
21
|
+
extend Forwardable
|
22
|
+
|
23
|
+
def_delegators :config,
|
24
|
+
:logger,
|
25
|
+
:filtered_params,
|
26
|
+
:ignored_params,
|
27
|
+
:log_level,
|
28
|
+
:enable_filter_for_log_levels
|
29
|
+
|
19
30
|
EMPTY_OBJ = {}.freeze
|
20
31
|
|
21
32
|
def configure
|
22
33
|
yield(Config.instance)
|
23
34
|
end
|
24
35
|
|
25
|
-
def
|
26
|
-
Config.instance
|
36
|
+
def config
|
37
|
+
Config.instance
|
27
38
|
end
|
28
39
|
|
29
|
-
def event(
|
30
|
-
logger.log(
|
40
|
+
def event(log_name, data = EMPTY_OBJ, severity = log_level)
|
41
|
+
logger.log(severity, logged_data(data), log_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
Config.instance.supported_log_levels.each_pair do |key, value|
|
45
|
+
define_method(key) do |log_name, data = EMPTY_OBJ|
|
46
|
+
event(log_name, data, value)
|
47
|
+
end
|
31
48
|
end
|
32
49
|
|
33
50
|
def []=(name, value)
|
@@ -47,7 +64,17 @@ module Kiev
|
|
47
64
|
end
|
48
65
|
|
49
66
|
def request_id
|
50
|
-
RequestStore.store[:
|
67
|
+
RequestStore.store[:tracking_id]
|
68
|
+
end
|
69
|
+
|
70
|
+
alias_method :tracking_id, :request_id
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def logged_data(data)
|
75
|
+
return data unless enable_filter_for_log_levels.include?(log_level)
|
76
|
+
|
77
|
+
ParamFilter.filter(data, filtered_params, ignored_params)
|
51
78
|
end
|
52
79
|
end
|
53
80
|
end
|
data/lib/kiev/config.rb
CHANGED
@@ -75,6 +75,16 @@ module Kiev
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
SUPPORTED_LOG_LEVELS = {
|
79
|
+
debug: ::Logger::DEBUG,
|
80
|
+
info: ::Logger::INFO,
|
81
|
+
warn: ::Logger::WARN,
|
82
|
+
error: ::Logger::ERROR,
|
83
|
+
fatal: ::Logger::FATAL
|
84
|
+
}.freeze
|
85
|
+
|
86
|
+
private_constant :SUPPORTED_LOG_LEVELS
|
87
|
+
|
78
88
|
attr_accessor :app,
|
79
89
|
:log_request_condition,
|
80
90
|
:log_request_error_condition,
|
@@ -89,10 +99,12 @@ module Kiev
|
|
89
99
|
|
90
100
|
attr_reader :development_mode,
|
91
101
|
:logger,
|
102
|
+
:log_level,
|
92
103
|
:http_propagated_fields,
|
93
104
|
:jobs_propagated_fields,
|
94
105
|
:all_http_propagated_fields, # for internal use
|
95
|
-
:all_jobs_propagated_fields # for internal use
|
106
|
+
:all_jobs_propagated_fields, # for internal use
|
107
|
+
:enable_filter_for_log_levels
|
96
108
|
|
97
109
|
def initialize
|
98
110
|
@log_request_condition = DEFAULT_LOG_REQUEST_CONDITION
|
@@ -105,9 +117,10 @@ module Kiev
|
|
105
117
|
@development_mode = false
|
106
118
|
@ignored_rack_exceptions = DEFAULT_IGNORED_RACK_EXCEPTIONS.dup
|
107
119
|
@logger = Kiev::Logger.new(STDOUT)
|
108
|
-
@log_level =
|
120
|
+
@log_level = default_log_level
|
109
121
|
@persistent_log_fields = []
|
110
122
|
@pre_rack_hook = DEFAULT_PRE_RACK_HOOK
|
123
|
+
@enable_filter_for_log_levels = supported_log_levels.values
|
111
124
|
self.propagated_fields = {}
|
112
125
|
update_logger_settings
|
113
126
|
end
|
@@ -138,20 +151,32 @@ module Kiev
|
|
138
151
|
end
|
139
152
|
|
140
153
|
def log_level=(value)
|
154
|
+
raise ArgumentError, "Unsupported log level #{value}" unless supported_log_level?(value)
|
155
|
+
|
141
156
|
@log_level = value
|
142
157
|
update_logger_settings
|
143
158
|
end
|
144
159
|
|
160
|
+
def enable_filter_for_log_levels=(log_levels)
|
161
|
+
raise ArgumentError, "Unsupported log levels" unless array_with_log_levels?(log_levels)
|
162
|
+
|
163
|
+
@enable_filter_for_log_levels = log_levels
|
164
|
+
end
|
165
|
+
|
145
166
|
def development_mode=(value)
|
146
167
|
@development_mode = value
|
147
168
|
update_logger_settings
|
148
169
|
end
|
149
170
|
|
171
|
+
def supported_log_levels
|
172
|
+
SUPPORTED_LOG_LEVELS
|
173
|
+
end
|
174
|
+
|
150
175
|
private
|
151
176
|
|
152
177
|
def update_logger_settings
|
153
178
|
@logger.formatter = formatter
|
154
|
-
@logger.level = @log_level
|
179
|
+
@logger.level = @log_level
|
155
180
|
end
|
156
181
|
|
157
182
|
def formatter
|
@@ -161,5 +186,15 @@ module Kiev
|
|
161
186
|
def default_log_level
|
162
187
|
development_mode ? ::Logger::DEBUG : ::Logger::INFO
|
163
188
|
end
|
189
|
+
|
190
|
+
def array_with_log_levels?(log_levels)
|
191
|
+
return false unless log_levels.is_a?(Array)
|
192
|
+
|
193
|
+
log_levels.all? { |level| supported_log_level?(level) }
|
194
|
+
end
|
195
|
+
|
196
|
+
def supported_log_level?(log_level)
|
197
|
+
supported_log_levels.value?(log_level)
|
198
|
+
end
|
164
199
|
end
|
165
200
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "message_context"
|
4
|
+
require "kiev/request_id"
|
5
|
+
require "kiev/context_reader"
|
6
|
+
|
7
|
+
module Kiev
|
8
|
+
module Kafka
|
9
|
+
class ContextExtractor
|
10
|
+
include Kiev::RequestId::Mixin
|
11
|
+
|
12
|
+
# @param [Kafka::FetchedMessage] message
|
13
|
+
def call(message)
|
14
|
+
context = Kiev::Kafka::MessageContext.new(message)
|
15
|
+
context_reader = Kiev::ContextReader.new(context)
|
16
|
+
wrap_request_id(context_reader) {}
|
17
|
+
|
18
|
+
Kiev[:message_key] = message.key
|
19
|
+
|
20
|
+
Config.instance.jobs_propagated_fields.each do |key|
|
21
|
+
Kiev[key] = context_reader[key]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kiev/config"
|
4
|
+
require "kiev/subrequest_helper"
|
5
|
+
|
6
|
+
module Kiev
|
7
|
+
module Kafka
|
8
|
+
class ContextInjector
|
9
|
+
# @param [Hash] headers Injects context headers
|
10
|
+
# @return [Hash]
|
11
|
+
def call(headers = {})
|
12
|
+
Kiev::SubrequestHelper.payload.each do |key, value|
|
13
|
+
field_key = Kiev::Config::DEFAULT_HTTP_PROPAGATED_FIELDS.fetch(key.to_sym, key)
|
14
|
+
headers[field_key] = value
|
15
|
+
end
|
16
|
+
headers
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kiev
|
4
|
+
module Kafka
|
5
|
+
class MessageContext
|
6
|
+
# @param [Kafka::FetchedMessage] message
|
7
|
+
def initialize(message)
|
8
|
+
@headers = message.headers
|
9
|
+
end
|
10
|
+
|
11
|
+
def value(field)
|
12
|
+
headers[header_key(field)] || headers[field.to_s]
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :[], :value
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :headers
|
20
|
+
|
21
|
+
# @param [String] field
|
22
|
+
def header_key(field)
|
23
|
+
"x_#{field}".gsub("_", " ").split.map(&:capitalize).join("-")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/kiev/kafka.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base"
|
4
|
+
|
5
|
+
module Kiev
|
6
|
+
module Kafka
|
7
|
+
require_relative "kafka/context_extractor"
|
8
|
+
require_relative "kafka/context_injector"
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# @param [Kafka::FetchedMessage] message
|
12
|
+
def extract_context(message)
|
13
|
+
Kiev::Kafka::ContextExtractor.new.call(message)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Hash] headers
|
17
|
+
def inject_context(headers = {})
|
18
|
+
Kiev::Kafka::ContextInjector.new.call(headers)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/kiev/logger.rb
CHANGED
@@ -12,17 +12,19 @@ module Kiev
|
|
12
12
|
extend Forwardable
|
13
13
|
def_delegators(*([:@logger] + ::Logger.instance_methods(false)))
|
14
14
|
|
15
|
-
|
15
|
+
DEFAULT_LOG_NAME = "log"
|
16
|
+
DEFAULT_MESSAGE = "log"
|
16
17
|
LOG_ERROR = "ERROR"
|
17
18
|
ERROR_STATUS = 500
|
18
19
|
|
19
|
-
FORMATTER = proc do |severity, time,
|
20
|
+
FORMATTER = proc do |severity, time, log_name, data|
|
20
21
|
entry =
|
21
22
|
{
|
22
23
|
application: Config.instance.app,
|
23
|
-
|
24
|
+
log_name: log_name || DEFAULT_LOG_NAME,
|
24
25
|
level: severity,
|
25
26
|
timestamp: time.utc,
|
27
|
+
message: log_name || DEFAULT_MESSAGE,
|
26
28
|
tracking_id: RequestStore.store[:tracking_id],
|
27
29
|
request_id: RequestStore.store[:request_id],
|
28
30
|
request_depth: RequestStore.store[:request_depth],
|
@@ -39,12 +41,12 @@ module Kiev
|
|
39
41
|
entry[:jid] = RequestStore.store[:jid]
|
40
42
|
end
|
41
43
|
|
42
|
-
if !RequestStore.store[:subrequest_count] && %i(request_finished job_finished).include?(
|
44
|
+
if !RequestStore.store[:subrequest_count] && %i(request_finished job_finished).include?(log_name)
|
43
45
|
entry[:tree_leaf] = true
|
44
46
|
end
|
45
47
|
|
46
48
|
if RequestStore.store[:payload]
|
47
|
-
if %i(request_finished job_finished).include?(
|
49
|
+
if %i(request_finished job_finished).include?(log_name)
|
48
50
|
entry.merge!(RequestStore.store[:payload])
|
49
51
|
else
|
50
52
|
Config.instance.persistent_log_fields.each do |field|
|
@@ -68,17 +70,17 @@ module Kiev
|
|
68
70
|
JSON.logstash(entry)
|
69
71
|
end
|
70
72
|
|
71
|
-
DEVELOPMENT_FORMATTER = proc do |severity, time,
|
73
|
+
DEVELOPMENT_FORMATTER = proc do |severity, time, log_name, data|
|
72
74
|
entry = []
|
73
75
|
|
74
76
|
entry << time.iso8601
|
75
|
-
entry << (
|
77
|
+
entry << (log_name || severity).upcase
|
76
78
|
|
77
79
|
if data.is_a?(String)
|
78
80
|
entry << "#{data}\n"
|
79
81
|
end
|
80
82
|
|
81
|
-
if %i(request_finished job_finished).include?(
|
83
|
+
if %i(request_finished job_finished).include?(log_name)
|
82
84
|
verb = RequestStore.store[:request_verb]
|
83
85
|
path = RequestStore.store[:request_path]
|
84
86
|
entry << "#{verb} #{path}" if verb && path
|
data/lib/kiev/param_filter.rb
CHANGED
@@ -1,12 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Kiev
|
4
|
-
|
4
|
+
class ParamFilter
|
5
5
|
FILTERED = "[FILTERED]"
|
6
6
|
|
7
7
|
def self.filter(params, filtered_params, ignored_params)
|
8
|
+
new(filtered_params, ignored_params).call(params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(filtered_params, ignored_params)
|
12
|
+
@filtered_params = normalize(filtered_params)
|
13
|
+
@ignored_params = normalize(ignored_params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(params)
|
17
|
+
return params unless filterable?(params)
|
18
|
+
|
8
19
|
params.each_with_object({}) do |(key, value), acc|
|
9
|
-
next if ignored_params.include?(key)
|
20
|
+
next if ignored_params.include?(key.to_s)
|
10
21
|
|
11
22
|
if defined?(ActionDispatch) && value.is_a?(ActionDispatch::Http::UploadedFile)
|
12
23
|
value = {
|
@@ -17,14 +28,26 @@ module Kiev
|
|
17
28
|
end
|
18
29
|
|
19
30
|
acc[key] =
|
20
|
-
if filtered_params.include?(key) && !value.is_a?(Hash)
|
31
|
+
if filtered_params.include?(key.to_s) && !value.is_a?(Hash)
|
21
32
|
FILTERED
|
22
33
|
elsif value.is_a?(Hash)
|
23
|
-
|
34
|
+
call(value)
|
24
35
|
else
|
25
36
|
value
|
26
37
|
end
|
27
38
|
end
|
28
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
attr_reader :filtered_params, :ignored_params
|
44
|
+
|
45
|
+
def filterable?(params)
|
46
|
+
params.respond_to?(:each_with_object)
|
47
|
+
end
|
48
|
+
|
49
|
+
def normalize(params)
|
50
|
+
Set.new(params.map(&:to_s))
|
51
|
+
end
|
29
52
|
end
|
30
53
|
end
|
@@ -85,8 +85,6 @@ module Kiev
|
|
85
85
|
request.params
|
86
86
|
end
|
87
87
|
|
88
|
-
params = ParamFilter.filter(params, config.filtered_params, config.ignored_params)
|
89
|
-
|
90
88
|
data = {
|
91
89
|
host: request.host, # env["HTTP_HOST"] || env["HTTPS_HOST"],
|
92
90
|
params: params.empty? ? nil : params, # env[Rack::QUERY_STRING],
|
@@ -1,17 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "kiev/aws_sns/context_injector"
|
4
|
+
|
3
5
|
module Kiev
|
4
6
|
module Shoryuken
|
5
7
|
module Middleware
|
6
8
|
class MessageTracer
|
7
9
|
def call(options)
|
8
|
-
|
9
|
-
|
10
|
-
attrbutes[key] = {
|
11
|
-
data_type: "String",
|
12
|
-
string_value: value.to_s
|
13
|
-
}
|
14
|
-
end
|
10
|
+
options[:message_attributes] ||= {}
|
11
|
+
Kiev::AwsSns::ContextInjector.new.call(options[:message_attributes])
|
15
12
|
yield
|
16
13
|
end
|
17
14
|
end
|
data/lib/kiev/version.rb
CHANGED
data/lib/kiev.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "kiev/base"
|
4
|
+
require_relative "kiev/aws_sns" if defined?(AWS::SNS)
|
5
|
+
require_relative "kiev/kafka" if defined?(Kafka)
|
4
6
|
require_relative "kiev/rack" if defined?(Rack)
|
5
7
|
require_relative "kiev/railtie" if defined?(Rails)
|
6
8
|
require_relative "kiev/sidekiq" if defined?(Sidekiq)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kiev
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blacklane
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oga
|
@@ -98,14 +98,14 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '
|
101
|
+
version: '3.10'
|
102
102
|
type: :development
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version: '
|
108
|
+
version: '3.10'
|
109
109
|
- !ruby/object:Gem::Dependency
|
110
110
|
name: rubocop
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- gemfiles/rails_4.1.gemfile
|
146
146
|
- gemfiles/rails_4.2.gemfile
|
147
147
|
- gemfiles/rails_5.2.gemfile
|
148
|
+
- gemfiles/ruby_kafka.gemfile
|
148
149
|
- gemfiles/shoryuken_4.0.gemfile
|
149
150
|
- gemfiles/sidekiq_4.2.gemfile
|
150
151
|
- gemfiles/sinatra_1.4.gemfile
|
@@ -152,6 +153,8 @@ files:
|
|
152
153
|
- kiev.gemspec
|
153
154
|
- lib/ext/rack/common_logger.rb
|
154
155
|
- lib/kiev.rb
|
156
|
+
- lib/kiev/aws_sns.rb
|
157
|
+
- lib/kiev/aws_sns/context_injector.rb
|
155
158
|
- lib/kiev/base.rb
|
156
159
|
- lib/kiev/base52.rb
|
157
160
|
- lib/kiev/config.rb
|
@@ -160,6 +163,10 @@ files:
|
|
160
163
|
- lib/kiev/her_ext/client_request_id.rb
|
161
164
|
- lib/kiev/httparty.rb
|
162
165
|
- lib/kiev/json.rb
|
166
|
+
- lib/kiev/kafka.rb
|
167
|
+
- lib/kiev/kafka/context_extractor.rb
|
168
|
+
- lib/kiev/kafka/context_injector.rb
|
169
|
+
- lib/kiev/kafka/message_context.rb
|
163
170
|
- lib/kiev/logger.rb
|
164
171
|
- lib/kiev/param_filter.rb
|
165
172
|
- lib/kiev/que/job.rb
|
@@ -215,8 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
222
|
- !ruby/object:Gem::Version
|
216
223
|
version: '0'
|
217
224
|
requirements: []
|
218
|
-
|
219
|
-
rubygems_version: 2.7.6
|
225
|
+
rubygems_version: 3.3.6
|
220
226
|
signing_key:
|
221
227
|
specification_version: 4
|
222
228
|
summary: Distributed logging to JSON integrated with various Ruby frameworks and tools
|