2020-12-29 21:47:57 +01:00
|
|
|
package storage
|
|
|
|
|
|
|
|
import (
|
2021-01-09 04:41:57 +01:00
|
|
|
"encoding/json"
|
2020-12-29 21:47:57 +01:00
|
|
|
"fmt"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/TwinProduction/gatus/core"
|
|
|
|
)
|
|
|
|
|
|
|
|
// InMemoryStore implements an in-memory store
|
2020-12-31 21:37:11 +01:00
|
|
|
type InMemoryStore struct {
|
|
|
|
serviceStatuses map[string]*core.ServiceStatus
|
|
|
|
serviceResultsMutex sync.RWMutex
|
|
|
|
}
|
2020-12-29 21:47:57 +01:00
|
|
|
|
|
|
|
// NewInMemoryStore returns an in-memory store. Note that the store acts as a singleton, so although new-ing
|
|
|
|
// up in-memory stores will give you a unique reference to a struct each time, all structs returned
|
|
|
|
// by this function will act on the same in-memory store.
|
2020-12-31 21:49:13 +01:00
|
|
|
func NewInMemoryStore() *InMemoryStore {
|
|
|
|
return &InMemoryStore{
|
2020-12-31 21:37:11 +01:00
|
|
|
serviceStatuses: make(map[string]*core.ServiceStatus),
|
|
|
|
}
|
2020-12-29 21:47:57 +01:00
|
|
|
}
|
|
|
|
|
2021-01-09 04:41:57 +01:00
|
|
|
// GetAllAsJSON returns the JSON encoding of all monitored core.ServiceStatus
|
|
|
|
func (ims *InMemoryStore) GetAllAsJSON() ([]byte, error) {
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.RLock()
|
2021-01-09 04:41:57 +01:00
|
|
|
serviceStatuses, err := json.Marshal(ims.serviceStatuses)
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.RUnlock()
|
2021-01-09 04:41:57 +01:00
|
|
|
return serviceStatuses, err
|
2020-12-29 21:47:57 +01:00
|
|
|
}
|
|
|
|
|
2020-12-31 21:33:35 +01:00
|
|
|
// GetServiceStatus returns the service status for a given service name in the given group
|
|
|
|
func (ims *InMemoryStore) GetServiceStatus(group, name string) *core.ServiceStatus {
|
|
|
|
key := fmt.Sprintf("%s_%s", group, name)
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.RLock()
|
2020-12-31 22:56:06 +01:00
|
|
|
serviceStatus := ims.serviceStatuses[key]
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.RUnlock()
|
2020-12-31 21:33:35 +01:00
|
|
|
return serviceStatus
|
|
|
|
}
|
|
|
|
|
2020-12-29 21:47:57 +01:00
|
|
|
// Insert inserts the observed result for the specified service into the in memory store
|
|
|
|
func (ims *InMemoryStore) Insert(service *core.Service, result *core.Result) {
|
|
|
|
key := fmt.Sprintf("%s_%s", service.Group, service.Name)
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.Lock()
|
|
|
|
serviceStatus, exists := ims.serviceStatuses[key]
|
2020-12-29 21:47:57 +01:00
|
|
|
if !exists {
|
|
|
|
serviceStatus = core.NewServiceStatus(service)
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceStatuses[key] = serviceStatus
|
2020-12-29 21:47:57 +01:00
|
|
|
}
|
|
|
|
serviceStatus.AddResult(result)
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.Unlock()
|
2020-12-29 21:47:57 +01:00
|
|
|
}
|
|
|
|
|
2020-12-30 11:57:17 +01:00
|
|
|
// Clear will empty all the results from the in memory store
|
|
|
|
func (ims *InMemoryStore) Clear() {
|
2020-12-31 21:37:11 +01:00
|
|
|
ims.serviceResultsMutex.Lock()
|
|
|
|
ims.serviceStatuses = make(map[string]*core.ServiceStatus)
|
|
|
|
ims.serviceResultsMutex.Unlock()
|
2020-12-30 11:57:17 +01:00
|
|
|
}
|