Event Journal & Ops Console
Durable BLOGE deployments can record an append-only stream of execution events and surface them in a built-in operations console — no separate dashboard stack required.
Execution event journal
The optional ExecutionEvent stream captures the lifecycle of every execution with per-execution sequence numbers:
GRAPH_STARTED, NODE_STARTED, NODE_COMPLETED, NODE_FAILED, NODE_SUSPENDED, NODE_RESUMED, NODE_RETRIED, GRAPH_COMPLETED, plus compensation events.
Enable it in Spring Boot:
spring:
bloge:
event-journal:
enabled: trueIt is backed by InMemoryExecutionEventStore for tests or the durable bd_execution_event table in production.
Durability guarantees
- Idempotent appends on
(executionId, sequenceNumber)— replays never duplicate rows. - Async flush recovery — a failed batch write is retried one-by-one, and
EventJournalListener.failedEventCount()exposes events that still could not be persisted. - Tenant scoping — durable rows carry
tenantId/namespacefor tenant-scoped activity queries. - Retention — cleanup can be scheduled with configurable purge windows and batch sizes via the
EventJournalPurgeScheduler.
spring:
bloge:
event-journal:
enabled: true
retention:
purge-window: 30d
batch-size: 500Audit journal
Separately from the event stream, BLOGE keeps a node-lifecycle audit journal (NODE_START, NODE_COMPLETE, NODE_FAILED, NODE_RETRY, NODE_SUSPEND, NODE_RESUME) persisted in-memory or to a JDBC bd_audit_journal table. It supports optional async batching with a bounded buffer (max-buffer-size) that drops entries on overflow instead of blocking execution threads, and exposes buffer-health metrics as bloge.audit.buffer.*.
Embedded ops console
bloge-spring-web ships a built-in /bloge-console single-page app on top of the generic durable REST APIs. It gives operators a live view without standing up a separate frontend:
- Runtime overview cards — totals computed with store-side aggregate counts to avoid full scans on large datasets.
- Execution timelines — step-by-step activity per execution.
- SVG graph topology — visualize the running graph.
- Task inbox — claim and complete human tasks.
- Dead-letter replay — requeue failed work items.
Execution-activity and dead-letter views honor the current request's tenant context.
spring:
bloge:
web:
dispatch-limit: 32 # synchronous follow-up dispatch batch sizeThe durable task / execution / work-item / dead-letter APIs live under /api/bloge/**, with page size capped at 500 and free-text filters capped at 256 characters.
Event deduplication
External event publication is idempotent through a 4-argument publishEvent overload. The dedup store is auto-configured in Spring Boot and backed by bd_event_dedup in the durable stack, so a redelivered external event will not resume a flow twice.
Trace propagation
For distributed observability, bloge-metrics-otel provides OpenTelemetry + Micrometer integration for graph / node metrics and traces, and bloge-dispatch-kafka carries the W3C traceparent across the Kafka boundary via a TracePropagator SPI. See Observability (OTel).
Next steps
- Stand up the durable store in Durable Flows.
- Watch crash resumes appear in the journal — see Crash Recovery.
- Wire metrics and traces in Observability (OTel).