commit inicial do projeto
This commit is contained in:
57
internal/monitor/heartbeat.go
Normal file
57
internal/monitor/heartbeat.go
Normal file
@ -0,0 +1,57 @@
|
||||
package monitor
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
peers = make(map[string]bool)
|
||||
peersLock sync.RWMutex
|
||||
heartbeatFreq = 3 * time.Second
|
||||
)
|
||||
|
||||
func StartHeartbeatMonitor() {
|
||||
peerList := strings.Split(os.Getenv("DEJO_PEERS"), ",")
|
||||
for _, p := range peerList {
|
||||
peers[p] = false // Inicialmente offline
|
||||
}
|
||||
|
||||
go func() {
|
||||
ticker := time.NewTicker(heartbeatFreq)
|
||||
for range ticker.C {
|
||||
checkPeers(peerList)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func checkPeers(peerList []string) {
|
||||
for _, peer := range peerList {
|
||||
go func(p string) {
|
||||
resp, err := http.Get(p + "/ping")
|
||||
peersLock.Lock()
|
||||
defer peersLock.Unlock()
|
||||
if err != nil || resp.StatusCode != http.StatusOK {
|
||||
if peers[p] {
|
||||
log.Printf("⚠️ Peer %s está OFFLINE", p)
|
||||
}
|
||||
peers[p] = false
|
||||
} else {
|
||||
if !peers[p] {
|
||||
log.Printf("✅ Peer %s voltou ONLINE", p)
|
||||
}
|
||||
peers[p] = true
|
||||
}
|
||||
} (peer)
|
||||
}
|
||||
}
|
||||
|
||||
func IsPeerOnline(peer string) bool {
|
||||
peersLock.RLock()
|
||||
defer peersLock.RUnlock()
|
||||
return peers[peer]
|
||||
}
|
||||
43
internal/monitor/monitor.go
Normal file
43
internal/monitor/monitor.go
Normal file
@ -0,0 +1,43 @@
|
||||
package monitor
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Monitor struct {
|
||||
peers map[string]bool
|
||||
mutex sync.RWMutex
|
||||
heartbeatFn func(peer string) bool
|
||||
}
|
||||
|
||||
func NewMonitor(heartbeatFn func(peer string) bool) *Monitor {
|
||||
return &Monitor{
|
||||
peers: make(map[string]bool),
|
||||
heartbeatFn: heartbeatFn,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Monitor) Start(peers []string) {
|
||||
for _, peer := range peers {
|
||||
go func(p string) {
|
||||
for {
|
||||
m.updateStatus(p)
|
||||
time.Sleep(5 * time.Second)
|
||||
}
|
||||
}(peer)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Monitor) updateStatus(peer string) {
|
||||
alive := m.heartbeatFn(peer)
|
||||
m.mutex.Lock()
|
||||
defer m.mutex.Unlock()
|
||||
m.peers[peer] = alive
|
||||
}
|
||||
|
||||
func (m *Monitor) IsPeerOnline(peer string) bool {
|
||||
m.mutex.RLock()
|
||||
defer m.mutex.RUnlock()
|
||||
return m.peers[peer]
|
||||
}
|
||||
Reference in New Issue
Block a user