package metrics import ( "github.com/prometheus/client_golang/prometheus" "rgdd.se/silentct/internal/monitor" "rgdd.se/silentct/pkg/storage/index" ) type Metrics struct { logSize *prometheus.GaugeVec logIndex *prometheus.GaugeVec logTimestamp *prometheus.GaugeVec certificateAlert *prometheus.GaugeVec errorCounter prometheus.Counter } func NewMetrics(registry *prometheus.Registry) *Metrics { m := &Metrics{ logSize: prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "silentct_log_size", Help: "The number of entries in the log.", }, []string{"id"}, ), logIndex: prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "silentct_log_index", Help: "The next log entry to be downloaded.", }, []string{"id"}, ), logTimestamp: prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "silentct_log_timestamp", Help: "The log's UNIX timestamp in ms.", }, []string{"id"}, ), certificateAlert: prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "silentct_certificate_alert", Help: "The time the certificate without allowlisting was found.", }, []string{"stored_at"}, ), errorCounter: prometheus.NewCounter( prometheus.CounterOpts{ Name: "silentct_error_counter", Help: "The number of errors propagated to the main loop.", }, ), } registry.MustRegister(m.logSize, m.logIndex, m.logTimestamp, m.certificateAlert, m.errorCounter) return m } func (m *Metrics) LogState(state monitor.State) { id := state.LogID.Base64String() m.logIndex.WithLabelValues(id).Set(float64(state.NextIndex)) m.logSize.WithLabelValues(id).Set(float64(state.TreeSize)) m.logTimestamp.WithLabelValues(id).Set(float64(state.Timestamp)) } func (m *Metrics) RemoveLogState(state monitor.State) { id := state.LogID.Base64String() m.logIndex.Delete(prometheus.Labels{"id": id}) m.logSize.Delete(prometheus.Labels{"id": id}) m.logTimestamp.Delete(prometheus.Labels{"id": id}) } func (m *Metrics) CertificateAlert(alerts []index.CertificateInfo) { m.certificateAlert.Reset() for _, alert := range alerts { m.certificateAlert.WithLabelValues(alert.StoredAt).Set(float64(alert.ObservedAt.Unix())) } } func (m *Metrics) CountError() { m.errorCounter.Inc() }