57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
|
package datastore
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"log"
|
||
|
"sync"
|
||
|
|
||
|
"go.dev.pztrn.name/metricator/internal/configuration"
|
||
|
)
|
||
|
|
||
|
// DataStore is a data storage structure. It keeps all gathered metrics and gives
|
||
|
// them away on request.
|
||
|
type DataStore struct {
|
||
|
config *configuration.Config
|
||
|
ctx context.Context
|
||
|
doneChan chan struct{}
|
||
|
|
||
|
datas map[string]*applicationStorage
|
||
|
datasMutex sync.RWMutex
|
||
|
}
|
||
|
|
||
|
// NewDataStore creates new data storage.
|
||
|
func NewDataStore(ctx context.Context, cfg *configuration.Config) (*DataStore, chan struct{}) {
|
||
|
ds := &DataStore{
|
||
|
config: cfg,
|
||
|
ctx: ctx,
|
||
|
doneChan: make(chan struct{}),
|
||
|
}
|
||
|
ds.initialize()
|
||
|
|
||
|
return ds, ds.doneChan
|
||
|
}
|
||
|
|
||
|
// Internal things initialization.
|
||
|
func (ds *DataStore) initialize() {
|
||
|
ds.datas = make(map[string]*applicationStorage)
|
||
|
|
||
|
// Create applications defined in configuration.
|
||
|
|
||
|
go func() {
|
||
|
<-ds.ctx.Done()
|
||
|
log.Println("Data storage stopped")
|
||
|
|
||
|
ds.doneChan <- struct{}{}
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
// Start starts data storage asynchronous things.
|
||
|
func (ds *DataStore) Start() {
|
||
|
log.Println("Starting data storage...")
|
||
|
|
||
|
ds.datasMutex.RLock()
|
||
|
for _, storage := range ds.datas {
|
||
|
storage.start()
|
||
|
}
|
||
|
}
|