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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f25b13c7dfe2a466ce7f9b0f03f3b4078d70158d3241aa589568124ab8b5501
4
- data.tar.gz: 3665a4859072ec37b624a89c218ec362e019a2994236901a2ce2dfc55a2a60ca
3
+ metadata.gz: 80613e919661165f768bd2a96b293c1908447e2cf936d7bf0f3b47e2338dec26
4
+ data.tar.gz: a49dffa5584e4a326ca21b10cdb6a82f091caf23a49d18241db3225343193ef8
5
5
  SHA512:
6
- metadata.gz: 35a76a1baf47a1c857ef9c0a6b39f9adb513dd7366c372d6cbcb148980b25772759a529c82559af5779d61bf2eb51706016463fda47aaa85c8a0a3604d5667c0
7
- data.tar.gz: b7830138907f5a65d062c3e5f2c7e2d3a9bced6595ac428b9e14ab47f11ebbef94abd35bd590a9dc5890e1045d8fdd86a85a643b1aa29c1dcb545d921045c2d6
6
+ metadata.gz: ddb0cc47d3f960a1e761ed9e6647a9f3048ef6a4ed85ddd46c4c21c1f78d4dd2975f3842172570fba2570f968a23107d1d28133c5cc0a82c171fcc8892fa16f3
7
+ data.tar.gz: c54860b71c585ef469c9f425601e55d282cedaafde4860bcf0f46474bab9b5b7fe4f6cef460729c11de7af61636c9b099f6c7865f5ac336d8b6d3301a2444d69
@@ -21,6 +21,7 @@ jobs:
21
21
  matrix:
22
22
  ruby: ['2.5.1', '2.7.2', '2.6.5']
23
23
  gemfile:
24
+ - gemfiles/ruby_kafka.gemfile
24
25
  - gemfiles/que_0.12.2.gemfile
25
26
  - gemfiles/que_0.12.3.gemfile
26
27
  - gemfiles/rails_5.2.gemfile
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:
@@ -6,7 +6,7 @@ source "https://rubygems.org"
6
6
  gem "multi_json"
7
7
  gem "oj"
8
8
 
9
- gem "que", ">= 0.12.3"
9
+ gem "que", "0.12.3"
10
10
  gem "pg"
11
11
  gem "sequel"
12
12
 
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "ruby-kafka", "~> 0.7.10"
6
+
7
+ gem "rack-test", require: false
8
+ gem "rspec", require: false
9
+ gem "minitest-reporters", require: false
10
+
11
+ gemspec path: "../"
@@ -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", '~> 0'
28
- spec.add_development_dependency "rspec", '~> 0'
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
@@ -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 logger
26
- Config.instance.logger
36
+ def config
37
+ Config.instance
27
38
  end
28
39
 
29
- def event(event_name, data = EMPTY_OBJ)
30
- logger.log(::Logger::Severity::INFO, data, event_name)
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[:request_id]
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 = nil
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 || default_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
- DEFAULT_EVENT_NAME = "log"
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, event_name, data|
20
+ FORMATTER = proc do |severity, time, log_name, data|
20
21
  entry =
21
22
  {
22
23
  application: Config.instance.app,
23
- event: event_name || DEFAULT_EVENT_NAME,
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?(event_name)
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?(event_name)
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, event_name, data|
73
+ DEVELOPMENT_FORMATTER = proc do |severity, time, log_name, data|
72
74
  entry = []
73
75
 
74
76
  entry << time.iso8601
75
- entry << (event_name || severity).upcase
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?(event_name)
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
@@ -1,12 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kiev
4
- module ParamFilter
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
- filter(value, filtered_params, ignored_params)
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
- attrbutes = options[:message_attributes] ||= {}
9
- SubrequestHelper.payload.each do |key, value|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kiev
4
- VERSION = "4.4.0"
4
+ VERSION = "4.8.0"
5
5
  end
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.0
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: 2021-02-03 00:00:00.000000000 Z
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: '0'
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: '0'
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
- rubyforge_project:
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