Skip to content

Commit f5e80a8

Browse files
committed
set tags and mark span.error=1
1 parent ad09cc9 commit f5e80a8

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

datadog_lambda/constants.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,13 @@ class XrayDaemon(object):
4242
XRAY_TRACE_ID_HEADER_NAME = "_X_AMZN_TRACE_ID"
4343
XRAY_DAEMON_ADDRESS = "AWS_XRAY_DAEMON_ADDRESS"
4444
FUNCTION_NAME_HEADER_NAME = "AWS_LAMBDA_FUNCTION_NAME"
45+
46+
47+
SERVER_ERRORS_STATUS_CODES = {
48+
"500": "500 Internal Server Error",
49+
"501": "501 Not Implemented",
50+
"502": "502 Bad Gateway",
51+
"503": "503 Service Unavailable",
52+
"504": "504 Gateway Timeout",
53+
"505": "505 HTTP Version Not Supported",
54+
}

datadog_lambda/wrapper.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
import traceback
99
from importlib import import_module
1010

11+
from ddtrace.constants import ERROR_MSG, ERROR_STACK, ERROR_TYPE
12+
1113
from datadog_lambda.extension import should_use_extension, flush_extension
1214
from datadog_lambda.cold_start import set_cold_start, is_cold_start
1315
from datadog_lambda.constants import (
14-
XraySubsegment,
16+
SERVER_ERRORS_STATUS_CODES,
1517
TraceContextSource,
18+
XraySubsegment,
1619
)
1720
from datadog_lambda.metric import (
1821
flush_stats,
@@ -194,6 +197,12 @@ def _after(self, event, context):
194197
submit_errors_metric(context)
195198
if self.span:
196199
self.span.set_traceback()
200+
self.span.error = 1
201+
self.span.set_tags({
202+
ERROR_TYPE: "5xx Server Errors",
203+
ERROR_MSG: SERVER_ERRORS_STATUS_CODES.get(status_code,
204+
"5xx Server Errors"),
205+
})
197206
# Create a new dummy Datadog subsegment for function trigger tags so we
198207
# can attach them to X-Ray spans when hybrid tracing is used
199208
if self.trigger_tags:

tests/test_wrapper.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,64 @@ def lambda_handler(event, context):
275275
]
276276
)
277277

278+
@patch('datadog_lambda.wrapper.extract_trigger_tags')
279+
def test_5xx_sends_errors_metric_and_set_tags(self, mock_extract_trigger_tags):
280+
mock_extract_trigger_tags.return_value = {
281+
"function_trigger.event_source": "api-gateway",
282+
"function_trigger.event_source_arn":
283+
"arn:aws:apigateway:us-west-1::/restapis/1234567890/stages/prod",
284+
"http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
285+
"http.url_details.path": "/prod/path/to/resource",
286+
"http.method": "GET",
287+
}
288+
@datadog_lambda_wrapper
289+
def lambda_handler(event, context):
290+
return {
291+
"statusCode": 500,
292+
"body": "fake response body"
293+
}
294+
295+
lambda_event = {}
296+
297+
lambda_handler(lambda_event, get_mock_context())
298+
299+
self.mock_write_metric_point_to_stdout.assert_has_calls(
300+
[
301+
call(
302+
"aws.lambda.enhanced.invocations",
303+
1,
304+
tags=[
305+
"region:us-west-1",
306+
"account_id:123457598159",
307+
"functionname:python-layer-test",
308+
"resource:python-layer-test:1",
309+
"cold_start:true",
310+
"memorysize:256",
311+
"runtime:python3.9",
312+
"datadog_lambda:v6.6.6",
313+
"dd_lambda_layer:datadog-python39_X.X.X",
314+
],
315+
timestamp=None,
316+
),
317+
call(
318+
"aws.lambda.enhanced.errors",
319+
1,
320+
tags=[
321+
"region:us-west-1",
322+
"account_id:123457598159",
323+
"functionname:python-layer-test",
324+
"resource:python-layer-test:1",
325+
"cold_start:true",
326+
"memorysize:256",
327+
"runtime:python3.9",
328+
"datadog_lambda:v6.6.6",
329+
"dd_lambda_layer:datadog-python39_X.X.X",
330+
],
331+
timestamp=None,
332+
),
333+
]
334+
)
335+
278336
def test_enhanced_metrics_cold_start_tag(self):
279337
@datadog_lambda_wrapper
280338
def lambda_handler(event, context):

0 commit comments

Comments
 (0)