mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-05-13 06:56:06 +00:00
Implements comprehensive Docker monitoring with a dedicated agent that collects container metrics and reports them to the main Pulse server. Adds Docker-specific alert rules and threshold management with a redesigned UI. Backend changes: - Add Docker agent binary with container metrics collection - Implement Docker host and container models with CPU/memory tracking - Add Docker-specific alert types (offline, state, health) - Extend threshold system to support Docker resources - Add WebSocket message types for Docker agent communication - Implement Docker agent API endpoints for registration and metrics Frontend changes: - Add Docker monitoring page with host/container views - Add Docker agent settings panel for configuration - Reorganize thresholds page with Proxmox/Docker tabs - Add Docker-specific alert threshold management - Improve layout consistency with vertical stacking - Fix defensive null checks and TypeScript errors This change enables monitoring of Docker containers across multiple hosts with the same alerting and threshold capabilities as Proxmox resources.
69 lines
2 KiB
Go
69 lines
2 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/monitoring"
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/utils"
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/websocket"
|
|
agentsdocker "github.com/rcourtman/pulse-go-rewrite/pkg/agents/docker"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
// DockerAgentHandlers manages ingest from the external Docker agent.
|
|
type DockerAgentHandlers struct {
|
|
monitor *monitoring.Monitor
|
|
wsHub *websocket.Hub
|
|
}
|
|
|
|
// NewDockerAgentHandlers constructs a new Docker agent handler group.
|
|
func NewDockerAgentHandlers(m *monitoring.Monitor, hub *websocket.Hub) *DockerAgentHandlers {
|
|
return &DockerAgentHandlers{monitor: m, wsHub: hub}
|
|
}
|
|
|
|
// HandleReport accepts heartbeat payloads from the Docker agent.
|
|
func (h *DockerAgentHandlers) HandleReport(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
writeErrorResponse(w, http.StatusMethodNotAllowed, "method_not_allowed", "Only POST is allowed", nil)
|
|
return
|
|
}
|
|
|
|
defer r.Body.Close()
|
|
|
|
var report agentsdocker.Report
|
|
if err := json.NewDecoder(r.Body).Decode(&report); err != nil {
|
|
writeErrorResponse(w, http.StatusBadRequest, "invalid_json", "Failed to decode request body", map[string]string{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if report.Timestamp.IsZero() {
|
|
report.Timestamp = time.Now()
|
|
}
|
|
|
|
host, err := h.monitor.ApplyDockerReport(report)
|
|
if err != nil {
|
|
writeErrorResponse(w, http.StatusBadRequest, "invalid_report", err.Error(), nil)
|
|
return
|
|
}
|
|
|
|
log.Debug().
|
|
Str("dockerHost", host.Hostname).
|
|
Int("containers", len(host.Containers)).
|
|
Msg("Docker agent report processed")
|
|
|
|
// Broadcast the updated state for near-real-time UI updates
|
|
go h.wsHub.BroadcastState(h.monitor.GetState().ToFrontend())
|
|
|
|
response := map[string]any{
|
|
"success": true,
|
|
"hostId": host.ID,
|
|
"containers": len(host.Containers),
|
|
"lastSeen": host.LastSeen,
|
|
}
|
|
|
|
if err := utils.WriteJSONResponse(w, response); err != nil {
|
|
log.Error().Err(err).Msg("Failed to serialize docker agent response")
|
|
}
|
|
}
|