Skip to main content
The event stream is an internal in-process mechanism that publishes system and cluster events to subscribers. It is separate from application-level pub/sub (see PubSub). The event stream uses a fixed internal topic; you cannot create custom topics or publish application messages to it.

Purpose

The framework publishes lifecycle and cluster events so that external components (monitoring, logging, dashboards) can observe the actor system without coupling to internal implementation. Subscribers receive events as they occur—actor started, actor stopped, node joined, dead letter, and so on.

API

The eventstream.Subscriber interface:

Message structure

Each message has:
  • Topicmsg.Topic() returns the topic (e.g. topic.events, the internal topic).
  • Payloadmsg.Payload() returns the event. Use a type assertion to handle specific events.

Event types

The system publishes these events to the event stream:

Usage

Iterator() returns a channel that drains buffered messages and then closes. Messages enqueued concurrently with (or after) the call may not be included. For continuous observation, loop over Iterator() or use a dedicated goroutine that reads from the channel.

Implementation notes

  • The event stream is backed by the eventstream package. The actor system creates an EventsStream at startup and subscribes callers to the internal topic topic.events.
  • Lifecycle events (ActorStarted, ActorStopped, etc.) are published by the PID and death-watch logic. Cluster events (NodeJoined, NodeLeft) are published by the cluster events loop when membership changes. LeaderChanged is published from the same loop, on every node, whenever a topology event reveals that the coordinator moved to a different node; the initial coordinator election on startup is not published, only subsequent transitions.
  • RelocationFailed is published by the relocator when a departed node’s actors or grains cannot be re-deployed. Each item is retried a bounded number of times with backoff before it is reported, and the report is terminal: the relocation run does not revisit failed items, so subscribe to this event to drive your own recovery (for example, re-spawning the affected actors or alerting).
  • RelocationStarted is published by the leader whenever it starts relocating a departed node’s actors and grains, for graceful shutdowns and crashes alike. BestEffort() distinguishes the two: false means the set comes from the departed node’s graceful-shutdown snapshot and is complete; true means the node crashed and the set was reconstructed from the replicated cluster registry, so records lost with the crashed node’s partitions cannot be listed, and an empty or unexpectedly small set signals suspected record loss. See the relocation page for the replication settings that govern completeness.
  • Dead letters are published by the dead-letter actor when messages cannot be delivered.
  • The event stream is always present; no option is required. It is independent of WithPubSub() and cluster mode.
  • Observability — Metrics and dead letters
  • PubSub — Application-level topic-based pub/sub (separate mechanism)