Class: ScoutApm::LayerConverters::SlowJobConverter

Inherits:
ConverterBase
  • Object
show all
Defined in:
lib/scout_apm/layer_converters/slow_job_converter.rb

Constant Summary

Constants inherited from ConverterBase

ConverterBase::MAX_METRICS

Instance Attribute Summary

Attributes inherited from ConverterBase

#context, #layer_finder, #request, #root_layer

Instance Method Summary collapse

Methods inherited from ConverterBase

#attach_backtraces, #initialize, #limited?, #make_meta_options, #make_meta_options_desc_hash, #make_meta_options_scope, #over_metric_limit?, #register_hooks, #scope_layer, #store_aggregate_metric, #store_backtrace, #store_specific_metric, #subscope_name, #subscoped?

Constructor Details

This class inherits a constructor from ScoutApm::LayerConverters::ConverterBase

Instance Method Details

#callObject

Called by the set to force this to actually be created.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 29

def call
  return nil unless request.job?
  return nil unless layer_finder.queue
  return nil unless layer_finder.job

  context.slow_job_policy.stored!(request)

  # record the change in memory usage
  mem_delta = ScoutApm::Instruments::Process::ProcessMemory.new(context).rss_to_mb(request.capture_mem_delta!)

  timing_metrics, allocation_metrics = create_metrics

  unless ScoutApm::Instruments::Allocations::ENABLED
    allocation_metrics = {}
  end

  SlowJobRecord.new(
    context,
    queue_layer.name,
    job_layer.name,
    root_layer.stop_time,
    job_layer.total_call_time,
    job_layer.total_exclusive_time,
    request.context,
    timing_metrics,
    allocation_metrics,
    mem_delta,
    job_layer.total_allocations,
    score,
    limited?,
    span_trace
  )
end

#create_metricsObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 63

def create_metrics
  # Create a new walker, and wire up the subscope stuff
  walker = LayerConverters::DepthFirstWalker.new(self.root_layer)
  register_hooks(walker)

  metric_hash = Hash.new
  allocation_metric_hash = Hash.new

  walker.on do |layer|
    next if skip_layer?(layer)

    # The queue_layer is useful to capture for other reasons, but doesn't
    # create a MetricMeta/Stat of its own
    next if layer == queue_layer

    store_specific_metric(layer, metric_hash, allocation_metric_hash)
    store_aggregate_metric(layer, metric_hash, allocation_metric_hash)
  end

  # And now run through the walk we just defined
  walker.walk

  metric_hash = attach_backtraces(metric_hash)
  allocation_metric_hash = attach_backtraces(allocation_metric_hash)

  [metric_hash, allocation_metric_hash]
end

#job_layerObject



93
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 93

def job_layer; layer_finder.job; end

#nameObject

ScoreItemSet API #



25
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 25

def name; request.unique_name; end

#queue_layerObject



92
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 92

def queue_layer; layer_finder.queue; end

#record!Object

Converter API #



11
12
13
14
15
16
17
18
19
20
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 11

def record!
  return nil unless request.job?
  @points = context.slow_job_policy.score(request)

  # Let the store know we're here, and if it wants our data, it will call
  # back into #call
  @store.track_slow_job!(self)

  nil # not returning anything in the layer results ... not used
end

#scoreObject



26
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 26

def score; @points; end

#skip_layer?(layer) ⇒ Boolean

Returns:

  • (Boolean)


91
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 91

def skip_layer?(layer); super(layer) || layer == queue_layer; end

#span_traceObject



95
96
97
98
99
# File 'lib/scout_apm/layer_converters/slow_job_converter.rb', line 95

def span_trace
  ScoutApm::LayerConverters::TraceConverter.
    new(@context, @request, @layer_finder, @store).
    call
end