From 482b48a970f2eef16a08586f3bc8103a3157512c Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Fri, 9 Aug 2024 16:05:22 -0700 Subject: [PATCH] Emit log message for incompatible Lograge setup --- .../tracing/contrib/lograge/patcher.rb | 16 ++++++++++++++ .../tracing/contrib/lograge/patcher_spec.rb | 21 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/datadog/tracing/contrib/lograge/patcher.rb b/lib/datadog/tracing/contrib/lograge/patcher.rb index e27bc8bbfa2..4179a072edd 100644 --- a/lib/datadog/tracing/contrib/lograge/patcher.rb +++ b/lib/datadog/tracing/contrib/lograge/patcher.rb @@ -20,6 +20,22 @@ def target_version # patch applies our patch def patch + # ActiveSupport::TaggedLogging is the default Rails logger since Rails 5 + if defined?(::ActiveSupport::TaggedLogging::Formatter) && + ::Lograge::LogSubscribers::ActionController + .logger&.formatter.is_a?(::ActiveSupport::TaggedLogging::Formatter) + + Datadog.logger.error( + 'Lograge and ActiveSupport::TaggedLogging (the default Rails log formatter) are not compatible: ' \ + 'Lograge does not account for Rails log tags, creating polluted logs and breaking log formatting. ' \ + 'Traces and Logs correlation may not work. ' \ + 'Either: 1. Disable tagged logging in your Rails configuration ' \ + '`config.logger = ActiveSupport::Logger.new(STDOUT); ' \ + 'config.active_job.logger = ActiveSupport::Logger.new(STDOUT)` ' \ + 'or 2. Use the `semantic_logger` gem instead of `lograge`.' + ) + end + ::Lograge::LogSubscribers::Base.include(Instrumentation) end end diff --git a/spec/datadog/tracing/contrib/lograge/patcher_spec.rb b/spec/datadog/tracing/contrib/lograge/patcher_spec.rb index 23536af465b..9aaeb0e26e8 100644 --- a/spec/datadog/tracing/contrib/lograge/patcher_spec.rb +++ b/spec/datadog/tracing/contrib/lograge/patcher_spec.rb @@ -5,10 +5,31 @@ RSpec.describe Datadog::Tracing::Contrib::Lograge::Patcher do describe '.patch' do + before { described_class.instance_variable_get(:@patch_only_once)&.send(:reset_ran_once_state_for_tests) } + it 'adds Instrumentation to ancestors of LogSubscribers::Base class' do described_class.patch expect(Lograge::LogSubscribers::Base.ancestors).to include(Datadog::Tracing::Contrib::Lograge::Instrumentation) end + + context 'without Rails tagged logging' do + it 'does not log incompatibility error' do + expect(Datadog.logger).to_not receive(:error) + + described_class.patch + end + end + + context 'with Rails tagged logging' do + it 'logs an incompatibility error' do + logger = ActiveSupport::TaggedLogging.new(Logger.new(File::NULL)) + stub_const('Lograge::LogSubscribers::ActionController', double('controller', logger: logger)) + + expect(Datadog.logger).to receive(:error).with(/ActiveSupport::TaggedLogging/) + + described_class.patch + end + end end end