Method: Datadog::AppSec::ActionsHandler.generate_stack

Defined in:
lib/datadog/appsec/actions_handler.rb

.generate_stack(action_params) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/datadog/appsec/actions_handler.rb', line 24

def generate_stack(action_params)
  return unless Datadog.configuration.appsec.stack_trace.enabled

  stack_id = action_params['stack_id']
  return unless stack_id

  active_span = AppSec.active_context&.span
  return unless active_span

  event_category = Ext::EXPLOIT_PREVENTION_EVENT_CATEGORY
  tag_key = Ext::TAG_METASTRUCT_STACK_TRACE

  existing_stack_data = active_span.get_metastruct_tag(tag_key).dup || {event_category => []}
  max_stack_traces = Datadog.configuration.appsec.stack_trace.max_stack_traces
  return if max_stack_traces != 0 && existing_stack_data[event_category].count >= max_stack_traces

  backtrace = SerializableBacktrace.new(locations: Array(caller_locations), stack_id: stack_id)
  existing_stack_data[event_category] << backtrace
  active_span.set_metastruct_tag(tag_key, existing_stack_data)
end