serverless / dashboard

MIT License
26 stars 10 forks source link

logging.warning cannot handle passing an Exception #834

Open fafrd opened 1 year ago

fafrd commented 1 year ago

logging.error, .warning etc functions let you pass in basically anything. For example, I can pass in an Exception here:

try:
  raise ValueError('test')
except Exception as e:
  logging.warning(e)
WARNING:root:test

The serverless SDK can't handle this:

    try:
        raise ValueError("test")
    except Exception as e:
        logging.warning(e)
"message": "unsupported operand type(s) for %: 'ValueError' and 'tuple'",

"stack": "Traceback (most recent call last):
  File \"/var/task/handle_generate_certificate.py\", line 28, in handle_generate_certificate
    raise ValueError(\"test\")
ValueError: test

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File \"/opt/python/sls_sdk/lib/instrumentation/logging.py\", line 56, in __warning
    _resolve_message(*args), origin=\"pythonLogging\"
  File \"/opt/python/sls_sdk/lib/instrumentation/logging.py\", line 22, in _resolve_message
    return args[0] % args[1:]
TypeError: unsupported operand type(s) for %: 'ValueError' and 'tuple'
",

It works for logging.error but not for logging.warning. You should probably add a similar isinstance(args[0], BaseException) check to the _warning function here: https://github.com/serverless/console/blob/main/python/packages/sdk/sls_sdk/lib/instrumentation/logging.py#L45

fafrd commented 1 year ago

Workaround is to stringify first: logging.warning(str(e))