Statusengine takes every event out of your monitoring core the moment it happens and hands it to a message queue. A Go worker drains that queue: history and current state into MySQL, performance data into Graphite, and a live WebSocket stream for anything that wants the events as they arrive.
flowchart LR
core["Naemon / Nagios Core"] -->|NEB callbacks| broker["Broker module<br/>libstatusengine.so"]
broker -->|JSON| queue{{"Gearman<br/>or RabbitMQ"}}
queue --> worker["Statusengine Worker<br/>(Go)"]
worker -->|bulk INSERT| mysql[("MySQL")]
worker -->|perfdata| graphite[("Graphite")]
mysql -->|current state| ui["Web Interface<br/>seid"]
worker -->|live events, WebSocket| ui
worker -->|live events, WebSocket| clients["Other WebSocket clients<br/>dashboards, notifiers"]
ui -.->|POST /commands| worker
worker -.-> queue
queue -.-> broker
broker -.->|external commands| core
Reading runs left to right and ends at the database. The web interface picks it up from there: current state comes out of MySQL, and a WebSocket to the worker keeps it live instead of polling.
It is not a privileged client, only the first one. The worker fans the same stream out to as many subscribers as connect, each with its own buffer, so a dashboard or a chat notifier of your own reads exactly what the interface reads.
The dotted path is the same route in reverse, and it is what makes the queue
two-way. Acknowledging a problem or forcing a check posts to the worker’s
/commands API, the worker publishes it onto the command queue, the broker
consumes it, and the core receives it as an external command.