Class: OpenTrace::TraceFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/opentrace/trace_formatter.rb

Overview

Wraps an existing log formatter to inject trace context. The injected context appears as a suffix: [trace_id=abc123 request_id=def456]

Usage:

Rails.logger.formatter = OpenTrace::TraceFormatter.new(Rails.logger.formatter)

Instance Method Summary collapse

Constructor Details

#initialize(original_formatter = nil) ⇒ TraceFormatter

Returns a new instance of TraceFormatter.



11
12
13
# File 'lib/opentrace/trace_formatter.rb', line 11

def initialize(original_formatter = nil)
  @original = original_formatter || ::Logger::Formatter.new
end

Instance Method Details

#call(severity, datetime, progname, msg) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/opentrace/trace_formatter.rb', line 54

def call(severity, datetime, progname, msg)
  formatted = @original.call(severity, datetime, progname, msg)
  trace_prefix = build_trace_prefix

  if trace_prefix && formatted.is_a?(String)
    # Append trace context before the trailing newline
    if formatted.end_with?("\n")
      "#{formatted.chomp} #{trace_prefix}\n"
    else
      "#{formatted} #{trace_prefix}"
    end
  else
    formatted
  end
rescue StandardError
  formatted || @original.call(severity, datetime, progname, msg)
end

#clear_tags!Object



42
43
44
# File 'lib/opentrace/trace_formatter.rb', line 42

def clear_tags!
  @original.clear_tags! if @original.respond_to?(:clear_tags!)
end

#current_tagsObject



26
27
28
29
30
31
32
# File 'lib/opentrace/trace_formatter.rb', line 26

def current_tags
  if @original.respond_to?(:current_tags)
    @original.current_tags
  else
    []
  end
end

#pop_tags(count = 1) ⇒ Object



22
23
24
# File 'lib/opentrace/trace_formatter.rb', line 22

def pop_tags(count = 1)
  @original.pop_tags(count) if @original.respond_to?(:pop_tags)
end

#push_tags(*tags) ⇒ Object

Delegate ActiveSupport::TaggedLogging::Formatter interface to the original formatter so that Rails::Rack::Logger#push_tags works when TraceFormatter replaces the logger’s formatter.



18
19
20
# File 'lib/opentrace/trace_formatter.rb', line 18

def push_tags(*tags)
  @original.push_tags(*tags) if @original.respond_to?(:push_tags)
end

#tagged(*tags) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/opentrace/trace_formatter.rb', line 34

def tagged(*tags)
  if @original.respond_to?(:tagged)
    @original.tagged(*tags) { yield }
  else
    yield
  end
end

#tags_textObject



46
47
48
49
50
51
52
# File 'lib/opentrace/trace_formatter.rb', line 46

def tags_text
  if @original.respond_to?(:tags_text)
    @original.tags_text
  else
    ""
  end
end