From c6c46aee68015d5fb61e83d975f3354522ceb9d9 Mon Sep 17 00:00:00 2001 From: "zero@thinky" Date: Sun, 5 Apr 2026 08:07:32 +0300 Subject: [PATCH] feat(agent): unify service statuses across monitor impls --- agent/internal/models/service.go | 18 +++++++++++++++++- agent/internal/monitor/docker/impl.go | 18 +++++++++++++++++- agent/internal/monitor/kubes/impl.go | 18 +++++++++++++++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/agent/internal/models/service.go b/agent/internal/models/service.go index 4b6c9d4..5a9bcec 100644 --- a/agent/internal/models/service.go +++ b/agent/internal/models/service.go @@ -1,6 +1,22 @@ package models +// ServiceStatus represents the unified status of a service across all monitor types. +type ServiceStatus string + +const ( + StatusRunning ServiceStatus = "running" + StatusStopped ServiceStatus = "stopped" + StatusDegraded ServiceStatus = "degraded" + StatusPending ServiceStatus = "pending" + StatusUnknown ServiceStatus = "unknown" +) + +// IsHealthy reports whether the service is stable enough for dependents to rely on. +func (s ServiceStatus) IsHealthy() bool { + return s == StatusRunning +} + type Service struct { Name string - Status string + Status ServiceStatus } diff --git a/agent/internal/monitor/docker/impl.go b/agent/internal/monitor/docker/impl.go index 24cc956..b983e20 100644 --- a/agent/internal/monitor/docker/impl.go +++ b/agent/internal/monitor/docker/impl.go @@ -36,7 +36,23 @@ func (self *DockerMonitor) CheckServices(ctx context.Context) ([]models.Service, return lo.Map(ctrs.Items, func(item container.Summary, _ int) models.Service { return models.Service{ Name: lo.If(len(item.Names) > 0, item.Names[0]).Else(item.ID), - Status: string(item.State), // TODO: map to standartized states enum + Status: mapContainerState(string(item.State)), } }), nil } + +// mapContainerState maps Docker container states to unified ServiceStatus. +func mapContainerState(state string) models.ServiceStatus { + switch state { + case "running": + return models.StatusRunning + case "exited", "dead": + return models.StatusStopped + case "paused": + return models.StatusDegraded + case "restarting", "created", "removing": + return models.StatusPending + default: + return models.StatusUnknown + } +} diff --git a/agent/internal/monitor/kubes/impl.go b/agent/internal/monitor/kubes/impl.go index 4539737..fc0a029 100644 --- a/agent/internal/monitor/kubes/impl.go +++ b/agent/internal/monitor/kubes/impl.go @@ -44,7 +44,23 @@ func (self *KubesMonitor) CheckServices(ctx context.Context) ([]models.Service, return lo.Map(pods.Items, func(item corev1.Pod, _ int) models.Service { return models.Service{ Name: item.Name, - Status: string(item.Status.Phase), // TODO: map to standartized states enum + Status: mapPodPhase(item.Status.Phase), } }), nil } + +// mapPodPhase maps K8s pod phases to unified ServiceStatus. +func mapPodPhase(phase corev1.PodPhase) models.ServiceStatus { + switch phase { + case corev1.PodRunning: + return models.StatusRunning + case corev1.PodSucceeded: + return models.StatusStopped + case corev1.PodFailed: + return models.StatusStopped + case corev1.PodPending: + return models.StatusPending + default: + return models.StatusUnknown + } +}