Files
2026-07-13 12:31:02 +08:00

114 lines
2.9 KiB
Go

package monitoring
import (
"log"
"time"
"service-operation/pocketbase"
)
type RegionalMonitor struct {
pbClient *pocketbase.PocketBaseClient
regionalService *pocketbase.RegionalService
isOnline bool
ticker *time.Ticker
stopChan chan bool
}
func NewRegionalMonitor(pbClient *pocketbase.PocketBaseClient) *RegionalMonitor {
return &RegionalMonitor{
pbClient: pbClient,
isOnline: false,
stopChan: make(chan bool),
}
}
func (rm *RegionalMonitor) Start() {
// Get or create the "Default" regional service
service, err := rm.pbClient.GetDefaultRegionalService()
if err != nil {
log.Printf("Warning: Could not get default regional service: %v", err)
log.Printf("Regional monitoring will continue with fallback values")
// Continue with fallback service
service = &pocketbase.RegionalService{
ID: "default",
RegionName: "Default",
Status: "active",
AgentID: "1",
AgentIPAddress: "127.0.0.1",
Connection: "offline",
Token: "default-token",
}
}
rm.regionalService = service
rm.ticker = time.NewTicker(30 * time.Second) // Check connection every 30 seconds
// Initial connection status update
rm.updateConnectionStatus("online")
rm.isOnline = true
log.Printf("✓Default Regional monitor started for region: %s (Agent ID: %s)",
service.RegionName, service.AgentID)
go func() {
for {
select {
case <-rm.ticker.C:
rm.checkConnection()
case <-rm.stopChan:
rm.ticker.Stop()
return
}
}
}()
}
func (rm *RegionalMonitor) Stop() {
if rm.regionalService != nil {
rm.updateConnectionStatus("offline")
log.Printf("Regional monitor stopped for region: %s", rm.regionalService.RegionName)
}
if rm.ticker != nil {
rm.ticker.Stop()
}
rm.stopChan <- true
}
func (rm *RegionalMonitor) checkConnection() {
// Test PocketBase connection to determine if we're online
err := rm.pbClient.TestConnection()
if err != nil && rm.isOnline {
// We were online but now we're offline
rm.updateConnectionStatus("offline")
rm.isOnline = false
log.Printf("Regional agent went offline: %v", err)
} else if err == nil && !rm.isOnline {
// We were offline but now we're online
rm.updateConnectionStatus("online")
rm.isOnline = true
log.Printf("Regional agent back online")
}
}
func (rm *RegionalMonitor) updateConnectionStatus(status string) {
if rm.regionalService == nil {
return
}
if err := rm.pbClient.UpdateRegionalServiceConnection(rm.regionalService.ID, status); err != nil {
// Don't log errors for update failures - might be due to collection access issues
// log.Printf("Failed to update regional service connection status: %v", err)
}
}
func (rm *RegionalMonitor) GetRegionalInfo() (string, string) {
if rm.regionalService == nil {
return "Default", "1" // Fallback values
}
return rm.regionalService.RegionName, rm.regionalService.AgentID
}