kiev 2.7.3 → 2.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
  SHA1:
3
- metadata.gz: 4993218a36a9d91204d3af2a87327a3394494e3f
4
- data.tar.gz: f446c0d1c31a6aacf5d12d47488cafb19756dabd
3
+ metadata.gz: c95641b776dbecacfb3c20627bdca29ed253a5a5
4
+ data.tar.gz: 04e91ef07a297c90b94011b115e429a188b2df5e
5
5
  SHA512:
6
- metadata.gz: 66768446011943507c8741451239becbbaa9397b1d4cf96214f3bc0bc31e524d407821d55566ea998953092ae5bcf869c8e3a74622ad06f9a0cca446f1fcf0d2
7
- data.tar.gz: d11e2427f18cb51feb4ccddcb270b840638f37531819685e9913c6a1825a0cc8dc2d5fd6e44cfd2799a27b47caaa94178edabad127b135cbc6d5c40161c288c5
6
+ metadata.gz: 84dd23df61159eac642eb93dfa14d97b4cfb354159dc3afa51626640ecd66106282d0414b508764ff40b2be04ef4d5e71852bd974ab7973d380b78f6bac4ff0a
7
+ data.tar.gz: 016ed238aa2aabf377acd7796577d95c13b10ac0d065a5ef02560fef5520ac30b5e24ebfbed3613479ade39cf88eaded5526115683e08de4ac8b69830ae37c8d
data/.rubocop.yml CHANGED
@@ -9,9 +9,9 @@ Lint/RescueException:
9
9
  Exclude:
10
10
  - lib/kiev/request_body_filter/json.rb
11
11
  - lib/kiev/sidekiq/request_logger.rb
12
+ - lib/kiev/shoryuken/request_logger.rb
12
13
  - lib/kiev/rack/request_logger.rb
13
14
  - lib/kiev/json.rb
14
- - test/sidekiq_test.rb
15
15
  Style/GlobalVars:
16
16
  Exclude:
17
17
  - test/helper.rb
data/.travis.yml CHANGED
@@ -20,6 +20,7 @@ gemfile:
20
20
  - gemfiles/que_0.12.3.gemfile
21
21
  - gemfiles/rails_4.1.gemfile
22
22
  - gemfiles/rails_4.2.gemfile
23
+ - gemfiles/shoryuken_3.1.gemfile
23
24
  - gemfiles/sidekiq_4.2.gemfile
24
25
  - gemfiles/sinatra_1.4.gemfile
25
26
  - gemfiles/sinatra_2.0.gemfile
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Kiev [![Build Status](https://travis-ci.com/blacklane/kiev.svg?token=j5tcq3Fz9ERKZ2HhzC8T&branch=master)](https://travis-ci.com/blacklane/kiev)
1
+ # Kiev [![Build Status](https://travis-ci.org/blacklane/kiev.svg?branch=master)](https://travis-ci.org/blacklane/kiev)
2
2
 
3
3
  Kiev is a comprehensive logging library aimed at covering a wide range of frameworks and tools from the Ruby ecosystem:
4
4
 
@@ -7,6 +7,7 @@ Kiev is a comprehensive logging library aimed at covering a wide range of framew
7
7
  - Rack and other Rack-based frameworks
8
8
  - Sidekiq
9
9
  - Que
10
+ - Shoryuken
10
11
  - Her and other Faraday-based libraries
11
12
  - HTTParty
12
13
 
@@ -114,6 +115,16 @@ Add the following lines to your initializer code:
114
115
  Kiev::Sidekiq.enable
115
116
  ```
116
117
 
118
+ ### Shoryuken
119
+
120
+ Add the following lines to your initializer code:
121
+
122
+ ```ruby
123
+ Kiev::Shoryuken.enable
124
+ ```
125
+
126
+ 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.
127
+
117
128
  ### Que
118
129
 
119
130
  Add the following lines to your initializer code:
@@ -177,21 +188,21 @@ For web requests the Kiev middleware will log the following information by defau
177
188
  }
178
189
  ```
179
190
 
180
- The `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.
191
+ * `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.
181
192
 
182
- The `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).
193
+ * `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).
183
194
 
184
- The `request_depth` represents the position of the current request within a chain of requests. It starts with 0.
195
+ * `request_depth` represents the position of the current request within a chain of requests. It starts with 0.
185
196
 
186
- The `route` attribute will be set to either the Rails route (`RootController#index`) or Sinatra route (`/`) or the path, depending on the context.
197
+ * `route` attribute will be set to either the Rails route (`RootController#index`) or Sinatra route (`/`) or the path, depending on the context.
187
198
 
188
- The `request_duration` is measured in miliseconds.
199
+ * `request_duration` is measured in miliseconds.
189
200
 
190
- The `body` attribute coresponds to the response body and will be logged depending on the `#log_response_body_condition` option.
201
+ * `body` attribute coresponds to the response body and will be logged depending on the `#log_response_body_condition` option.
191
202
 
192
- The `tree_path` attribute can be used to follow the branching of requests within a chain of requests. It's a lexicographically sortable string.
203
+ * `tree_path` attribute can be used to follow the branching of requests within a chain of requests. It's a lexicographically sortable string.
193
204
 
194
- The `tree_leaf` points out that this request is a leaf in the request chain tree structure.
205
+ * `tree_leaf` points out that this request is a leaf in the request chain tree structure.
195
206
 
196
207
  ### Background jobs
197
208
 
@@ -422,6 +433,53 @@ When storing logs on disk, we recommend using Logrotate in truncate mode.
422
433
 
423
434
  You can use [jq](https://stedolan.github.io/jq/) to traverse JSON log files, when you're not running Kiev in *development mode*.
424
435
 
436
+ ## Suffixing `tree_path`
437
+
438
+ Kiev is built upon the assumption that one request is handled once. This isn't always true.
439
+
440
+ A practical example: multiple Amazon SQS queues subscribed to one Amazon SNS topic. You send one message to SNS and queues receive identical copies that are impossible to distinguish in the trace without any help from the outside.
441
+
442
+ You can solve this by adding a fixed unique suffix inside each queue processor. Preferably a single character with an even number in the alphabet (B, D, F and so on), to maintain the notion of "asynchronous processing" used throughout Kiev.
443
+
444
+ For a combination of SNS and [Shoryuken](https://github.com/phstc/shoryuken) (SQS consumer). Here's how you can use it:
445
+
446
+ * Enable "Raw Message Delivery" in your SQS-to-SNS subscriptions
447
+ * On sender, write `Kiev::SubrequestHelper.payload` into the message attributes
448
+ * On each receiver, use `Kiev::Shoryuken::suffix_tree_path` with a unique tag, like this:
449
+
450
+ ```ruby
451
+ # Suffix a single worker class:
452
+ class MyWorker
453
+ include Shoryuken::Worker
454
+ Kiev::Shoryuken.suffix_tree_path(self, "B")
455
+ # ...
456
+ end
457
+
458
+ # Or use a suffix process-wide:
459
+ Shoryuken.configure_server do |config|
460
+ Kiev::Shoryuken.suffix_tree_path(config, "B")
461
+ end
462
+ ```
463
+
464
+ Here's an example of the possble `tree_path` sequence you could get by configuring two consumers with suffixes `1` and `2` (note ordering by `tree_path`):
465
+
466
+ | `tree_path` | Meaning |
467
+ |-------------|-----------------------------------------------------------------|
468
+ | `A` | An entry point into the system, a synchronous request |
469
+ | `AB` | Background job caused by `A` executed |
470
+ | `ABA` | Synchoronous request made from `AB` |
471
+ | `ABD` | _(Not logged by Kiev itself)_ `AB` sends out an SNS message |
472
+ | `ABD1` | Message `ABD` handled by susbcriber `1` |
473
+ | `ABD1A` | Synchronous request sent by `1` when handling the message `ABD` |
474
+ | `ABD1C` | Synchronous request sent by `1` when handling the message `ABD` |
475
+ | `ABD2` | Message `ABD` handled by susbcriber `2` |
476
+ | `ABD2A` | Synchronous request sent by `2` when handling the message `ABD` |
477
+ | `ABF` | Another backgound job from `AB` executed |
478
+ | `AD` | Background job caused by `A` executed |
479
+ | `AE` | Synchronous request made from `A` |
480
+
481
+ Without suffixing you won't see at a glance who made the request `ABDC` and you will have two entries for both `ABD` and `ABDA`. As different subscribers may log different fields, you might be able to tell apart `ABD`s. But both `ABDA`s could happen on the same node and be logged with the same lines of code.
482
+
425
483
  ## Alternatives
426
484
 
427
485
  ### Logging
@@ -0,0 +1,9 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "aws-sdk", "~> 2.0"
4
+ gem "shoryuken", "~> 3.1.0"
5
+
6
+ gem "rack-test", require: false
7
+ gem "minitest-reporters", require: false
8
+
9
+ gemspec :path => "../"
data/lib/kiev.rb CHANGED
@@ -4,6 +4,7 @@ require_relative "kiev/base"
4
4
  require_relative "kiev/rack" if defined?(Rack)
5
5
  require_relative "kiev/railtie" if defined?(Rails)
6
6
  require_relative "kiev/sidekiq" if defined?(Sidekiq)
7
+ require_relative "kiev/shoryuken" if defined?(Shoryuken)
7
8
  require_relative "kiev/her_ext/client_request_id" if defined?(Faraday)
8
9
  require_relative "kiev/httparty" if defined?(HTTParty)
9
10
  require_relative "kiev/que/job" if defined?(Que::Job)
data/lib/kiev/base.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "request_store"
4
4
  require "ruby_dig"
5
5
  require_relative "request_store"
6
+ require_relative "request_logger"
6
7
  require_relative "logger"
7
8
  require_relative "param_filter"
8
9
  require_relative "request_body_filter"
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ # Abstracts common details about reading tracing context
5
+ # into Kiev's request store. Subclass and override #[] to
6
+ # change field lookup.
7
+ class ContextReader
8
+ REQUEST_ID = "request_id"
9
+ REQUEST_DEPTH = "request_depth"
10
+ TREE_PATH = "tree_path"
11
+
12
+ def initialize(subject)
13
+ @subject = subject
14
+ end
15
+
16
+ def [](key)
17
+ subject[key]
18
+ end
19
+
20
+ def request_id
21
+ self[REQUEST_ID] || SecureRandom.uuid
22
+ end
23
+
24
+ def tree_root?
25
+ !self[REQUEST_ID]
26
+ end
27
+
28
+ def request_depth
29
+ tree_root? ? 0 : (self[REQUEST_DEPTH].to_i + 1)
30
+ end
31
+
32
+ def tree_path
33
+ if tree_root?
34
+ SubrequestHelper.root_path(synchronous: false)
35
+ else
36
+ self[TREE_PATH]
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :subject
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module RequestId
5
+ module Mixin
6
+ NEW_LINE = "\n"
7
+
8
+ def wrap_request_id(context_reader, &_block)
9
+ request_store = Kiev::RequestStore.store
10
+ request_store[:request_id] = context_reader.request_id
11
+ request_store[:request_depth] = context_reader.request_depth
12
+ request_store[:tree_path] = context_reader.tree_path
13
+ yield
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module RequestLogger
5
+ module Mixin
6
+ NEW_LINE = "\n"
7
+
8
+ def wrap_request_logger(event, **data, &_block)
9
+ began_at = Time.now
10
+ error = nil
11
+
12
+ begin
13
+ return_value = yield
14
+ rescue StandardError => exception
15
+ error = exception
16
+ end
17
+
18
+ begin
19
+ data[:request_duration] = ((Time.now - began_at) * 1000).round(3)
20
+ if error
21
+ data[:error_class] = error.class.name
22
+ data[:error_message] = error.message[0..5000]
23
+ data[:error_backtrace] = Array(error.backtrace).join(NEW_LINE)[0..5000]
24
+ end
25
+
26
+ Kiev.event(event, data)
27
+ ensure
28
+ raise error if error
29
+ return_value
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Kiev
6
+ module Shoryuken
7
+ require_relative "shoryuken/middleware"
8
+
9
+ class << self
10
+ def enable(base = nil)
11
+ base ||= ::Shoryuken
12
+ base.configure_client do |config|
13
+ enable_client_middleware(config)
14
+ end
15
+ base.configure_server do |config|
16
+ enable_client_middleware(config)
17
+ enable_server_middleware(config)
18
+ end
19
+ end
20
+
21
+ def enable_server_middleware(config)
22
+ server_mw_enabled = false
23
+ config.server_middleware do |chain|
24
+ chain.add(Middleware::RequestStore)
25
+ chain.add(Middleware::RequestId)
26
+ chain.add(Middleware::StoreRequestDetails)
27
+ chain.add(Middleware::RequestLogger)
28
+ server_mw_enabled = true
29
+ end
30
+ server_mw_enabled # Shoryuken configuration may skip that block in non-worker setups
31
+ end
32
+
33
+ def enable_client_middleware(config)
34
+ config.client_middleware do |chain|
35
+ chain.add(Middleware::MessageTracer)
36
+ end
37
+ end
38
+
39
+ def suffix_tree_path(config, tag)
40
+ config.server_middleware do |chain|
41
+ chain.insert_after(Middleware::RequestId, Middleware::TreePathSuffix, tag)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "kiev/context_reader"
4
+
5
+ module Kiev
6
+ module Shoryuken
7
+ class ContextReader < Kiev::ContextReader
8
+ def initialize(message)
9
+ super
10
+ @message_attributes = message.message_attributes
11
+ end
12
+
13
+ def [](key)
14
+ return unless @message_attributes.key?(key)
15
+ attribute_value = @message_attributes[key]
16
+ return unless attribute_value.data_type == "String"
17
+ attribute_value.string_value
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Client middleware
4
+ require_relative "middleware/message_tracer"
5
+
6
+ # Server middleware
7
+ require_relative "middleware/request_id"
8
+ require_relative "middleware/request_logger"
9
+ require_relative "middleware/request_store"
10
+ require_relative "middleware/store_request_details"
11
+ require_relative "middleware/tree_path_suffix"
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module Shoryuken
5
+ module Middleware
6
+ class MessageTracer
7
+ 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
15
+ yield
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require "kiev/request_id"
5
+ require "kiev/shoryuken/context_reader"
6
+
7
+ module Kiev
8
+ module Shoryuken
9
+ module Middleware
10
+ class RequestId
11
+ include Kiev::RequestId::Mixin
12
+
13
+ def call(_worker, _queue, message, _body, &block)
14
+ context_reader = Kiev::Shoryuken::ContextReader.new(message)
15
+ wrap_request_id(context_reader, &block)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module Shoryuken
5
+ module Middleware
6
+ class RequestLogger
7
+ include Kiev::RequestLogger::Mixin
8
+
9
+ def call(_worker, _queue, _message, body, &block)
10
+ wrap_request_logger(:job_finished, body: body, &block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module Shoryuken
5
+ module Middleware
6
+ class RequestStore
7
+ include Kiev::RequestStore::Mixin
8
+
9
+ def call(_worker, _queue, _message, _body, &block)
10
+ wrap_request_store(&block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "kiev/shoryuken/context_reader"
4
+
5
+ module Kiev
6
+ module Shoryuken
7
+ module Middleware
8
+ class StoreRequestDetails
9
+ def call(_worker, _queue, message, _body)
10
+ context_reader = Kiev::Shoryuken::ContextReader.new(message)
11
+ Config.instance.jobs_propagated_fields.each do |key|
12
+ Kiev[key] = context_reader[key]
13
+ end
14
+ request_store = Kiev::RequestStore.store
15
+ request_store[:background_job] = true
16
+ request_store[:message_id] = message.message_id
17
+ yield
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kiev
4
+ module Shoryuken
5
+ module Middleware
6
+ class TreePathSuffix
7
+ def initialize(tag)
8
+ @tag = tag.dup.freeze
9
+ end
10
+
11
+ def call(_worker, _queue, _message, _body)
12
+ request_store = Kiev::RequestStore.store
13
+ request_store[:tree_path] ||= ""
14
+ request_store[:tree_path] += @tag
15
+ yield
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,38 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "securerandom"
4
+ require "kiev/request_id"
5
+ require "kiev/context_reader"
4
6
 
5
7
  module Kiev
6
8
  module Sidekiq
7
9
  class RequestId
8
- REQUEST_ID = "request_id"
9
- REQUEST_DEPTH = "request_depth"
10
- TREE_PATH = "tree_path"
10
+ include Kiev::RequestId::Mixin
11
11
 
12
- def call(_worker, job, _queue)
13
- Kiev::RequestStore.store[:request_id] = request_id(job)
14
- Kiev::RequestStore.store[:request_depth] = request_depth(job)
15
- Kiev::RequestStore.store[:tree_path] = tree_path(job)
16
- yield
17
- end
18
-
19
- private
20
-
21
- def request_id(job)
22
- # cron jobs will be triggered without request_id
23
- job[REQUEST_ID] || SecureRandom.uuid
24
- end
25
-
26
- def tree_root?(job)
27
- !job[REQUEST_ID]
28
- end
29
-
30
- def request_depth(job)
31
- tree_root?(job) ? 0 : (job[REQUEST_DEPTH].to_i + 1)
32
- end
33
-
34
- def tree_path(job)
35
- tree_root?(job) ? SubrequestHelper.root_path(synchronous: false) : job[TREE_PATH]
12
+ def call(_worker, job, _queue, &block)
13
+ context_reader = Kiev::ContextReader.new(job)
14
+ wrap_request_id(context_reader, &block)
36
15
  end
37
16
  end
38
17
  end
@@ -3,36 +3,12 @@
3
3
  module Kiev
4
4
  module Sidekiq
5
5
  class RequestLogger
6
- NEW_LINE = "\n"
7
- ARGS = "args"
8
-
9
- def call(_worker, job, _queue)
10
- began_at = Time.now
11
- error = nil
12
-
13
- begin
14
- return_value = yield
15
- rescue Exception => exception
16
- error = exception
17
- end
6
+ include Kiev::RequestLogger::Mixin
18
7
 
19
- begin
20
- data = {
21
- params: job[ARGS],
22
- request_duration: ((Time.now - began_at) * 1000).round(3)
23
- }
24
-
25
- if error
26
- data[:error_class] = error.class.name
27
- data[:error_message] = error.message[0..5000]
28
- data[:error_backtrace] = Array(error.backtrace).join(NEW_LINE)[0..5000]
29
- end
8
+ ARGS = "args"
30
9
 
31
- Kiev.event(:job_finished, data)
32
- ensure
33
- raise error if error
34
- return_value
35
- end
10
+ def call(_worker, job, _queue, &block)
11
+ wrap_request_logger(:job_finished, params: job[ARGS], &block)
36
12
  end
37
13
  end
38
14
  end
data/lib/kiev/test.rb ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Kiev
6
+ # Test helpers for testing both Kiev itself and products that use it.
7
+ module Test
8
+ module Log
9
+ STREAM = StringIO.new
10
+
11
+ module_function
12
+
13
+ def configure
14
+ @logs = []
15
+ Kiev.configure do |c|
16
+ c.log_path = STREAM
17
+ end
18
+ end
19
+
20
+ def clear
21
+ STREAM.rewind
22
+ STREAM.truncate(0)
23
+ @logs = []
24
+ end
25
+
26
+ def entries
27
+ return @logs unless @logs.empty?
28
+ @logs = raw_logs.each_line.map(&::JSON.method(:parse))
29
+ rescue
30
+ puts raw_logs
31
+ raise
32
+ end
33
+
34
+ def raw_logs
35
+ STREAM.string
36
+ end
37
+ end
38
+ end
39
+ 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 = "2.7.3"
4
+ VERSION = "2.8.0"
5
5
  end
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: 2.7.3
4
+ version: 2.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: 2017-10-18 00:00:00.000000000 Z
11
+ date: 2018-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -144,6 +144,7 @@ files:
144
144
  - gemfiles/que_0.12.3.gemfile
145
145
  - gemfiles/rails_4.1.gemfile
146
146
  - gemfiles/rails_4.2.gemfile
147
+ - gemfiles/shoryuken_3.1.gemfile
147
148
  - gemfiles/sidekiq_4.2.gemfile
148
149
  - gemfiles/sinatra_1.4.gemfile
149
150
  - gemfiles/sinatra_2.0.gemfile
@@ -153,6 +154,7 @@ files:
153
154
  - lib/kiev/base.rb
154
155
  - lib/kiev/base52.rb
155
156
  - lib/kiev/config.rb
157
+ - lib/kiev/context_reader.rb
156
158
  - lib/kiev/her_ext/client_request_id.rb
157
159
  - lib/kiev/httparty.rb
158
160
  - lib/kiev/json.rb
@@ -170,7 +172,18 @@ files:
170
172
  - lib/kiev/request_body_filter/form_data.rb
171
173
  - lib/kiev/request_body_filter/json.rb
172
174
  - lib/kiev/request_body_filter/xml.rb
175
+ - lib/kiev/request_id.rb
176
+ - lib/kiev/request_logger.rb
173
177
  - lib/kiev/request_store.rb
178
+ - lib/kiev/shoryuken.rb
179
+ - lib/kiev/shoryuken/context_reader.rb
180
+ - lib/kiev/shoryuken/middleware.rb
181
+ - lib/kiev/shoryuken/middleware/message_tracer.rb
182
+ - lib/kiev/shoryuken/middleware/request_id.rb
183
+ - lib/kiev/shoryuken/middleware/request_logger.rb
184
+ - lib/kiev/shoryuken/middleware/request_store.rb
185
+ - lib/kiev/shoryuken/middleware/store_request_details.rb
186
+ - lib/kiev/shoryuken/middleware/tree_path_suffix.rb
174
187
  - lib/kiev/sidekiq.rb
175
188
  - lib/kiev/sidekiq/client_request_id.rb
176
189
  - lib/kiev/sidekiq/request_id.rb
@@ -178,6 +191,7 @@ files:
178
191
  - lib/kiev/sidekiq/request_store.rb
179
192
  - lib/kiev/sidekiq/store_request_details.rb
180
193
  - lib/kiev/subrequest_helper.rb
194
+ - lib/kiev/test.rb
181
195
  - lib/kiev/util.rb
182
196
  - lib/kiev/version.rb
183
197
  homepage: https://github.com/blacklane/kiev