mirror of
https://github.com/DeBrosOfficial/network.git
synced 2026-01-30 14:33:03 +00:00
92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package deployments
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/DeBrosOfficial/network/pkg/deployments"
|
|
"github.com/DeBrosOfficial/network/pkg/deployments/process"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// StatsHandler handles on-demand deployment resource stats
|
|
type StatsHandler struct {
|
|
service *DeploymentService
|
|
processManager *process.Manager
|
|
logger *zap.Logger
|
|
baseDeployPath string
|
|
}
|
|
|
|
// NewStatsHandler creates a new stats handler
|
|
func NewStatsHandler(service *DeploymentService, processManager *process.Manager, logger *zap.Logger, baseDeployPath string) *StatsHandler {
|
|
if baseDeployPath == "" {
|
|
baseDeployPath = filepath.Join(os.Getenv("HOME"), ".orama", "deployments")
|
|
}
|
|
return &StatsHandler{
|
|
service: service,
|
|
processManager: processManager,
|
|
logger: logger,
|
|
baseDeployPath: baseDeployPath,
|
|
}
|
|
}
|
|
|
|
// HandleStats returns on-demand resource usage for a deployment
|
|
func (h *StatsHandler) HandleStats(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
namespace := getNamespaceFromContext(ctx)
|
|
if namespace == "" {
|
|
http.Error(w, "Namespace not found in context", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
name := r.URL.Query().Get("name")
|
|
if name == "" {
|
|
http.Error(w, "name query parameter is required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
deployment, err := h.service.GetDeployment(ctx, namespace, name)
|
|
if err != nil {
|
|
if err == deployments.ErrDeploymentNotFound {
|
|
http.Error(w, "Deployment not found", http.StatusNotFound)
|
|
} else {
|
|
http.Error(w, "Failed to get deployment", http.StatusInternalServerError)
|
|
}
|
|
return
|
|
}
|
|
|
|
deployPath := filepath.Join(h.baseDeployPath, deployment.Namespace, deployment.Name)
|
|
|
|
resp := map[string]interface{}{
|
|
"name": deployment.Name,
|
|
"type": string(deployment.Type),
|
|
"status": string(deployment.Status),
|
|
}
|
|
|
|
if deployment.Port == 0 {
|
|
// Static deployment — only disk
|
|
stats, _ := h.processManager.GetStats(ctx, deployment, deployPath)
|
|
if stats != nil {
|
|
resp["disk_mb"] = float64(stats.DiskBytes) / (1024 * 1024)
|
|
}
|
|
} else {
|
|
// Dynamic deployment — full stats
|
|
stats, err := h.processManager.GetStats(ctx, deployment, deployPath)
|
|
if err != nil {
|
|
h.logger.Warn("Failed to get stats", zap.Error(err))
|
|
}
|
|
if stats != nil {
|
|
resp["pid"] = stats.PID
|
|
resp["uptime_seconds"] = stats.UptimeSecs
|
|
resp["cpu_percent"] = stats.CPUPercent
|
|
resp["memory_rss_mb"] = float64(stats.MemoryRSS) / (1024 * 1024)
|
|
resp["disk_mb"] = float64(stats.DiskBytes) / (1024 * 1024)
|
|
}
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(resp)
|
|
}
|