package conditions import "time" // The events a condition's life emits (to-be 45 §2), as the mesh-controller seat's own: published on // `mesh.seat.mesh-controller.event.`, on the events stream, so a consumer that was away catches // up. **This is a contract**: the operator-channel's holder is written against these names and the // shape of Event, and the controller learns nothing about telling. const ( // EventRaised: a condition was raised — new, or the same fault again within ReopenWithin of its // clearing (Change says which). A reopened condition is not news: its key is the one the // first message was about. EventRaised = "condition-raised" // EventChanged: its severity, its resolver or its silence changed. Not every observation: a // condition observed again is written, and says nothing. EventChanged = "condition-changed" // EventCleared: an observation says it is resolved. The condition is removed from the store and // the transition kept in its history. EventCleared = "condition-cleared" ) // Events is every event a condition's life emits. var Events = []string{EventRaised, EventChanged, EventCleared} // HeartbeatEvent is the self-check's heartbeat (to-be 45 §4, S10), said under the same seat at the end // of every run: `{run, at, interval-seconds, counts: {passed, failed, failed-to-run, deferred}, probes, // controller, why}`. mesh-watcher, on a machine that is not the control node, listens for it. const HeartbeatEvent = "doctor-heartbeat" // What changed, as an event's Change and a history entry's says it. const ( ChangeRaised = "raised" ChangeReopened = "reopened" ChangeSeverity = "severity" ChangeResolver = "resolver" ChangeSilenced = "silenced" ChangeUnsilenced = "silence-ended" ChangeCleared = "cleared" ) // Event is the body of every condition event, and the shape a history entry keeps: **the condition // itself, at the top level** — key, kind, subject, severity, summary, source, raised, last-observed, // observations, resolver, silenced (null when not), epoch, and the evidence — with what happened to // it beside. One object a consumer reads the same way whichever of the three it is. type Event struct { // Condition is the condition after the transition — as it was last held, for a clearing. Condition // Event is the event's own name, so a body read without its subject still says what it is. Event string `json:"event"` // At is when the transition happened. At time.Time `json:"at"` // Change is what happened: raised, reopened, severity, resolver, silenced, silence-ended, cleared. Change string `json:"change"` // Was is the value before, for a severity or resolver change. Was string `json:"was,omitempty"` // Why says why it cleared, or why it was silenced. Why string `json:"why,omitempty"` // Cleared is when it cleared, on a clearing. Cleared *time.Time `json:"cleared,omitempty"` // Show is the verb that shows more. Show string `json:"show"` } // eventFor is the event a change is said under. func eventFor(change string) string { switch change { case ChangeRaised, ChangeReopened: return EventRaised case ChangeCleared: return EventCleared } return EventChanged }