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 +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +1 -0
- data/README.md +67 -9
- data/gemfiles/shoryuken_3.1.gemfile +9 -0
- data/lib/kiev.rb +1 -0
- data/lib/kiev/base.rb +1 -0
- data/lib/kiev/context_reader.rb +44 -0
- data/lib/kiev/request_id.rb +17 -0
- data/lib/kiev/request_logger.rb +34 -0
- data/lib/kiev/shoryuken.rb +46 -0
- data/lib/kiev/shoryuken/context_reader.rb +21 -0
- data/lib/kiev/shoryuken/middleware.rb +11 -0
- data/lib/kiev/shoryuken/middleware/message_tracer.rb +20 -0
- data/lib/kiev/shoryuken/middleware/request_id.rb +20 -0
- data/lib/kiev/shoryuken/middleware/request_logger.rb +15 -0
- data/lib/kiev/shoryuken/middleware/request_store.rb +15 -0
- data/lib/kiev/shoryuken/middleware/store_request_details.rb +22 -0
- data/lib/kiev/shoryuken/middleware/tree_path_suffix.rb +20 -0
- data/lib/kiev/sidekiq/request_id.rb +6 -27
- data/lib/kiev/sidekiq/request_logger.rb +4 -28
- data/lib/kiev/test.rb +39 -0
- data/lib/kiev/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c95641b776dbecacfb3c20627bdca29ed253a5a5
|
4
|
+
data.tar.gz: 04e91ef07a297c90b94011b115e429a188b2df5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Kiev [![Build Status](https://travis-ci.
|
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
|
-
|
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
|
-
|
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
|
-
|
195
|
+
* `request_depth` represents the position of the current request within a chain of requests. It starts with 0.
|
185
196
|
|
186
|
-
|
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
|
-
|
199
|
+
* `request_duration` is measured in miliseconds.
|
189
200
|
|
190
|
-
|
201
|
+
* `body` attribute coresponds to the response body and will be logged depending on the `#log_response_body_condition` option.
|
191
202
|
|
192
|
-
|
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
|
-
|
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
|
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
@@ -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
|
-
|
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::
|
14
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
32
|
-
|
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
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.
|
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:
|
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
|