def test_setup_no_service_name(stdout):
    # GIVEN no service is explicitly defined
    # WHEN logger is setup
    # THEN service field should be "service_undefined"
    logger = Logger(stream=stdout)
    logger.info("Hello")
    log = json.loads(stdout.getvalue())

    assert "service_undefined" == log["service"]
def test_setup_service_name(root_logger, stdout):
    # GIVEN service is explicitly defined
    # WHEN logger is setup
    # THEN service field should be equals service given
    service_name = "payment"
    logger = Logger(service=service_name, stream=stdout)

    logger.info("Hello")
    log = json.loads(stdout.getvalue())

    assert service_name == log["service"]
def test_setup_service_env_var(monkeypatch, stdout):
    # GIVEN service is explicitly defined via POWERTOOLS_SERVICE_NAME env
    # WHEN logger is setup
    # THEN service field should be equals POWERTOOLS_SERVICE_NAME value
    service_name = "payment"
    monkeypatch.setenv("POWERTOOLS_SERVICE_NAME", service_name)

    logger = Logger(stream=stdout)
    logger.info("Hello")
    log = json.loads(stdout.getvalue())

    assert service_name == log["service"]
Esempio n. 4
0
class Utils:
    def __init__(self):
        self.logger = Logger()
        self.tracer = Tracer()

    def set_trace_id(self, lambda_handler):
        def get_trace_id(raw_trace_id):
            for t in raw_trace_id.split(';'):
                if t.startswith('Root'):
                    return t.split('=')[1]
            return None

        def decorate(event, context):
            if '_X_AMZN_TRACE_ID' in os.environ:
                if get_trace_id(os.environ['_X_AMZN_TRACE_ID']) is not None:
                    os.environ['trace_id'] = get_trace_id(
                        os.environ['_X_AMZN_TRACE_ID'])
            if 'trace_id' not in os.environ:
                START_TIME = time.time()
                HEX = hex(int(START_TIME))[2:]
                os.environ['trace_id'] = "0-{}-{}".format(
                    HEX, str(binascii.hexlify(urandom(12)), 'utf-8'))
            self.logger.structure_logs(append=True,
                                       trace_id=os.environ['trace_id'])
            self.logger.info(os.environ.get('trace_id'))
            response = lambda_handler(event, context)
            return response

        return decorate

    def api_gateway_response(self, lambda_handler):
        def decorate(event, context):
            response = lambda_handler(event, context)
            if isinstance(response, tuple):
                body = response[0]
                status = response[1]
            else:
                body = response
                status = 200

            if isinstance(body, Exception):
                if status == 200:
                    status = 400
                self.logger.exception(body)
                self.tracer.put_annotation("ErrorCode",
                                           body.__class__.__name__)
                self.tracer.put_annotation("ErrorMessage", "{}".format(body))
                res = {
                    "isBase64Encoded":
                    False,
                    "statusCode":
                    status,
                    'headers': {
                        "Access-Control-Allow-Origin": "*",
                        "Content-Type": "application/json"
                    },
                    'body':
                    json.dumps({
                        "Code": body.__class__.__name__,
                        "Message": "{}".format(body),
                        "TraceId": os.environ.get('trace_id')
                    })
                }

            else:
                if body is not None and isinstance(body, str) is False:
                    body = json.dumps(body)

                res = {
                    'isBase64Encoded': False,
                    'statusCode': status,
                    'headers': {
                        "Access-Control-Allow-Origin": "*",
                        "Content-Type": "application/json"
                    }
                }
                if body is not None:
                    res['body'] = body
            return res

        return decorate
Esempio n. 5
0
    skill_builder.add_request_handler(RepeatHandler())
    skill_builder.add_request_handler(FallBackHandler())
    skill_builder.add_request_handler(SessionEndedRequestHandler())
    skill_builder.add_request_handler(IntentReflectorHandler())
    logger.info("Adding skill exception handlers...")
    skill_builder.add_exception_handler(OpenDataAPIExceptionHandler())
    skill_builder.add_exception_handler(GenericExceptionHandler())
    logger.info("Adding skill request interceptors...")
    skill_builder.add_global_request_interceptor(LocalizationInterceptor())
    skill_builder.add_global_request_interceptor(RequestLoggerInterceptor())
    logger.info("Adding skill response interceptors...")
    skill_builder.add_global_response_interceptor(ResponseLoggerInterceptor())

    tracer.put_annotation("SKILL_SETUP", "SUCCESS")
    tracer.put_metadata(key="environment", value=ENVIRONMENT.upper())

    return skill_builder


# Create new Open Data API client and service instances
logger.info({
    "operation": "Launching alexa skill",
    "environment": ENVIRONMENT.upper(),
})
logger.info("Setting up Open Data API service")
stib_service = OpenDataService(stib_api_client=OpenDataAPIClient())

# Set up the skill builder and lambda handler
sb = setup_skill_builder(service=stib_service)
handler = sb.lambda_handler()