def main(): sys.stdout = CustomIO(sys.stdout) sys.stderr = CustomIO(sys.stderr) # log to stdout for capturing root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) root_logger.addHandler(handler) if 0 != runtime.init(): print('runtime init failed') return runtime.log('init succ') clean_env() http_handler, event_handler = None, None while True: invoke_info = runtime.wait_for_invoke() mode, sockfd, event, context = invoke_info.cmd, invoke_info.sockfd, invoke_info.event, invoke_info.context if mode == 'RELOAD': runtime.log('get reload request: %s' % context) http_handler, event_handler = init_handler( *(context.split(":")[-2:])) runtime.log('handlers reloaded') continue if event or context: try: event = eval(event) context = eval(context) except Exception as ex: runtime.report_running() runtime.report_fail( 'eval event[%s] or context[%s] failed\n%s' % (event, context, str(ex)), 0, 1) continue for env in context['environ'].split(';'): if not env: continue k, v = env.split('=', 1) os.environ[k] = v runtime.log('request[%s] invoked' % context.get('request_id')) if not http_handler and not event_handler: runtime.report_running() runtime.report_fail(init_handler_fault, 0, 2) continue if mode == 'HTTP': http_handler.handle(sockfd) elif mode == 'EVENT': event_handler.handle(event, context) else: runtime.log('recv unknown task type: %s' % mode) runtime.log('process finished')
def wait_for_start(): (invokeid, mode, handler, suppress_init, credentials) = lambda_runtime.receive_start() force_path_importer_cache_update() set_environ(credentials) lambda_runtime.report_running(invokeid) return (invokeid, mode, handler, suppress_init, credentials)
def handle(self, event, context): try: runtime.report_running() ret = self.real_handler(event, context) if type(ret) == Decimal: ret = str(ret) ret = json.dumps(ret) if len(ret) > max_ret_msg_len: runtime.report_fail(max_ret_msg_len_exceed_error, 0, 1) else: runtime.report_done(ret, 0) except Exception as ex: stack_trace = traceback.format_exc().splitlines() # erase current frame del stack_trace[1] del stack_trace[1] runtime.report_fail('\n'.join(stack_trace), 0, 2)