Module: Datadog::Lambda::AppSec

Defined in:
lib/datadog/lambda/appsec.rb,
lib/datadog/lambda/appsec/request.rb,
lib/datadog/lambda/appsec/event_normalizer.rb,
lib/datadog/lambda/appsec/response_normalizer.rb

Overview

AppSec integration for AWS Lambda invocations.

Defined Under Namespace

Modules: EventNormalizer, ResponseNormalizer Classes: Request

Class Method Summary collapse

Class Method Details

.on_finish(response) ⇒ Object

rubocop:disable Metrics/AbcSize



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/datadog/lambda/appsec.rb', line 46

def on_finish(response)
  return unless enabled?

  context = Datadog::AppSec::Context.active
  return unless context

  response = ResponseNormalizer.normalize(response)
  payload = Datadog::AppSec::Instrumentation::Gateway::DataContainer.new(
    response, context: context
  )

  interrupt_params = catch(Datadog::AppSec::Ext::INTERRUPT) do
    Datadog::AppSec::Instrumentation.gateway.push('aws_lambda.response.start', payload)
    nil
  end

  context.mark_as_interrupted! if interrupt_params

  Datadog::AppSec::Event.record(context, request: @request)
  context.export_metrics
  context.export_request_telemetry

  response_override(interrupt_params, headers: @request.headers) if interrupt_params
rescue StandardError => e
  Datadog::Utils.logger.debug "failed to finish AppSec: #{e}"
ensure
  Datadog::AppSec::Context.deactivate if context
end

.on_start(event, trace:, span:, cold_start: false) ⇒ Object

rubocop:disable Metrics/AbcSize



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/datadog/lambda/appsec.rb', line 14

def on_start(event, trace:, span:, cold_start: false)
  @request = nil
  return unless enabled?

  context = create_context(trace, span)
  return unless Datadog::AppSec::Context.active

  tag_and_keep(context, cold_start: cold_start)

  event = EventNormalizer.normalize(event)
  @request = Request.from_normalized(event)

  payload = Datadog::AppSec::Instrumentation::Gateway::DataContainer.new(
    event, context: context
  )

  interrupt_params = catch(Datadog::AppSec::Ext::INTERRUPT) do
    Datadog::AppSec::Instrumentation.gateway.push('aws_lambda.request.start', payload)
    nil
  end

  return unless interrupt_params

  context.mark_as_interrupted!
  response_override(interrupt_params, headers: @request.headers)
rescue StandardError => e
  Datadog::AppSec::Context.deactivate if context
  Datadog::Utils.logger.debug("failed to start AppSec: #{e}")
end