Class: Datadog::Trace::Listener

Inherits:
Object
  • Object
show all
Defined in:
lib/datadog/lambda/trace/listener.rb

Overview

TraceListener tracks tracing context information

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(handler_name:, function_name:, patch_http:, merge_xray_traces:) ⇒ Listener

Returns a new instance of Listener.



25
26
27
28
29
30
31
32
# File 'lib/datadog/lambda/trace/listener.rb', line 25

def initialize(handler_name:, function_name:, patch_http:,
               merge_xray_traces:)
  @handler_name = handler_name
  @function_name = function_name
  @merge_xray_traces = merge_xray_traces

  Datadog::Trace.patch_http if patch_http
end

Instance Attribute Details

#response_overrideObject (readonly)

AppSec blocking response that replaces the handler result. Set during either on_start or on_end when WAF decides to block.



22
23
24
# File 'lib/datadog/lambda/trace/listener.rb', line 22

def response_override
  @response_override
end

Instance Method Details

#on_end(response:, request_context:) ⇒ Object

rubocop:enable Metrics/AbcSize



64
65
66
67
68
69
70
71
# File 'lib/datadog/lambda/trace/listener.rb', line 64

def on_end(response:, request_context:)
  if (override = Datadog::Lambda::AppSec.on_finish(response))
    @response_override = override
  end

  Datadog::Utils.send_end_invocation_request(response:, span_id: @trace.id, request_context:)
  @trace&.finish
end

#on_start(event:, request_context:, cold_start:) ⇒ Object

rubocop:disable Metrics/AbcSize



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/datadog/lambda/trace/listener.rb', line 35

def on_start(event:, request_context:, cold_start:)
  trace_context = Datadog::Trace.extract_trace_context(event, @merge_xray_traces)
  Datadog::Trace.trace_context = trace_context
  Datadog::Utils.logger.debug "extracted trace context #{trace_context}"
  options = get_option_tags(
    request_context:,
    cold_start:
  )
  context = Datadog::Trace.trace_context
  source = context[:source] if context
  options[:tags]['_dd.parent_source'] = source if source && source != 'ddtrace'
  options[:resource] = 'dd-tracer-serverless-span'
  options[:service] = 'aws.lambda'
  options[:type] = 'serverless'

  trace_digest = Datadog::Utils.send_start_invocation_request(event:, request_context:)
  # Only continue trace from a new one if it exist, or else,
  # it will create a new trace, which is not ideal here.
  options[:continue_from] = trace_digest if trace_digest

  @trace = Datadog::Tracing.trace('aws.lambda', **options)

  Datadog::Trace.apply_datadog_trace_context(Datadog::Trace.trace_context)
  @response_override = Datadog::Lambda::AppSec.on_start(
    event, trace: Datadog::Tracing.active_trace, span: @trace, cold_start: cold_start
  )
end