add observer
This commit is contained in:
76
service/status.go
Normal file
76
service/status.go
Normal file
@ -0,0 +1,76 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/x/stats"
|
||||
)
|
||||
|
||||
const (
|
||||
MaxEventSize = 20
|
||||
)
|
||||
|
||||
type State string
|
||||
|
||||
const (
|
||||
StateRunning State = "running"
|
||||
StateReady State = "ready"
|
||||
StateFailed State = "failed"
|
||||
StateClosed State = "closed"
|
||||
)
|
||||
|
||||
type Event struct {
|
||||
Time time.Time
|
||||
Message string
|
||||
}
|
||||
|
||||
type Status struct {
|
||||
createTime time.Time
|
||||
state State
|
||||
events []Event
|
||||
stats *stats.Stats
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
func (p *Status) CreateTime() time.Time {
|
||||
return p.createTime
|
||||
}
|
||||
|
||||
func (p *Status) State() State {
|
||||
p.mu.RLock()
|
||||
defer p.mu.RUnlock()
|
||||
return p.state
|
||||
}
|
||||
|
||||
func (p *Status) setState(state State) {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
p.state = state
|
||||
}
|
||||
|
||||
func (p *Status) Events() []Event {
|
||||
events := make([]Event, MaxEventSize)
|
||||
|
||||
p.mu.RLock()
|
||||
defer p.mu.RUnlock()
|
||||
|
||||
copy(events, p.events)
|
||||
return events
|
||||
}
|
||||
|
||||
func (p *Status) addEvent(event Event) {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
if len(p.events) == MaxEventSize {
|
||||
events := make([]Event, MaxEventSize-1, MaxEventSize)
|
||||
copy(events, p.events[1:])
|
||||
p.events = events
|
||||
}
|
||||
p.events = append(p.events, event)
|
||||
}
|
||||
|
||||
func (p *Status) Stats() *stats.Stats {
|
||||
return p.stats
|
||||
}
|
Reference in New Issue
Block a user