Global Error Handler
====================
Overview
--------
This example shows how to use the global error handler.
The source files of these examples are available :scm_web:`here `.
Preparation
-----------
This example will be executed in a separate virtual environment:
.. code:: sh
$ mkdir global_error_handler
$ virtualenv global_error_handler
$ source global_error_handler/bin/activate
Installation
------------
Here we install first ``opentelemetry-sdk``, the only dependency. Afterwards, 2
error handlers are installed: ``error_handler_0`` will handle
``ZeroDivisionError`` exceptions, ``error_handler_1`` will handle
``IndexError`` and ``KeyError`` exceptions.
.. code:: sh
$ pip install opentelemetry-sdk
$ git clone https://github.com/open-telemetry/opentelemetry-python.git
$ pip install -e opentelemetry-python/docs/examples/error_handler/error_handler_0
$ pip install -e opentelemetry-python/docs/examples/error_handler/error_handler_1
Execution
---------
An example is provided in the
``opentelemetry-python/docs/examples/error_handler/example.py``.
You can just run it, you should get output similar to this one:
.. code:: pytb
ErrorHandler0 handling a ZeroDivisionError
Traceback (most recent call last):
File "test.py", line 5, in
1 / 0
ZeroDivisionError: division by zero
ErrorHandler1 handling an IndexError
Traceback (most recent call last):
File "test.py", line 11, in
[1][2]
IndexError: list index out of range
ErrorHandler1 handling a KeyError
Traceback (most recent call last):
File "test.py", line 17, in
{1: 2}[2]
KeyError: 2
Error handled by default error handler:
Traceback (most recent call last):
File "test.py", line 23, in
assert False
AssertionError
No error raised
The ``opentelemetry-sdk.error_handler`` module includes documentation that
explains how this works. We recommend you read it also, here is just a small
summary.
In ``example.py`` we use ``GlobalErrorHandler`` as a context manager in several
places, for example:
.. code:: python
with GlobalErrorHandler():
{1: 2}[2]
Running that code will raise a ``KeyError`` exception.
``GlobalErrorHandler`` will "capture" that exception and pass it down to the
registered error handlers. If there is one that handles ``KeyError`` exceptions
then it will handle it. That can be seen in the result of the execution of
``example.py``:
.. code::
ErrorHandler1 handling a KeyError
Traceback (most recent call last):
File "test.py", line 17, in
{1: 2}[2]
KeyError: 2
There is no registered error handler that can handle ``AssertionError``
exceptions so this kind of errors are handled by the default error handler
which just logs the exception to standard logging, as seen here:
.. code::
Error handled by default error handler:
Traceback (most recent call last):
File "test.py", line 23, in
assert False
AssertionError
When no exception is raised, the code inside the scope of
``GlobalErrorHandler`` is executed normally:
.. code::
No error raised
Users can create Python packages that provide their own custom error handlers
and install them in their virtual environments before running their code which
instantiates ``GlobalErrorHandler`` context managers. ``error_handler_0`` and
``error_handler_1`` can be used as examples to create these custom error
handlers.
In order for the error handlers to be registered, they need to create a class
that inherits from ``opentelemetry.sdk.error_handler.ErrorHandler`` and at
least one ``Exception``-type class. For example, this is an error handler that
handles ``ZeroDivisionError`` exceptions:
.. code:: python
from opentelemetry.sdk.error_handler import ErrorHandler
from logging import getLogger
logger = getLogger(__name__)
class ErrorHandler0(ErrorHandler, ZeroDivisionError):
def handle(self, error: Exception, *args, **kwargs):
logger.exception("ErrorHandler0 handling a ZeroDivisionError")
To register this error handler, use the ``opentelemetry_error_handler`` entry
point in the setup of the error handler package:
.. code::
[options.entry_points]
opentelemetry_error_handler =
error_handler_0 = error_handler_0:ErrorHandler0
This entry point should point to the error handler class, ``ErrorHandler0`` in
this case.