mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-11 22:12:23 +00:00
30fa3fd810
Add comprehensive PMG monitoring with mail statistics, queue depth tracking, spam distribution analysis, and quarantine monitoring. Includes full discovery support and UI consistency improvements across all Proxmox products. Backend: - Add pkg/pmg package with complete API client for PMG operations - Implement mail statistics collection (inbound/outbound, spam, virus, bounces) - Add queue depth monitoring (active, deferred, hold, incoming queues) - Support spam score distribution and quarantine totals - Add PMG-specific discovery logic to differentiate from PVE on port 8006 - Extend mock data generator with realistic PMG instances and metrics - Add PMG node configuration support in config system Frontend: - Create MailGateway.tsx component with detailed PMG dashboard - Display mail flow statistics with time-series charts - Show queue depth with color-coded warnings (>50 messages or >30min age) - Add spam distribution histogram and quarantine status - Support cluster node status with individual queue monitoring - Add PMG to network discovery with purple branding and mail icon - Implement conditional navigation (hide PMG tab when no instances configured) - Standardize discovery UI controls across PVE/PBS/PMG settings pages API: - Add /api/config/pmg endpoints for node configuration - Support PMG-specific monitoring toggles (mail stats, queues, quarantine) - Extend system settings with PMG configuration options Discovery: - Detect PMG vs PVE on shared port 8006 using /api2/json/statistics/mail endpoint - Return 'pmg' type for mail gateway servers in discovery results - Update DiscoveryModal to display PMG servers with appropriate styling This completes ecosystem monitoring support for all three Proxmox products: Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
60 lines
2.4 KiB
Go
60 lines
2.4 KiB
Go
package interfaces
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/models"
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/types"
|
|
)
|
|
|
|
// StateStore defines the interface for state management
|
|
type StateStore interface {
|
|
GetSnapshot() models.StateSnapshot
|
|
UpdateNodes(nodes []models.Node)
|
|
UpdateNodesForInstance(instanceName string, nodes []models.Node)
|
|
UpdateVMs(vms []models.VM)
|
|
UpdateVMsForInstance(instanceName string, vms []models.VM)
|
|
UpdateContainers(containers []models.Container)
|
|
UpdateContainersForInstance(instanceName string, containers []models.Container)
|
|
UpdateStorage(storage []models.Storage)
|
|
UpdateCephClustersForInstance(instanceName string, clusters []models.CephCluster)
|
|
UpdatePBSInstances(instances []models.PBSInstance)
|
|
UpdatePMGInstances(instances []models.PMGInstance)
|
|
SetConnectionHealth(instance string, healthy bool)
|
|
}
|
|
|
|
// WebSocketHub defines the interface for WebSocket hub
|
|
type WebSocketHub interface {
|
|
BroadcastState(state interface{})
|
|
GetClientCount() int
|
|
Run(ctx context.Context)
|
|
}
|
|
|
|
// MetricsStore defines the interface for metrics storage
|
|
type MetricsStore interface {
|
|
AddGuestMetric(guestID string, metricType string, value float64, timestamp time.Time)
|
|
AddNodeMetric(nodeID string, metricType string, value float64, timestamp time.Time)
|
|
AddStorageMetric(storageID string, metricType string, value float64, timestamp time.Time)
|
|
GetGuestMetrics(guestID string, metricType string, duration time.Duration) []types.MetricPoint
|
|
GetNodeMetrics(nodeID string, metricType string, duration time.Duration) []types.MetricPoint
|
|
GetAllGuestMetrics(guestID string, duration time.Duration) map[string][]types.MetricPoint
|
|
GetAllStorageMetrics(storageID string, duration time.Duration) map[string][]types.MetricPoint
|
|
Cleanup()
|
|
}
|
|
|
|
// Monitor defines the interface for the monitoring system
|
|
type Monitor interface {
|
|
Start(ctx context.Context, hub WebSocketHub)
|
|
GetState() models.StateSnapshot
|
|
GetStartTime() time.Time
|
|
GetGuestMetrics(guestID string, duration time.Duration) map[string][]types.MetricPoint
|
|
GetNodeMetrics(nodeID string, metricType string, duration time.Duration) []types.MetricPoint
|
|
GetStorageMetrics(storageID string, duration time.Duration) map[string][]types.MetricPoint
|
|
}
|
|
|
|
// RateTracker defines the interface for rate tracking
|
|
type RateTracker interface {
|
|
CalculateRates(guestID string, current types.IOMetrics) (diskRead, diskWrite, netIn, netOut float64)
|
|
}
|