__init__.py (3664B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\beeline\middleware\awslambda\__init__.py 2 import traceback 3 import beeline 4 from beeline.propagation import Request 5 COLD_START = True 6 7 class LambdaRequest(Request): 8 9 def __init__(self, event): 10 self._type = None 11 self._event = event 12 if isinstance(event, dict): 13 if 'headers' in event: 14 if isinstance(event['headers'], dict): 15 self._attributes = event['headers'] 16 self._type = 'headers' 17 elif 'Records' in event: 18 if len(event['Records']) == 1: 19 if 'EventSource' in event['Records'][0]: 20 if event['Records'][0]['EventSource'] == 'aws:sns': 21 self._attributes = event['Records'][0]['Sns']['MessageAttributes'] 22 self._type = 'sns' 23 elif 'eventSource' in event['Records'][0]: 24 if event['Records'][0]['eventSource'] == 'aws:sqs': 25 self._attributes = event['Records'][0]['messageAttributes'] 26 self._type = 'sqs' 27 if self._type: 28 self._keymap = {k.lower():k for k in self._attributes.keys()} 29 30 def header(self, key): 31 if not self._type: 32 return None 33 lookup_key = key.lower() 34 if lookup_key not in self._keymap: 35 return None 36 lookup_key = self._keymap[lookup_key] 37 if self._type == 'headers': 38 return self._attributes[lookup_key] 39 if self._type == 'sns': 40 return self._attributes[lookup_key]['Value'] 41 if self._type == 'sqs': 42 return self._attributes[lookup_key]['stringValue'] 43 44 def method(self): 45 return None 46 47 def scheme(self): 48 return None 49 50 def host(self): 51 return None 52 53 def path(self): 54 return None 55 56 def query(self): 57 return None 58 59 def middleware_request(self): 60 return self._event 61 62 63 def beeline_wrapper(handler = None, record_input = True, record_output = True): 64 65 def _beeline_wrapper(event, context): 66 global COLD_START 67 if not beeline.get_beeline(): 68 return handler(event, context) 69 root_span = None 70 try: 71 request_context = {'app.function_name': getattr(context, 'function_name', ''), 72 'app.function_version': getattr(context, 'function_version', ''), 73 'app.request_id': getattr(context, 'aws_request_id', ''), 74 'meta.cold_start': COLD_START, 75 'name': handler.__name__} 76 if record_input: 77 request_context['app.event'] = event 78 lr = LambdaRequest(event) 79 root_span = beeline.propagate_and_start_trace(request_context, lr) 80 resp = handler(event, context) 81 if resp is not None and record_output: 82 beeline.add_context_field('app.response', resp) 83 return resp 84 except Exception as e: 85 beeline.add_context({'app.exception_type': str(type(e)), 86 'app.exception_string': beeline.internal.stringify_exception(e), 87 'app.exception_stacktrace': traceback.format_exc()}) 88 raise e 89 finally: 90 COLD_START = False 91 beeline.finish_trace(root_span) 92 beeline.get_beeline().client.flush() 93 94 def outer_wrapper(*args, **kwargs): 95 return beeline_wrapper(record_input=record_input, record_output=record_output, *args, **kwargs) 96 97 if handler: 98 return _beeline_wrapper 99 return outer_wrapper