Skip to content

Commit 807ad34

Browse files
authored
Merge pull request #173 from rage-rb/deferred-log-context
Pass all of log data to deferred tasks
2 parents a715ffe + 270e6a7 commit 807ad34

6 files changed

Lines changed: 89 additions & 38 deletions

File tree

lib/rage/deferred/context.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
#
77
class Rage::Deferred::Context
88
def self.build(task, args, kwargs, storage: nil)
9-
request_id = Thread.current[:rage_logger][:tags][0] if Thread.current[:rage_logger]
9+
logger = Thread.current[:rage_logger]
1010

1111
[
1212
task,
1313
args.empty? ? nil : args,
1414
kwargs.empty? ? nil : kwargs,
1515
nil,
16-
request_id
16+
logger&.dig(:tags),
17+
logger&.dig(:context)
1718
]
1819
end
1920

@@ -37,7 +38,11 @@ def self.inc_attempts(context)
3738
context[3] = context[3].to_i + 1
3839
end
3940

40-
def self.get_request_id(context)
41+
def self.get_log_tags(context)
4142
context[4]
4243
end
44+
45+
def self.get_log_context(context)
46+
context[5]
47+
end
4348
end

lib/rage/deferred/task.rb

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,37 @@ module Rage::Deferred::Task
4040
def perform
4141
end
4242

43-
# @private
44-
def __with_optional_log_tag(tag)
45-
if tag
46-
Rage.logger.tagged(tag) { yield }
47-
else
48-
yield
49-
end
50-
end
51-
5243
# @private
5344
def __perform(context)
5445
args = Rage::Deferred::Context.get_args(context)
5546
kwargs = Rage::Deferred::Context.get_kwargs(context)
5647
attempts = Rage::Deferred::Context.get_attempts(context)
57-
request_id = Rage::Deferred::Context.get_request_id(context)
5848

59-
log_context = { task: self.class.name }
60-
log_context[:attempt] = attempts + 1 if attempts
49+
restore_log_info(context)
50+
51+
task_log_context = { task: self.class.name }
52+
task_log_context[:attempt] = attempts + 1 if attempts
6153

62-
Rage.logger.with_context(log_context) do
63-
__with_optional_log_tag(request_id) do
64-
perform(*args, **kwargs)
65-
true
66-
rescue Rage::Deferred::TaskFailed
67-
false
68-
rescue Exception => e
69-
Rage.logger.error("Deferred task failed with exception: #{e.class} (#{e.message}):\n#{e.backtrace.join("\n")}")
70-
false
71-
end
54+
Rage.logger.with_context(task_log_context) do
55+
perform(*args, **kwargs)
56+
true
57+
rescue Rage::Deferred::TaskFailed
58+
false
59+
rescue Exception => e
60+
Rage.logger.error("Deferred task failed with exception: #{e.class} (#{e.message}):\n#{e.backtrace.join("\n")}")
61+
false
62+
end
63+
end
64+
65+
private def restore_log_info(context)
66+
log_tags = Rage::Deferred::Context.get_log_tags(context)
67+
log_context = Rage::Deferred::Context.get_log_context(context)
68+
69+
if log_tags.is_a?(Array)
70+
Thread.current[:rage_logger] = { tags: log_tags, context: log_context }
71+
elsif log_tags
72+
# support the previous format where only `request_id` was passed
73+
Thread.current[:rage_logger] = { tags: [log_tags], context: {} }
7274
end
7375
end
7476

@@ -83,6 +85,8 @@ def enqueue(*args, delay: nil, delay_until: nil, **kwargs)
8385
delay:,
8486
delay_until:
8587
)
88+
89+
nil
8690
end
8791

8892
# @private

lib/rage/logger/logger.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,11 @@ def with_context(context)
125125
# Rage.logger.info "success"
126126
# end
127127
def tagged(tag)
128-
(Thread.current[:rage_logger] ||= { tags: [], context: {} })[:tags] << tag
128+
old_tags = (Thread.current[:rage_logger] ||= { tags: [], context: {} })[:tags]
129+
Thread.current[:rage_logger][:tags] = [*old_tags, tag]
129130
yield(self)
130131
ensure
131-
Thread.current[:rage_logger][:tags].pop
132+
Thread.current[:rage_logger][:tags] = old_tags
132133
end
133134

134135
alias_method :with_tag, :tagged

spec/deferred/context_spec.rb

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727

2828
context "when Thread.current[:rage_logger] is set" do
2929
before do
30-
Thread.current[:rage_logger] = { tags: ["req-123"] }
30+
Thread.current[:rage_logger] = { tags: ["req-123", "test"] }
3131
end
3232

33-
it "builds context including request_id" do
33+
it "builds context including log tags" do
3434
context = described_class.build(task, args, kwargs)
35-
expect(context[4]).to eq("req-123")
35+
expect(context[4]).to eq(["req-123", "test"])
3636
end
3737
end
3838
end
@@ -65,10 +65,17 @@
6565
end
6666
end
6767

68-
describe ".get_request_id" do
69-
it "returns the request id from context" do
70-
context = [nil, nil, nil, nil, "req-456"]
71-
expect(described_class.get_request_id(context)).to eq("req-456")
68+
describe ".get_log_tags" do
69+
it "returns log tags from context" do
70+
context = [nil, nil, nil, nil, ["tag-1", "tag-2"]]
71+
expect(described_class.get_log_tags(context)).to eq(["tag-1", "tag-2"])
72+
end
73+
end
74+
75+
describe ".get_log_context" do
76+
it "returns log tags from context" do
77+
context = [nil, nil, nil, nil, nil, { test: true }]
78+
expect(described_class.get_log_context(context)).to eq({ test: true })
7279
end
7380
end
7481

spec/deferred/task_spec.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def perform(arg, kwarg:)
3030
expect(queue).to have_received(:enqueue).with(context, delay: 10, delay_until: nil)
3131
end
3232

33+
it "returns nil" do
34+
result = task_class.enqueue("value", kwarg: "value2", delay: 10)
35+
expect(result).to be_nil
36+
end
37+
3338
it "correctly passes delay_until" do
3439
time = Time.now
3540
task_class.enqueue(delay_until: time)
@@ -75,7 +80,8 @@ def perform(arg, kwarg:)
7580

7681
context "when task succeeds" do
7782
before do
78-
allow(Rage::Deferred::Context).to receive(:get_request_id).with(context).and_return("request-id")
83+
allow(Rage::Deferred::Context).to receive(:get_log_tags).with(context).and_return(["request-id"])
84+
allow(Rage::Deferred::Context).to receive(:get_log_context).with(context).and_return({})
7985
allow(task).to receive(:perform)
8086
end
8187

@@ -87,7 +93,7 @@ def perform(arg, kwarg:)
8793
it "logs with context and tag" do
8894
task.__perform(context)
8995
expect(logger).to have_received(:with_context).with({ task: "MyTask", attempt: 2 })
90-
expect(logger).to have_received(:tagged).with("request-id")
96+
expect(Thread.current[:rage_logger]).to eq({ tags: ["request-id"], context: {} })
9197
end
9298

9399
it "returns true" do
@@ -102,7 +108,8 @@ def perform(arg, kwarg:)
102108

103109
context "when request_id is not present" do
104110
before do
105-
allow(Rage::Deferred::Context).to receive(:get_request_id).with(context).and_return(nil)
111+
allow(Rage::Deferred::Context).to receive(:get_log_tags).with(context).and_return(nil)
112+
allow(Rage::Deferred::Context).to receive(:get_log_context).with(context).and_return({})
106113
allow(task).to receive(:perform)
107114
end
108115

@@ -116,7 +123,8 @@ def perform(arg, kwarg:)
116123
let(:error) { StandardError.new("Something went wrong") }
117124

118125
before do
119-
allow(Rage::Deferred::Context).to receive(:get_request_id).with(context).and_return(nil)
126+
allow(Rage::Deferred::Context).to receive(:get_log_tags).with(context).and_return(nil)
127+
allow(Rage::Deferred::Context).to receive(:get_log_context).with(context).and_return({})
120128
allow(task).to receive(:perform).and_raise(error)
121129
allow(error).to receive(:backtrace).and_return(["line 1", "line 2"])
122130
end

spec/logger_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,19 @@
108108

109109
expect(result).to eq(:success)
110110
end
111+
112+
context "with other process referencing the tags" do
113+
it "doesn't mutate the tags storage" do
114+
referenced_tags = nil
115+
116+
subject.tagged("rspec") do
117+
referenced_tags = Thread.current[:rage_logger][:tags]
118+
subject.info "test passed"
119+
end
120+
121+
expect(referenced_tags).to eq(["my_test_tag", "rspec"])
122+
end
123+
end
111124
end
112125

113126
context "with context" do
@@ -153,6 +166,19 @@
153166

154167
expect(result).to eq(:ok)
155168
end
169+
170+
context "with other process referencing the context" do
171+
it "doesn't mutate the context storage" do
172+
referenced_context = nil
173+
174+
subject.with_context(rspec: true) do
175+
referenced_context = Thread.current[:rage_logger][:context]
176+
subject.info "text"
177+
end
178+
179+
expect(referenced_context).to eq({ rspec: true })
180+
end
181+
end
156182
end
157183

158184
context "outside the request/response cycle" do

0 commit comments

Comments
 (0)