Initial commit
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
FROM golang:1.21-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
# Initialize and download dependencies
|
||||
RUN go mod tidy
|
||||
|
||||
# Build the Go app
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -o backend main.go
|
||||
|
||||
FROM alpine:latest
|
||||
WORKDIR /root/
|
||||
COPY --from=builder /app/backend .
|
||||
EXPOSE 8080
|
||||
CMD ["./backend"]
|
||||
@@ -0,0 +1,5 @@
|
||||
module vdimonitor
|
||||
|
||||
go 1.21
|
||||
|
||||
require github.com/lib/pq v1.10.9
|
||||
@@ -0,0 +1,72 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user