Skip to content

Commit efb60e6

Browse files
committed
fix(lambda): Add record ec when statusCode >= 500
Signed-off-by: Ferenc Géczi <[email protected]>
1 parent fe56ee3 commit efb60e6

File tree

2 files changed

+79
-2
lines changed

2 files changed

+79
-2
lines changed

instana/instrumentation/aws/lambda_inst.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@ def lambda_handler_with_instana(wrapped, instance, args, kwargs):
3636
result['headers']['Server-Timing'] = server_timing_value
3737
elif 'multiValueHeaders' in result:
3838
result['multiValueHeaders']['Server-Timing'] = [server_timing_value]
39-
if 'statusCode' in result:
40-
scope.span.set_tag(ext.HTTP_STATUS_CODE, int(result['statusCode']))
39+
if 'statusCode' in result and result.get('statusCode'):
40+
status_code = int(result['statusCode'])
41+
scope.span.set_tag(ext.HTTP_STATUS_CODE, status_code)
42+
if 500 <= status_code:
43+
scope.span.log_exception(f'HTTP status {status_code}')
4144
except Exception as exc:
4245
if scope.span:
4346
exc = traceback.format_exc()

tests/platforms/test_lambda.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ def my_lambda_handler(event, context):
4646
module_name, function_name = get_lambda_handler_or_default()
4747
wrapt.wrap_function_wrapper(module_name, function_name, lambda_handler_with_instana)
4848

49+
def my_errored_lambda_handler(event, context):
50+
return {
51+
'statusCode': 500,
52+
'headers': {'Content-Type': 'application/json'},
53+
'body': json.dumps({'site': 'wikipedia.org', 'response': 500})
54+
}
55+
56+
os.environ["LAMBDA_HANDLER"] = "tests.platforms.test_lambda.my_errored_lambda_handler"
57+
module_name, function_name = get_lambda_handler_or_default()
58+
wrapt.wrap_function_wrapper(module_name, function_name, lambda_handler_with_instana)
4959

5060
class TestLambda(unittest.TestCase):
5161
def __init__(self, methodName='runTest'):
@@ -364,6 +374,70 @@ def test_api_gateway_v2_trigger_tracing(self):
364374
self.assertEqual("secret=key&q=term", span.data['http']['params'])
365375

366376

377+
def test_api_gateway_v2_trigger_errored_tracing(self):
378+
379+
with open(self.pwd + '/../data/lambda/api_gateway_v2_event.json', 'r') as json_file:
380+
event = json.load(json_file)
381+
382+
os.environ["LAMBDA_HANDLER"] = "tests.platforms.test_lambda.my_errored_lambda_handler"
383+
self.create_agent_and_setup_tracer()
384+
385+
result = lambda_handler(event, self.context)
386+
387+
assert isinstance(result, dict)
388+
assert 'headers' in result
389+
assert 'Server-Timing' in result['headers']
390+
391+
time.sleep(1)
392+
payload = self.agent.collector.prepare_payload()
393+
394+
self.assertTrue("metrics" in payload)
395+
self.assertTrue("spans" in payload)
396+
self.assertEqual(2, len(payload.keys()))
397+
398+
self.assertTrue(isinstance(payload['metrics']['plugins'], list))
399+
self.assertTrue(len(payload['metrics']['plugins']) == 1)
400+
plugin_data = payload['metrics']['plugins'][0]
401+
402+
self.assertEqual('com.instana.plugin.aws.lambda', plugin_data['name'])
403+
self.assertEqual('arn:aws:lambda:us-east-2:12345:function:TestPython:1', plugin_data['entityId'])
404+
405+
self.assertEqual(1, len(payload['spans']))
406+
407+
span = payload['spans'][0]
408+
self.assertEqual('aws.lambda.entry', span.n)
409+
self.assertEqual('0000000000001234', span.t)
410+
self.assertIsNotNone(span.s)
411+
self.assertEqual('0000000000004567', span.p)
412+
self.assertIsNotNone(span.ts)
413+
self.assertIsNotNone(span.d)
414+
415+
server_timing_value = "intid;desc=%s" % span.t
416+
assert result['headers']['Server-Timing'] == server_timing_value
417+
418+
self.assertEqual({'hl': True, 'cp': 'aws', 'e': 'arn:aws:lambda:us-east-2:12345:function:TestPython:1'},
419+
span.f)
420+
421+
self.assertTrue(span.sy)
422+
423+
self.assertEqual(1, span.ec)
424+
self.assertEqual('HTTP status 500', span.data['lambda']['error'])
425+
426+
self.assertEqual('arn:aws:lambda:us-east-2:12345:function:TestPython:1', span.data['lambda']['arn'])
427+
self.assertEqual(None, span.data['lambda']['alias'])
428+
self.assertEqual('python', span.data['lambda']['runtime'])
429+
self.assertEqual('TestPython', span.data['lambda']['functionName'])
430+
self.assertEqual('1', span.data['lambda']['functionVersion'])
431+
self.assertIsNone(span.data['service'])
432+
433+
self.assertEqual('aws:api.gateway', span.data['lambda']['trigger'])
434+
self.assertEqual('POST', span.data['http']['method'])
435+
self.assertEqual(500, span.data['http']['status'])
436+
self.assertEqual('/my/path', span.data['http']['url'])
437+
self.assertEqual('/my/{resource}', span.data['http']['path_tpl'])
438+
self.assertEqual("secret=key&q=term", span.data['http']['params'])
439+
440+
367441
def test_application_lb_trigger_tracing(self):
368442
with open(self.pwd + '/../data/lambda/api_gateway_event.json', 'r') as json_file:
369443
event = json.load(json_file)

0 commit comments

Comments
 (0)