Module: ActiveRecord::RailsOpentracer

Defined in:
lib/rails_opentracer/active_record/rails_opentracer.rb

Constant Summary collapse

DEFAULT_OPERATION_NAME =
"sql.query".freeze

Class Method Summary collapse

Class Method Details

.disableObject Also known as: clear_subscribers



15
16
17
18
19
20
21
22
# File 'lib/rails_opentracer/active_record/rails_opentracer.rb', line 15

def disable
  if @subscriber
    ActiveSupport::Notifications.unsubscribe(@subscriber)
    @subscriber = nil
  end

  self
end

.instrument(tracer: OpenTracing.global_tracer, active_span: nil) ⇒ Object



6
7
8
9
10
11
12
13
# File 'lib/rails_opentracer/active_record/rails_opentracer.rb', line 6

def instrument(tracer: OpenTracing.global_tracer, active_span: nil)
  clear_subscribers
  @subscriber = ::ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
    ActiveRecord::RailsOpentracer.sql(tracer: tracer, active_span: active_span, args: args)
  end

  self
end

.sql(tracer: OpenTracing.global_tracer, active_span: nil, args:) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/rails_opentracer/active_record/rails_opentracer.rb', line 25

def sql(tracer: OpenTracing.global_tracer, active_span: nil, args:)
  _, start, finish, _, payload = *args

  span = start_span(payload.fetch(:name),
                    tracer: tracer,
                    active_span: active_span,
                    start_time: start,
                    sql: payload.fetch(:sql),
                    cached: payload.fetch(:cached, false),
                    connection_id: payload.fetch(:connection_id))

  if payload[:exception]
    ::RailsOpentracer::SpanHelpers.set_error(span, payload[:exception_object] || payload[:exception])
  end

  span.finish(end_time: finish)
end

.start_span(operation_name, tracer: OpenTracing.global_tracer, active_span: nil, start_time: Time.now, **fields) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/rails_opentracer/active_record/rails_opentracer.rb', line 44

def start_span(operation_name, tracer: OpenTracing.global_tracer, active_span: nil, start_time: Time.now, **fields)
  connection_config = ::ActiveRecord::Base.connection_config

  span = tracer.start_span(operation_name || DEFAULT_OPERATION_NAME,
                           child_of: active_span.respond_to?(:call) ? active_span.call : active_span,
                           start_time: start_time,
                           tags: {
                            'component' => 'ActiveRecord',
                            'span.kind' => 'client',
                            'db.user' => connection_config.fetch(:username, 'unknown'),
                            'db.instance' => connection_config.fetch(:database),
                            'db.vendor' => connection_config.fetch(:adapter),
                            'db.connection_id' => fields.fetch(:connection_id, 'unknown'),
                            'db.cached' => fields.fetch(:cached, false),
                            'db.statement' => fields.fetch(:sql),
                            'db.type' => 'sql'
                           })
  span
end