ReportingEventSubscriber¶
Module: eventspype.sub.reporter
ReportingEventSubscriber¶
class ReportingEventSubscriber(EventSubscriber):
def __init__(self, event_source: str | None = None) -> None
A subscriber that logs every received event to Python's logging module at INFO level. The event is converted to a dict and enriched with metadata before logging.
Parameters¶
| Parameter | Type | Description |
|---|---|---|
event_source |
str \| None |
Optional label added to each log entry as event_source |
Class methods¶
logger¶
@classmethod
def logger(cls) -> logging.Logger
Return the shared class-level logger (lazily created).
Methods¶
call¶
def call(
self,
event_object: Any,
current_event_tag: int,
current_event_caller: Any,
) -> None
Serialize the event to a dict, add metadata, and log at INFO level.
Serialization strategy¶
Events are converted to a dict in the following order:
- Dataclass —
dataclasses.asdict(event_object) - NamedTuple (any object with
_asdict()) —event_object._asdict() - Fallback —
{"value": str(event_object)}
Metadata added to each log entry¶
| Key | Value |
|---|---|
event_name |
type(event_object).__name__ |
event_source |
self.event_source |
event_tag |
current_event_tag (normalized int) |
The full dict is also passed as extra={"event_data": event_dict} to support structured logging handlers.
Example¶
import logging
from dataclasses import dataclass
from eventspype import EventPublisher, EventPublication, ReportingEventSubscriber
logging.basicConfig(level=logging.INFO)
@dataclass
class MetricEvent:
name: str
value: float
pub = EventPublication("metric", MetricEvent)
publisher = EventPublisher(pub)
reporter = ReportingEventSubscriber(event_source="metrics-service")
publisher.add_subscriber(reporter)
publisher.publish(MetricEvent("cpu_usage", 78.3))
# INFO:eventspype.sub.reporter:Event received: {
# 'name': 'cpu_usage', 'value': 78.3,
# 'event_name': 'MetricEvent',
# 'event_source': 'metrics-service',
# 'event_tag': 12345
# }