1b90ffc573
This change will publish distributed tracing spans related to SQL ActiveRecord queries. These queries are unbound, so will still contain parameter substitution strings in place of actual parameter values. This ensures that the SQL strings do not need to be scrubbed, since the values are not included in the SQL. More details of rails instrumentation can be found here: https://guides.rubyonrails.org/active_support_instrumentation.html
69 lines
1.8 KiB
Ruby
69 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'opentracing'
|
|
|
|
module Gitlab
|
|
module Tracing
|
|
module Common
|
|
def tracer
|
|
OpenTracing.global_tracer
|
|
end
|
|
|
|
# Convience method for running a block with a span
|
|
def in_tracing_span(operation_name:, tags:, child_of: nil)
|
|
scope = tracer.start_active_span(
|
|
operation_name,
|
|
child_of: child_of,
|
|
tags: tags
|
|
)
|
|
span = scope.span
|
|
|
|
# Add correlation details to the span if we have them
|
|
correlation_id = Gitlab::CorrelationId.current_id
|
|
if correlation_id
|
|
span.set_tag('correlation_id', correlation_id)
|
|
end
|
|
|
|
begin
|
|
yield span
|
|
rescue => e
|
|
log_exception_on_span(span, e)
|
|
raise e
|
|
ensure
|
|
scope.close
|
|
end
|
|
end
|
|
|
|
def postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil)
|
|
span = OpenTracing.start_span(operation_name, start_time: start_time, tags: tags, child_of: child_of)
|
|
|
|
log_exception_on_span(span, exception) if exception
|
|
|
|
span.finish(end_time: end_time)
|
|
end
|
|
|
|
def log_exception_on_span(span, exception)
|
|
span.set_tag('error', true)
|
|
span.log_kv(kv_tags_for_exception(exception))
|
|
end
|
|
|
|
def kv_tags_for_exception(exception)
|
|
case exception
|
|
when Exception
|
|
{
|
|
'event': 'error',
|
|
'error.kind': exception.class.to_s,
|
|
'message': Gitlab::UrlSanitizer.sanitize(exception.message),
|
|
'stack': exception.backtrace&.join("\n")
|
|
}
|
|
else
|
|
{
|
|
'event': 'error',
|
|
'error.kind': exception.class.to_s,
|
|
'error.object': Gitlab::UrlSanitizer.sanitize(exception.to_s)
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|