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

123 lines
2.7 KiB
Go

package monitoring
import (
"log"
"sync"
"time"
"service-operation/pocketbase"
)
type MonitoringService struct {
pbClient *pocketbase.PocketBaseClient
activeServices map[string]*ServiceMonitor
regionalMonitor *RegionalMonitor
mu sync.RWMutex
stopChan chan bool
isRunning bool
}
func NewMonitoringService(pbClient *pocketbase.PocketBaseClient) *MonitoringService {
return &MonitoringService{
pbClient: pbClient,
activeServices: make(map[string]*ServiceMonitor),
regionalMonitor: NewRegionalMonitor(pbClient),
stopChan: make(chan bool),
isRunning: false,
}
}
func (ms *MonitoringService) Start() {
ms.mu.Lock()
defer ms.mu.Unlock()
if ms.isRunning {
log.Println("Monitoring service is already running")
return
}
ms.isRunning = true
//log.Println("Starting monitoring service...")
// Start regional monitoring
ms.regionalMonitor.Start()
// Start monitoring all services from PocketBase
go ms.monitoringLoop()
}
func (ms *MonitoringService) Stop() {
ms.mu.Lock()
defer ms.mu.Unlock()
if !ms.isRunning {
return
}
log.Println("Stopping monitoring service...")
ms.isRunning = false
// Stop regional monitoring
ms.regionalMonitor.Stop()
// Stop all active monitors
for serviceID, monitor := range ms.activeServices {
ms.stopMonitor(serviceID, monitor)
}
ms.stopChan <- true
}
func (ms *MonitoringService) GetRegionalInfo() (string, string) {
return ms.regionalMonitor.GetRegionalInfo()
}
func (ms *MonitoringService) monitoringLoop() {
ticker := time.NewTicker(30 * time.Second) // Check for new services every 30 seconds
defer ticker.Stop()
// Initial load of services
ms.loadAndStartServices()
for {
select {
case <-ticker.C:
ms.loadAndStartServices()
case <-ms.stopChan:
return
}
}
}
func (ms *MonitoringService) loadAndStartServices() {
// Only get services that are NOT paused
services, err := ms.pbClient.GetActiveServices()
if err != nil {
log.Printf("Failed to load services: %v", err)
return
}
ms.mu.Lock()
defer ms.mu.Unlock()
// Filter out paused services and start monitoring for active ones
activeServiceIDs := make(map[string]bool)
for _, service := range services {
if service.Status != "paused" {
activeServiceIDs[service.ID] = true
// Start monitoring if not already active
if _, exists := ms.activeServices[service.ID]; !exists {
ms.startMonitor(service)
}
}
}
// Stop monitoring for paused or removed services
for serviceID, monitor := range ms.activeServices {
if !activeServiceIDs[serviceID] {
log.Printf("Stopping monitoring for service %s (paused or removed)", serviceID)
ms.stopMonitor(serviceID, monitor)
}
}
}