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)