package obs import ( "sync" "time" "github.com/prometheus/client_golang/prometheus" ) func (r *Registry) AuthzOutcomes(outcomes []string) func(outcome string) { c := r.Counter("tug_authz_outcomes_total", "Forward-auth decisions on /authz, by outcome.", Label{Name: "outcome", Values: outcomes}) return func(outcome string) { c.Inc(outcome) } } func (r *Registry) LDAPBinds(results []string) func(result string) { c := r.Counter("tug_ldap_binds_total", "LDAP simple binds, by result.", Label{Name: "result", Values: results}) refused := r.refused([]string{axisUsername, routeLDAPBind}, []string{axisAddress, routeLDAPBind}) return func(result string) { c.Inc(result) switch result { case resultLocked: refused.Inc(axisUsername, routeLDAPBind) case resultLimited: refused.Inc(axisAddress, routeLDAPBind) } } } func (r *Registry) UserbaseLastPush() func(at time.Time) { if r == nil { return func(time.Time) {} } desc := prometheus.NewDesc("tug_userbase_last_push_timestamp_seconds", "When the userbase replicator last pushed an export to its repository, in Unix seconds.", nil, nil) var mu sync.Mutex var last time.Time r.reg.MustRegister(readCollector{descs: []*prometheus.Desc{desc}, collect: func(ch chan<- prometheus.Metric) { mu.Lock() at := last mu.Unlock() if !at.IsZero() { ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, float64(at.UnixNano())/1e9) } }}) return func(at time.Time) { mu.Lock() defer mu.Unlock() last = at } }