From d7e71dc51dc2f1ee26216244f4518e891e474188 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 | 13 +++++++++++ .../tracing/contrib/lograge/patcher_spec.rb | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/datadog/tracing/contrib/lograge/patcher.rb b/lib/datadog/tracing/contrib/lograge/patcher.rb index e27bc8bbfa2..6d5bd1c3cbb 100644 --- a/lib/datadog/tracing/contrib/lograge/patcher.rb +++ b/lib/datadog/tracing/contrib/lograge/patcher.rb @@ -20,6 +20,19 @@ def target_version # patch applies our patch def patch + # ActiveSupport::TaggedLogging is the default Rails logger since Rails 5 + if defined?(::Rails::VERSION::MAJOR) && ::Rails::VERSION::MAJOR >= 5 + Datadog.logger.error( + 'Lograge and ActiveSupport::TaggedLogging (the default Rails logger) 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..c7b3d72e75c 100644 --- a/spec/datadog/tracing/contrib/lograge/patcher_spec.rb +++ b/spec/datadog/tracing/contrib/lograge/patcher_spec.rb @@ -5,10 +5,32 @@ 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 'with older Rails' do + it 'does not log incompatibility error' do + stub_const('Rails::VERSION::MAJOR', 4) + + expect(Datadog.logger).to_not receive(:error) + + described_class.patch + end + end + + context 'with Rails with tagged logging' do + it 'logs an incompatibility error' do + stub_const('Rails::VERSION::MAJOR', 5) + + expect(Datadog.logger).to receive(:error).with(/ActiveSupport::TaggedLogging/) + + described_class.patch + end + end end end