github.com/Financial-Times/publish-availability-monitor@v1.12.0/metrics/history.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "sync" 6 ) 7 8 type History struct { 9 mu sync.RWMutex 10 PublishMetrics []PublishMetric 11 } 12 13 func NewHistory(metrics []PublishMetric) *History { 14 return &History{ 15 mu: sync.RWMutex{}, 16 PublishMetrics: metrics, 17 } 18 } 19 20 func (h *History) Update(newPublishResult PublishMetric) { 21 h.mu.Lock() 22 defer h.mu.Unlock() 23 24 if len(h.PublishMetrics) == 10 { 25 h.PublishMetrics = h.PublishMetrics[1:len(h.PublishMetrics)] 26 } 27 h.PublishMetrics = append(h.PublishMetrics, newPublishResult) 28 } 29 30 func (h *History) GetFailures() map[string]struct{} { 31 h.mu.RLock() 32 defer h.mu.RUnlock() 33 34 failures := make(map[string]struct{}) 35 var emptyStruct struct{} 36 for i := 0; i < len(h.PublishMetrics); i++ { 37 if !h.PublishMetrics[i].PublishOK { 38 failures[h.PublishMetrics[i].UUID] = emptyStruct 39 } 40 } 41 42 return failures 43 } 44 45 func (h *History) String() string { 46 h.mu.RLock() 47 defer h.mu.RUnlock() 48 49 var s string 50 for i := len(h.PublishMetrics) - 1; i >= 0; i-- { 51 s += fmt.Sprintf("%d. %v\n\n", len(h.PublishMetrics)-i, h.PublishMetrics[i]) 52 } 53 54 return s 55 } 56 57 func (h *History) Len() int { 58 h.mu.RLock() 59 defer h.mu.RUnlock() 60 return len(h.PublishMetrics) 61 } 62 63 func (h *History) First() *PublishMetric { 64 h.mu.RLock() 65 defer h.mu.RUnlock() 66 return &h.PublishMetrics[0] 67 }