Module: ActionView::Tracer

Defined in:
lib/rails/action_view/tracer.rb

Constant Summary collapse

COMPONENT =
"ActionView".freeze

Class Method Summary collapse

Class Method Details

.disableObject



20
21
22
23
24
25
26
# File 'lib/rails/action_view/tracer.rb', line 20

def disable
  @subscribers.each do |subscriber|
    ::ActiveSupport::Notifications.unsubscribe(subscriber)
  end
  @subscribers = []
  self
end

.handle_notification(tracer:, active_span:, id:, name:, tags:, start:, finish:) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/rails/action_view/tracer.rb', line 84

def handle_notification(tracer:, active_span:, id:, name:, tags:, start:, finish:)
  if !Rails::Tracer::Defer.enabled
    span = tracer.start_span(name,
                             child_of: active_span.respond_to?(:call) ? active_span.call : active_span,
                             start_time: start,
                             tags: tags)

    span.finish(end_time: finish)
  else
    spaninfo = {
      'event' => name,
      'name' => name,
      'start' => start,
      'finish' => finish,
      'tags' => tags,
    }
    Rails::Tracer::Defer.defer_span(id: id, spaninfo: spaninfo)
  end
end

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



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/rails/action_view/tracer.rb', line 7

def instrument(tracer: OpenTracing.global_tracer, active_span: nil)
  @subscribers = []
  @subscribers << ::ActiveSupport::Notifications.subscribe('render_template.action_view') do |*args|
    ActionView::Tracer.render_template(tracer: tracer, active_span: active_span, args: args)
  end
  @subscribers << ::ActiveSupport::Notifications.subscribe('render_partial.action_view') do |*args|
    ActionView::Tracer.render_partial(tracer: tracer, active_span: active_span, args: args)
  end
  @subscribers << ::ActiveSupport::Notifications.subscribe('render_collection.action_view') do |*args|
    ActionView::Tracer.render_collection(tracer: tracer, active_span: active_span, args: args)
  end
end

.render_collection(tracer: OpenTracing.global_tracer, active_span: nil, args: {}) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/rails/action_view/tracer.rb', line 65

def render_collection(tracer: OpenTracing.global_tracer, active_span: nil, args: {})
  event, start, finish, id, payload = *args

  tags = {
    'component' => COMPONENT,
    'span.kind' => 'client',
    'template_path' => payload.fetch(:identifier),
    'collection_size' => payload.fetch(:count),
  }

  handle_notification(tracer: tracer,
                      active_span: active_span,
                      id: id,
                      name: event,
                      tags: tags,
                      start: start,
                      finish: finish)
end

.render_partial(tracer: OpenTracing.global_tracer, active_span: nil, args: {}) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rails/action_view/tracer.rb', line 47

def render_partial(tracer: OpenTracing.global_tracer, active_span: nil, args: {})
  event, start, finish, id, payload = *args

  tags = {
    'component' => COMPONENT,
    'span.kind' => 'client',
    'template_path' => payload.fetch(:identifier),
  }

  handle_notification(tracer: tracer,
                      active_span: active_span,
                      id: id,
                      name: event,
                      tags: tags,
                      start: start,
                      finish: finish)
end

.render_template(tracer: OpenTracing.global_tracer, active_span: nil, args: {}) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rails/action_view/tracer.rb', line 28

def render_template(tracer: OpenTracing.global_tracer, active_span: nil, args: {})
  event, start, finish, id, payload = *args

  tags = {
    'component' => COMPONENT,
    'span.kind' => 'client',
    'template_path' => payload.fetch(:identifier),
    'layout' => payload.fetch(:layout),
  }

  handle_notification(tracer: tracer,
                      active_span: active_span,
                      id: id,
                      name: event,
                      tags: tags,
                      start: start,
                      finish: finish)
end