-
Notifications
You must be signed in to change notification settings - Fork 421
Bug: Allow reporting entry logs with custom exception and exception_name #1923
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Thanks for opening your first issue here! We'll come back to you as soon as we can. |
Hello @iago1460! Thank you for opening this issue! Indeed, you're right, the code always override this extra information provided ( On the other hand, we love to hear from our customers about their use cases and needs and I'm very curious to know in which situation adding from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.middleware_factory import lambda_handler_decorator
logger = Logger()
@lambda_handler_decorator
def catch_all_error(handler, event, context):
try:
response = handler(event, context)
except Exception as exc:
# Catching all exceptions in a Lambda execution
exception_type = type(exc).__name__
exception_value = exc
#logger.info(f"TYPE - {exception_type}... ERROR: {exception_value}")
logger.info("Report", extra={"exception": exception_value, "exception_name": exception_type })
@catch_all_error # Middleware Factory Function
def lambda_handler(event: dict, context: LambdaContext) -> str:
print(event.KEYNOEXISTS) But in my opinion even in this case the from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools.middleware_factory import lambda_handler_decorator
logger = Logger()
@lambda_handler_decorator
def catch_all_error(handler, event, context):
try:
response = handler(event, context)
except Exception as exc:
# Catching all exceptions in a Lambda execution and logging using logger.exception
logger.exception("Report")
@catch_all_error # Middleware Factory Function
def lambda_handler(event: dict, context: LambdaContext) -> str:
print(event.KEYNOEXISTS) Thank you and let me know if I'm missing something. |
Hi @leandrodamascena, thanks for your detailed explanation. Let me expand our user case in more detail: import functools
import traceback
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler.exceptions import ServiceError
from st_autosuggest.utils import APIGatewayResolver
summary_logger = Logger(service="execution_summary")
app = APIGatewayResolver()
class ExpectedException(Exception):
pass
def log_lambda_request(logger=summary_logger):
def actual_decorator(func):
@functools.wraps(func)
def wrapper(event, context):
try:
output = func(event, context)
except Exception:
logger.exception("Unhandled error")
raise
else:
logger.append_keys(status_code=output["statusCode"])
logger.info("Request processed")
return output
return wrapper
return actual_decorator
@app.exception_handler(ExpectedException)
def handle_value_error(ex: ExpectedException):
summary_logger.append_keys(
exception_name=str(ex.__class__.__name__),
exception="".join(
traceback.format_exception(type(ex), ex, ex.__traceback__)
),
)
raise ServiceError(status_code=503, msg=f"Expected exception happened: {ex}")
@app.get(".+")
def my_view():
raise ExpectedException()
# raise ValueError()
return {'result': 'Test'}
@summary_logger.inject_lambda_context(clear_state=True)
@log_lambda_request()
def lambda_handler(event, context):
return app.resolve(event, context) The idea is to log a unique entry per request, to measure some custom metrics, like for example execution time. The problem we face is that |
Hello @iago1460, thank you very much for the explanation! In fact, it makes sense to check if these keys exist in the logger instance and not try to replace them every time. BTW, I might suggest you use our Middleware Factory utility. It provides a decorator factory to create your own middleware to run logic before, and after each Lambda invocation synchronously. I refactored your code to use this utility and reduced the number of lines of code. import functools
import traceback
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler.exceptions import ServiceError
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver
from aws_lambda_powertools.middleware_factory import lambda_handler_decorator
logger = Logger(service="execution_summary")
app = ApiGatewayResolver()
class ExpectedException(Exception):
pass
@lambda_handler_decorator
def catch_all_error(handler, event, context, logger):
try:
response = handler(event, context)
except Exception:
logger.exception("Unhandled error")
raise
else:
logger.append_keys(status_code=response["statusCode"])
logger.info("Request processed")
return response
@app.exception_handler(ExpectedException)
def handle_value_error(ex: ExpectedException):
logger.append_keys(
exception_name=str(ex.__class__.__name__),
exception="".join(
traceback.format_exception(type(ex), ex, ex.__traceback__)
),
)
raise ServiceError(status_code=503, msg=f"Expected exception happened: {ex}")
@app.get(".+")
def my_view():
raise ExpectedException()
#raise ValueError()
return {'result': 'Test'}
@logger.inject_lambda_context(clear_state=True)
@catch_all_error(logger=logger)
def lambda_handler(event, context):
return app.resolve(event, context) Thank you |
Hi @leandrodamascena, happy to provide a PR with this change. Also thanks for suggesting the Middleware Factory utility. |
This is now released under 2.9.0 version! |
This is now released under 2.25.1 version! |
Expected Behaviour
Due to internal logic
exception
andexception_name
always get overridden.The following statement should serialize the values provided:
and produce an output like:
Current Behaviour
Due to internal logic these field get overridden with None:
Code snippet
Possible Solution
Checking if these fields already exist on the
formatted_log
instead of always calling_extract_log_exception
would fix this issue.Steps to Reproduce
See code snippet section
AWS Lambda Powertools for Python version
latest
AWS Lambda function runtime
3.9
Packaging format used
PyPi
Debugging logs
No response
The text was updated successfully, but these errors were encountered: