实现Linux服务器负载监控并通过POST接口查询

实现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实现异步通知机制

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值