Module: Datadog::Lambda::AppSec::Tagging

Defined in:
lib/datadog/lambda/appsec/tagging.rb

Overview

Applies AppSec request, response, and keep-decision tags to the Lambda span

Class Method Summary collapse

Class Method Details

.tag_and_keep(context, cold_start:) ⇒ Object



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

def tag_and_keep(context, cold_start:)
  span = context.span
  trace = context.trace

  return unless trace && span

  span.set_metric(Datadog::AppSec::Ext::TAG_APPSEC_ENABLED, 1)
  span.set_tag('_dd.runtime_family', 'ruby')
  span.set_tag('_dd.appsec.waf.version', Datadog::AppSec::WAF::VERSION::BASE_STRING)

  ruleset_version = context.waf_runner_ruleset_version
  return unless ruleset_version

  span.set_tag('_dd.appsec.event_rules.version', ruleset_version)

  return unless cold_start

  trace.keep!
  trace.set_tag(
    Datadog::Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
    Datadog::Tracing::Sampling::Ext::Decision::ASM
  )
  span.set_tag(
    '_dd.appsec.event_rules.addresses', JSON.dump(context.waf_runner_known_addresses)
  )
end

.tag_request(request, context:) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/datadog/lambda/appsec/tagging.rb', line 16

def tag_request(request, context:)
  span = context.span
  return unless span

  headers = Datadog::Core::HeaderCollection.from_hash(request.headers)
  Datadog::AppSec::DefaultHeaderTags.tag_request(span, headers)

  return if span.get_tag(Datadog::Tracing::Metadata::Ext::HTTP::TAG_CLIENT_IP)

  Datadog::Tracing::ClientIp.set_client_ip_tag!(
    span, headers: headers, remote_ip: request.remote_addr
  )
end

.tag_response(response, context:) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/datadog/lambda/appsec/tagging.rb', line 30

def tag_response(response, context:)
  span = context.span
  return unless span

  headers = Datadog::Core::HeaderCollection.from_hash(response.headers)
  Datadog::AppSec::DefaultHeaderTags.tag_response(span, headers)

  return if headers.get('content-length')

  if (body = response.body)
    span.set_tag('http.response.headers.content-length', body.bytesize.to_s)
  end
end