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  }