mirror of
https://github.com/prymitive/karma
synced 2026-05-07 03:26:52 +00:00
153 lines
4.0 KiB
Go
153 lines
4.0 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/go-json-experiment/json/jsontext"
|
|
)
|
|
|
|
// AlertmanagerInstance describes the Alertmanager instance alert was collected
|
|
// from
|
|
type AlertmanagerInstance struct {
|
|
// timestamp collected from this instance, those on the alert itself
|
|
// will be calculated min/max values
|
|
StartsAt time.Time `json:"startsAt"`
|
|
// all silences matching current alert in this upstream, we don't export this
|
|
// in api responses, this is used internally
|
|
Silences map[string]*Silence `json:"-"`
|
|
Fingerprint string `json:"fingerprint"`
|
|
Name string `json:"name"`
|
|
Cluster string `json:"cluster"`
|
|
// Source links to alert source for given alertmanager instance
|
|
Source string `json:"source"`
|
|
// export list of silenced IDs in api response
|
|
SilencedBy []string `json:"silencedBy"`
|
|
InhibitedBy []string `json:"inhibitedBy"`
|
|
// per instance alert state
|
|
State AlertState `json:"state"`
|
|
}
|
|
|
|
func (am AlertmanagerInstance) MarshalJSONTo(enc *jsontext.Encoder) error {
|
|
w := jsonWriter{enc: enc}
|
|
am.marshalTo(&w)
|
|
return w.err
|
|
}
|
|
|
|
func (am *AlertmanagerInstance) marshalTo(w *jsonWriter) {
|
|
w.beginObject()
|
|
w.key("startsAt")
|
|
w.time(am.StartsAt)
|
|
w.key("fingerprint")
|
|
w.str(am.Fingerprint)
|
|
w.key("name")
|
|
w.str(am.Name)
|
|
w.key("cluster")
|
|
w.str(am.Cluster)
|
|
w.key("source")
|
|
w.str(am.Source)
|
|
w.key("silencedBy")
|
|
w.strings(am.SilencedBy)
|
|
w.key("inhibitedBy")
|
|
w.strings(am.InhibitedBy)
|
|
w.key("state")
|
|
w.str(am.State.String())
|
|
w.endObject()
|
|
}
|
|
|
|
// AlertmanagerAPIStatus describes the Alertmanager instance overall health
|
|
type AlertmanagerAPIStatus struct {
|
|
Headers map[string]string `json:"headers"`
|
|
Name string `json:"name"`
|
|
URI string `json:"uri"`
|
|
PublicURI string `json:"publicURI"`
|
|
CORSCredentials string `json:"corsCredentials"`
|
|
Error string `json:"error"`
|
|
Version string `json:"version"`
|
|
Cluster string `json:"cluster"`
|
|
ClusterMembers []string `json:"clusterMembers"`
|
|
ReadOnly bool `json:"readonly"`
|
|
}
|
|
|
|
func (s AlertmanagerAPIStatus) MarshalJSONTo(enc *jsontext.Encoder) error {
|
|
w := jsonWriter{enc: enc}
|
|
s.marshalTo(&w)
|
|
return w.err
|
|
}
|
|
|
|
func (s *AlertmanagerAPIStatus) marshalTo(w *jsonWriter) {
|
|
w.beginObject()
|
|
w.key("headers")
|
|
w.mapStringString(s.Headers)
|
|
w.key("name")
|
|
w.str(s.Name)
|
|
w.key("uri")
|
|
w.str(s.URI)
|
|
w.key("publicURI")
|
|
w.str(s.PublicURI)
|
|
w.key("corsCredentials")
|
|
w.str(s.CORSCredentials)
|
|
w.key("error")
|
|
w.str(s.Error)
|
|
w.key("version")
|
|
w.str(s.Version)
|
|
w.key("cluster")
|
|
w.str(s.Cluster)
|
|
w.key("clusterMembers")
|
|
w.strings(s.ClusterMembers)
|
|
w.key("readonly")
|
|
w.boolean(s.ReadOnly)
|
|
w.endObject()
|
|
}
|
|
|
|
// AlertmanagerAPICounters returns number of Alertmanager instances in each
|
|
// state
|
|
type AlertmanagerAPICounters struct {
|
|
Total int `json:"total"`
|
|
Healthy int `json:"healthy"`
|
|
Failed int `json:"failed"`
|
|
}
|
|
|
|
func (c AlertmanagerAPICounters) MarshalJSONTo(enc *jsontext.Encoder) error {
|
|
w := jsonWriter{enc: enc}
|
|
w.beginObject()
|
|
w.key("total")
|
|
w.integer(c.Total)
|
|
w.key("healthy")
|
|
w.integer(c.Healthy)
|
|
w.key("failed")
|
|
w.integer(c.Failed)
|
|
w.endObject()
|
|
return w.err
|
|
}
|
|
|
|
// AlertmanagerAPISummary describes the Alertmanager instance overall health
|
|
type AlertmanagerAPISummary struct {
|
|
Clusters map[string][]string `json:"clusters"`
|
|
Instances []AlertmanagerAPIStatus `json:"instances"`
|
|
Counters AlertmanagerAPICounters `json:"counters"`
|
|
}
|
|
|
|
func (s AlertmanagerAPISummary) MarshalJSONTo(enc *jsontext.Encoder) error {
|
|
w := jsonWriter{enc: enc}
|
|
w.beginObject()
|
|
w.key("clusters")
|
|
w.mapStringStringSlice(s.Clusters)
|
|
w.key("instances")
|
|
w.beginArray()
|
|
for i := range s.Instances {
|
|
s.Instances[i].marshalTo(&w)
|
|
}
|
|
w.endArray()
|
|
w.key("counters")
|
|
w.beginObject()
|
|
w.key("total")
|
|
w.integer(s.Counters.Total)
|
|
w.key("healthy")
|
|
w.integer(s.Counters.Healthy)
|
|
w.key("failed")
|
|
w.integer(s.Counters.Failed)
|
|
w.endObject()
|
|
w.endObject()
|
|
return w.err
|
|
}
|