Workflow events#

Events are emitted when executing a workflow. The event fields are described in the ewoksutils documentation.

Use an Ewoks event handler#

If you want to record workflow events you have to specify one or more event handlers when executing a workflow:

from ewokscore import execute_graph

execinfo = {
    "job_id": "1234",
    "handlers": [
        {
            "class": "ewokscore.events.handlers.Sqlite3EwoksEventHandler",
            "asynchronous": True,
            "arguments": [{"name": "uri",
                           "value": "file:/tmp/ewoks_event.db"}],
        }
    ],
}
results = execute_graph("/path/to/file.json", execinfo=execinfo)

The optional asynchronous argument should be used for handlers with slow connections. Setting this argument to True will send events to the handlers in a separate thread.

Define an Ewoks event handler#

You can use any handler derived from logging.Handler as an Ewoks event handler. For example if you have a Connection class with a constructor that accepts two arguments, you can define an ewoks event handler as follows:

# ./myproject/handlers.py

from ewokscore.logging_utils.handlers import ConnectionHandler
from ewokscore.handlers import send_events
from ewokscore.events import EwoksEventHandlerMixIn

class MyHandler(EwoksEventHandlerMixIn, ConnectionHandler):

    def _connect(self, uri:str, param1:int, timeout=1) -> None:
        self._connection = Connection(uri, param1)
        self._fields = send_events.FIELDS

    def _disconnect(self) -> None:
        del self._connection
        self._connection = None

    def _send_serialized_record(self, srecord):
        self._connection.send(srecord)

    def _serialize_record(self, record):
        return {
            field: self.get_value(record, field, None) for field in self._fields
        }

ConnectionHandler is an abstract python logging handler which can be used for convenience.

To use this example handler

from ewokscore import execute_graph

execinfo = {
    "job_id": "1234",
    "handlers": [
        {
            "class": "myproject.handlers.MyHandler",
            "arguments": [{"name": "uri",
                           "value": "file:/tmp/ewoks_event.db"},
                          {"name": "param1", "value": 10}],
        }
    ],
}
results = execute_graph("/path/to/file.json", execinfo=execinfo)