NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

__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