Pulse/pkg/agents/kubernetes/report.go
2025-12-12 21:31:11 +00:00

98 lines
4.4 KiB
Go

package kubernetes
import "time"
// Report represents a single heartbeat from the Kubernetes agent to Pulse.
// It is designed to be useful without requiring Metrics Server (metrics.k8s.io).
type Report struct {
Agent AgentInfo `json:"agent"`
Cluster ClusterInfo `json:"cluster"`
Nodes []Node `json:"nodes,omitempty"`
Pods []Pod `json:"pods,omitempty"`
Deployments []Deployment `json:"deployments,omitempty"`
Timestamp time.Time `json:"timestamp"`
}
// AgentInfo describes the reporting agent instance.
type AgentInfo struct {
ID string `json:"id"`
Version string `json:"version"`
Type string `json:"type,omitempty"` // "unified" when running as part of pulse-agent
IntervalSeconds int `json:"intervalSeconds"`
}
// ClusterInfo identifies the Kubernetes cluster and provides basic metadata.
type ClusterInfo struct {
ID string `json:"id"` // Stable cluster identifier (agent-generated)
Name string `json:"name,omitempty"` // Optional human-friendly name
Server string `json:"server,omitempty"` // API server URL
Context string `json:"context,omitempty"` // Kubeconfig context name if applicable
Version string `json:"version,omitempty"` // Kubernetes version string
Provider string `json:"provider,omitempty"` // Optional: gke, eks, aks, etc (best-effort)
Namespace string `json:"namespace,omitempty"` // Optional agent namespace when running in-cluster
}
// Node represents a Kubernetes node at report time.
type Node struct {
UID string `json:"uid"`
Name string `json:"name"`
Ready bool `json:"ready"`
Unschedulable bool `json:"unschedulable,omitempty"`
KubeletVersion string `json:"kubeletVersion,omitempty"`
ContainerRuntimeVersion string `json:"containerRuntimeVersion,omitempty"`
OSImage string `json:"osImage,omitempty"`
KernelVersion string `json:"kernelVersion,omitempty"`
Architecture string `json:"architecture,omitempty"`
Capacity NodeResources `json:"capacity,omitempty"`
Allocatable NodeResources `json:"allocatable,omitempty"`
Roles []string `json:"roles,omitempty"`
}
type NodeResources struct {
CPUCores int64 `json:"cpuCores,omitempty"`
MemoryBytes int64 `json:"memoryBytes,omitempty"`
Pods int64 `json:"pods,omitempty"`
}
// Pod represents a Kubernetes pod at report time.
type Pod struct {
UID string `json:"uid"`
Name string `json:"name"`
Namespace string `json:"namespace"`
NodeName string `json:"nodeName,omitempty"`
Phase string `json:"phase,omitempty"` // Pending, Running, Succeeded, Failed, Unknown
Reason string `json:"reason,omitempty"` // Best-effort
Message string `json:"message,omitempty"`
QoSClass string `json:"qosClass,omitempty"`
CreatedAt time.Time `json:"createdAt,omitempty"`
StartTime *time.Time `json:"startTime,omitempty"`
Restarts int `json:"restarts,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
OwnerKind string `json:"ownerKind,omitempty"`
OwnerName string `json:"ownerName,omitempty"`
Containers []PodContainer `json:"containers,omitempty"`
}
type PodContainer struct {
Name string `json:"name"`
Image string `json:"image,omitempty"`
Ready bool `json:"ready"`
RestartCount int32 `json:"restartCount,omitempty"`
State string `json:"state,omitempty"` // waiting, running, terminated
Reason string `json:"reason,omitempty"` // waiting/terminated reason
Message string `json:"message,omitempty"`
}
// Deployment represents a Kubernetes deployment at report time.
type Deployment struct {
UID string `json:"uid"`
Name string `json:"name"`
Namespace string `json:"namespace"`
DesiredReplicas int32 `json:"desiredReplicas,omitempty"`
UpdatedReplicas int32 `json:"updatedReplicas,omitempty"`
ReadyReplicas int32 `json:"readyReplicas,omitempty"`
AvailableReplicas int32 `json:"availableReplicas,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
}