Class: Labkit::Tracing::TracingUtils

Inherits:
Object
  • Object
show all
Defined in:
lib/labkit/tracing/tracing_utils.rb

Overview

Internal methods for tracing. This is not part of the LabKit public API. For internal usage only

Class Method Summary collapse

Class Method Details

.include_stacktrace?(operation_name) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
76
77
78
79
# File 'lib/labkit/tracing/tracing_utils.rb', line 73

def self.include_stacktrace?(operation_name)
  @include_stacktrace ||= Hash.new do |result, name|
    result[name] = Tracing.stacktrace_operations.any? { |stacktrace_operation| name.starts_with?(stacktrace_operation) }
  end

  @include_stacktrace[operation_name]
end

.kv_tags_for_exception(exception) ⇒ Object

Generate key-value tags for an exception



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/labkit/tracing/tracing_utils.rb', line 59

def self.kv_tags_for_exception(exception)
  case exception
  when Exception
    {
      :"event" => "error",
      :"error.kind" => exception.class.to_s,
      :"message" => Labkit::Logging::Sanitizer.sanitize_field(exception.message),
      :"stack" => exception.backtrace&.join('\n'),
    }
  else
    { :"event" => "error", :"error.kind" => exception.class.to_s, :"error.object" => Labkit::Logging::Sanitizer.sanitize_field(exception.to_s) }
  end
end

.log_common_fields_on_span(span, operation_name) ⇒ Object

Add common fields to a span



44
45
46
47
48
# File 'lib/labkit/tracing/tracing_utils.rb', line 44

def self.log_common_fields_on_span(span, operation_name)
  correlation_id = Labkit::Correlation::CorrelationId.current_id
  span.set_tag("correlation_id", correlation_id) if correlation_id
  span.log_kv(stack: caller.join('\n')) if include_stacktrace?(operation_name)
end

.log_exception_on_span(span, exception) ⇒ Object

Add exception logging to a span



51
52
53
54
55
56
# File 'lib/labkit/tracing/tracing_utils.rb', line 51

def self.log_exception_on_span(span, exception)
  return if exception.blank?

  span.set_tag("error", true)
  span.log_kv(**kv_tags_for_exception(exception))
end

.postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil) ⇒ Object

Generate a span retrospectively



34
35
36
37
38
39
40
41
# File 'lib/labkit/tracing/tracing_utils.rb', line 34

def self.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_common_fields_on_span(span, operation_name)
  log_exception_on_span(span, exception) if exception

  span.finish(end_time: end_time)
end

.tracerObject

Obtain a tracer instance



29
30
31
# File 'lib/labkit/tracing/tracing_utils.rb', line 29

def self.tracer
  OpenTracing.global_tracer
end

.with_tracing(operation_name:, tags:, child_of: nil) ⇒ Object

Convience method for running a block with a span



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/labkit/tracing/tracing_utils.rb', line 12

def self.with_tracing(operation_name:, tags:, child_of: nil)
  scope = tracer.start_active_span(operation_name, child_of: child_of, tags: tags)
  span = scope.span

  log_common_fields_on_span(span, operation_name)

  begin
    yield span
  rescue StandardError => e
    log_exception_on_span(span, e)
    raise e
  ensure
    scope.close
  end
end