实现Linux服务器负载监控并通过POST接口查询
实现Linux服务器负载监控并通过POST接口查询的Go语言解决方案,
结合系统信息采集与HTTP服务封装:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os/exec"
"runtime"
"strings"
)
type ServerLoad struct {
CPUUsage string `json:"cpu_usage"`
MemoryUsage string `json:"memory_usage"`
DiskUsage string `json:"disk_usage"`
Uptime string `json:"uptime"`
LoadAvg string `json:"load_avg"`
}
func getServerLoadAvg() string {
data, err := ioutil.ReadFile("/proc/loadavg")
if err != nil {
return fmt.Sprintf("Error: %v", err)
}
return strings.Split(string(data), " ")[0]
}
func getServerCPUUsage() string {
cmd := exec.Command("top", "-bn1")
output, err := cmd.Output()
if err != nil {
return fmt.Sprintf("Error: %v", err)
}
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, "%Cpu(s):") {
fields := strings.Fields(line)
return fields[1] + "% user, " + fields[3] + "% system"
}
}
return "N/A"
}
func getServerMemoryUsage() string {
cmd := exec.Command("free", "-m")
output, err := cmd.Output()
if err != nil {
return fmt.Sprintf("Error: %v", err)
}
lines := strings.Split(string(output), "\n")
if len(lines) > 1 {
fields := strings.Fields(lines[1])
if len(fields) >= 6 {
return fmt.Sprintf("%s/%s MB (%.1f%%)", fields[2], fields[1],
100*float64(parseInt(fields[2]))/float64(parseInt(fields[1])))
}
}
return "N/A"
}
func getServerDiskUsage() string {
cmd := exec.Command("df", "-h")
output, err := cmd.Output()
if err != nil {
return fmt.Sprintf("Error: %v", err)
}
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "/dev/") {
fields := strings.Fields(line)
if len(fields) >= 5 {
return fmt.Sprintf("%s used of %s (%s)", fields[2], fields[1], fields[4])
}
}
}
return "N/A"
}
func getServerUptime() string {
data, err := ioutil.ReadFile("/proc/uptime")
if err != nil {
return fmt.Sprintf("Error: %v", err)
}
fields := strings.Fields(string(data))
if len(fields) > 0 {
seconds := parseInt(fields[0])
days := seconds / 86400
hours := (seconds % 86400) / 3600
minutes := (seconds % 3600) / 60
return fmt.Sprintf("%d days, %d hours, %d minutes", days, hours, minutes)
}
return "N/A"
}
func parseInt(s string) int64 {
var val int64
fmt.Sscanf(s, "%d", &val)
return val
}
func loadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
load := ServerLoad{
CPUUsage: getServerCPUUsage(),
MemoryUsage: getServerMemoryUsage(),
DiskUsage: getServerDiskUsage(),
Uptime: getServerUptime(),
LoadAvg: getServerLoadAvg(),
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(load)
}
func main() {
if runtime.GOOS != "linux" {
fmt.Println("This program only runs on Linux systems")
return
}
http.HandleFunc("/api/load", loadHandler)
fmt.Println("Server started at :8080")
http.ListenAndServe(":8080", nil)
}
功能说明
系统负载采集:通过Linux系统文件(/proc/loadavg等)和命令(top/free/df)获取CPU、内存、磁盘等实时数据
POST接口设计:严格限制/api/load端点仅接受POST方法请求,符合RESTful规范
JSON数据格式:返回结构化的JSON响应包含五类关键指标,便于客户端解析
跨平台检测:运行时自动检查操作系统类型,确保只在Linux环境运行
使用方式
部署后通过POST请求访问 http://服务器IP:8080/api/load
示例响应:
json
{
"cpu_usage": "15.3% user, 2.1% system",
"memory_usage": "3245/7982 MB (40.6%)",
"disk_usage": "45G used of 120G (38%)",
"uptime": "3 days, 5 hours, 12 minutes",
"load_avg": "0.78"
}
扩展建议
1、可添加JWT或其他认证增强安全性
2、支持历史数据存储时可集成Prometheus客户端库
3、负载阈值告警功能可通过channel实现异步通知机制

615

被折叠的 条评论
为什么被折叠?



