kiev 4.4.0 → 4.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|