class ActiveRecord::OpenTracing::Processor

Constants

COMPONENT_NAME
DB_TYPE
DEFAULT_OPERATION_NAME
SPAN_KIND

Attributes

sanitizer[R]
sql_logging_enabled[R]
tracer[R]

Public Class Methods

new(tracer, sanitizer: nil, sql_logging_enabled: true) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 13
def initialize(tracer, sanitizer: nil, sql_logging_enabled: true)
  @tracer = tracer
  @sanitizer = sanitizer
  @sql_logging_enabled = sql_logging_enabled
end

Public Instance Methods

call(_event_name, start, finish, _id, payload) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 19
def call(_event_name, start, finish, _id, payload)
  span = tracer.start_span(
    payload[:name] || DEFAULT_OPERATION_NAME,
    start_time: start,
    tags: tags_for_payload(payload)
  )

  if (exception = payload[:exception_object])
    span.set_tag("error", true)
    span.log_kv(exception_metadata(exception))
  end

  span.finish(end_time: finish)
end

Private Instance Methods

connection_config() click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 78
def connection_config
  @connection_config ||= ActiveRecord::Base.connection_config
end
db_instance() click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 74
def db_instance
  @db_instance ||= connection_config.fetch(:database)
end
db_statement(payload) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 57
def db_statement(payload)
  sql_logging_enabled ? { "db.statement" => sanitize_sql(payload.fetch(:sql).squish) } : {}
end
exception_metadata(exception) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 36
def exception_metadata(exception)
  {
    event: "error",
    'error.kind': exception.class.to_s,
    'error.object': exception,
    message: exception.message,
    stack: exception.backtrace.join("\n")
  }
end
peer_address_tag() click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 65
def peer_address_tag
  @peer_address_tag ||= [
    "#{connection_config.fetch(:adapter)}://",
    connection_config[:username],
    connection_config[:host] && "@#{connection_config[:host]}",
    "/#{db_instance}"
  ].join
end
sanitize_sql(sql) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 61
def sanitize_sql(sql)
  sanitizer ? sanitizer.sanitize(sql) : sql
end
tags_for_payload(payload) click to toggle source
# File lib/active_record/open_tracing/processor.rb, line 46
def tags_for_payload(payload)
  {
    "component" => COMPONENT_NAME,
    "span.kind" => SPAN_KIND,
    "db.instance" => db_instance,
    "db.cached" => payload.fetch(:cached, false),
    "db.type" => DB_TYPE,
    "peer.address" => peer_address_tag
  }.merge(db_statement(payload))
end