firebase / firebase/firebase-functions-python

logging library doesn't support Exceptions

Offen
#172 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
feature-request
Vorherrschende Sprache
Python
Sterne
167
Forks
34
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

The `logger` in `firebase_functions` doesn't seem to provide reasonable support for exceptions.

In [the example](https://firebase.google.com/docs/functions/writing-and-viewing-logs?gen=2nd#python_2), firebase suggests extracting a portion of the error and including it:

```
try
...
except:
e = sys.exc_info()[0]
# Attach an error object as the second argument
logger.error("Unable to read quote from Firestore, sending default instead", error=e)
```

However this fails with an error:

```
../../../../Library/Caches/pypoetry/virtualenvs/oasis-zYbk3Ww0-py3.11/lib/python3.11/site-packages/firebase_functions/logger.py:130: in error
write(_entry_from_args(LogSeverity.ERROR, *args, **kwargs))
../../../../Library/Caches/pypoetry/virtualenvs/oasis-zYbk3Ww0-py3.11/lib/python3.11/site-packages/firebase_functions/logger.py:95: in write
print(_json.dumps(_remove_circular(entry)), file=write_file)
../../../../.pyenv/versions/3.11.7/lib/python3.11/json/__init__.py:231: in dumps
return _default_encoder.encode(obj)
../../../../.pyenv/versions/3.11.7/lib/python3.11/json/encoder.py:200: in encode
chunks = self.iterencode(o, _one_shot=True)
../../../../.pyenv/versions/3.11.7/lib/python3.11/json/encoder.py:258: in iterencode
return _iterencode(o, 0)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = , o =

def default(self, o):
"""Implement this method in a subclass such that it returns
a serializable object for ``o``, or calls the base implementation
(to raise a ``TypeError``).

For example, to support arbitrary iterators, you could
implement default like this::

def default(self, o):
try:
iterable = iter(o)
except TypeError:
pass
else:
return list(iterable)
# Let the base class default method raise the TypeError
return JSONEncoder.default(self, o)

"""
> raise TypeError(f'Object of type {o.__class__.__name__} '
f'is not JSON serializable')
E TypeError: Object of type type is not JSON serializable

../../../../.pyenv/versions/3.11.7/lib/python3.11/json/encoder.py:180: TypeError
```

Moreover it's not really an ideal API to log a subset of an exception. Ideally the entire stack trace would be included.

If you instead simply `print` the error, you can see a reasonable stack trace in the logs for the function.

I'd expect the example to not throw. I'd also expect the logging API to explicitly support logging Exceptions with stack traces

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Start in firebase_functions/logger.py, especially error(), write(), and _entry_from_args(), then compare the documented Firebase logging example with the JSON serialization failure shown here. Done means logging an Exception no longer throws and the logging API includes the complete exception stack trace in the function logs.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
observability-sre
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
52/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.