Files
vdi-monitor/backend/main.go
T
2026-09-13 19:19:37 +09:00

73 lines
2.1 KiB
Go

package main
import (
"database/sql"
"encoding/json"
"log"
"net/http"
"os"
_ "github.com/lib/pq"
)
type MetricPayload struct {
Hostname string `json:"hostname"`
TotalCpuPercent float64 `json:"total_cpu_percent"`
TotalMemPercent float64 `json:"total_mem_percent"`
DpcInterruptPercent float64 `json:"dpc_interrupt_percent"`
TopCpuProcesses json.RawMessage `json:"top_cpu_processes"`
TopMemProcesses json.RawMessage `json:"top_mem_processes"`
TopIoProcesses json.RawMessage `json:"top_io_processes"`
NetworkConnections json.RawMessage `json:"network_connections"`
HungProcesses json.RawMessage `json:"hung_processes"`
}
var db *sql.DB
func main() {
dbUrl := os.Getenv("DB_URL")
if dbUrl == "" {
dbUrl = "postgres://monitor:monitorpassword@localhost:5432/vdimonitor?sslmode=disable"
}
var err error
db, err = sql.Open("postgres", dbUrl)
if err != nil {
log.Fatalf("Failed to connect to db: %v", err)
}
defer db.Close()
http.HandleFunc("/api/metrics", handleMetrics)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleMetrics(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var payload MetricPayload
if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
http.Error(w, "Bad request", http.StatusBadRequest)
return
}
_, err := db.Exec(
`INSERT INTO client_metrics
(hostname, total_cpu_percent, total_mem_percent, dpc_interrupt_percent, top_cpu_processes, top_mem_processes, top_io_processes, network_connections, hung_processes)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
payload.Hostname, payload.TotalCpuPercent, payload.TotalMemPercent, payload.DpcInterruptPercent,
payload.TopCpuProcesses, payload.TopMemProcesses, payload.TopIoProcesses, payload.NetworkConnections, payload.HungProcesses,
)
if err != nil {
log.Printf("DB insert error: %v", err)
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
}