Skip to content

Commit 8989e7c

Browse files
committed
Fix missing trace.id/span.id in NewRelic logs
These let NewRelic tie log messages to specific transactions. They're thread-local, so trying to capture them from an async appender thread would return nil
1 parent 4b948bb commit 8989e7c

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55

66
## [unreleased]
77

8+
- Fix missing trace.id/span.id in NewRelic logs
9+
810
## [4.17.0]
911

1012
- Correct `source_code_uri` URL

lib/semantic_logger/formatters/new_relic_logs.rb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def call(log, logger)
4747
hash = super
4848

4949
result = {
50-
**newrelic_metadata,
50+
**log.newrelic_metadata,
5151
message: hash[:message].to_s,
5252
tags: hash[:tags],
5353
metric: hash[:metric],
@@ -112,15 +112,19 @@ def call(log, logger)
112112

113113
result
114114
end
115+
end
115116

116-
private
117+
module NewRelicMetadata
118+
attr_reader :newrelic_metadata
117119

118-
# NOTE: This function will already include trace.id and span.id if they
119-
# are available so I believe the previous implementation of this is redundant
120-
# https://rubydoc.info/gems/newrelic_rpm/NewRelic/Agent#linking_metadata-instance_method
121-
def newrelic_metadata
122-
NewRelic::Agent.linking_metadata.transform_keys(&:to_sym)
120+
def initialize(*)
121+
super
122+
# Record NewRelic's "trace.id"/"entity.name"/"hostname"/etc, so we can include them later in the formatted output.
123+
# These are thread-local, so need to be captured as soon as the log-message is created.
124+
# https://rubydoc.info/gems/newrelic_rpm/NewRelic/Agent#linking_metadata-instance_method
125+
@newrelic_metadata = NewRelic::Agent.linking_metadata
123126
end
124127
end
128+
Log.prepend NewRelicMetadata
125129
end
126130
end

test/formatters/new_relic_logs_test.rb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,19 +174,24 @@ class NewRelicLogsTest < Minitest::Test
174174

175175
describe "metadata" do
176176
it "includes trace.id and span.id if present" do
177+
# Simulate recording a log message within a Rails transaction, where trace.id has been set on the current thread
177178
NewRelic::Agent.stub(:linking_metadata, {"trace.id" => "trace123", "span.id" => "span456"}) do
178-
result = formatted_log
179-
assert_equal "trace123", result[:"trace.id"]
180-
assert_equal "span456", result[:"span.id"]
179+
log
181180
end
181+
# ... which is then formatted on the async appender thread
182+
result = formatted_log
183+
assert_equal "trace123", result["trace.id"]
184+
assert_equal "span456", result["span.id"]
182185
end
183186

184187
it "omits trace.id and span.id if absent" do
185188
NewRelic::Agent.stub(:linking_metadata, {}) do
186-
result = formatted_log
187-
refute result.key?(:"trace.id")
188-
refute result.key?(:"span.id")
189+
log
189190
end
191+
192+
result = formatted_log
193+
refute result.key?("trace.id")
194+
refute result.key?("span.id")
190195
end
191196
end
192197
end

0 commit comments

Comments
 (0)