mirror of
https://github.com/DeBrosOfficial/orama.git
synced 2026-03-17 18:36:57 +00:00
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
package report
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// collectDeployments discovers deployed applications by querying the local gateway.
|
|
func collectDeployments() *DeploymentsReport {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
report := &DeploymentsReport{}
|
|
|
|
// Query the local gateway for deployment list
|
|
url := "http://localhost:8080/v1/health"
|
|
body, err := httpGet(ctx, url)
|
|
if err != nil {
|
|
// Gateway not available — fall back to systemd unit discovery
|
|
return collectDeploymentsFromSystemd()
|
|
}
|
|
|
|
// Check if gateway reports deployment counts in health response
|
|
var health map[string]interface{}
|
|
if err := json.Unmarshal(body, &health); err == nil {
|
|
if deps, ok := health["deployments"].(map[string]interface{}); ok {
|
|
if v, ok := deps["total"].(float64); ok {
|
|
report.TotalCount = int(v)
|
|
}
|
|
if v, ok := deps["running"].(float64); ok {
|
|
report.RunningCount = int(v)
|
|
}
|
|
if v, ok := deps["failed"].(float64); ok {
|
|
report.FailedCount = int(v)
|
|
}
|
|
return report
|
|
}
|
|
}
|
|
|
|
// Fallback: count deployment systemd units
|
|
return collectDeploymentsFromSystemd()
|
|
}
|
|
|
|
// collectDeploymentsFromSystemd discovers deployments by listing systemd units.
|
|
func collectDeploymentsFromSystemd() *DeploymentsReport {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
report := &DeploymentsReport{}
|
|
|
|
// List orama-deploy-* units
|
|
out, err := runCmd(ctx, "systemctl", "list-units", "--type=service", "--no-legend", "--no-pager", "orama-deploy-*")
|
|
if err != nil {
|
|
return report
|
|
}
|
|
|
|
for _, line := range strings.Split(out, "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
report.TotalCount++
|
|
fields := strings.Fields(line)
|
|
// systemctl list-units format: UNIT LOAD ACTIVE SUB DESCRIPTION...
|
|
if len(fields) >= 4 {
|
|
switch fields[3] {
|
|
case "running":
|
|
report.RunningCount++
|
|
case "failed", "dead":
|
|
report.FailedCount++
|
|
}
|
|
}
|
|
}
|
|
|
|
return report
|
|
}
|
|
|
|
// collectServerless checks if the serverless engine is available via the gateway health endpoint.
|
|
func collectServerless() *ServerlessReport {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
report := &ServerlessReport{
|
|
EngineStatus: "unknown",
|
|
}
|
|
|
|
// Check gateway health for serverless subsystem
|
|
url := "http://localhost:8080/v1/health"
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
|
|
if err != nil {
|
|
return report
|
|
}
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
report.EngineStatus = "unreachable"
|
|
return report
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode == http.StatusOK {
|
|
report.EngineStatus = "healthy"
|
|
} else {
|
|
report.EngineStatus = fmt.Sprintf("unhealthy (HTTP %d)", resp.StatusCode)
|
|
}
|
|
|
|
return report
|
|
}
|