Go语言系统监控实战:gopsutil库全面解析与应用
文章目录
- Go语言编写简易系统监控信息工具
- 系统性能数据gopsutil库
- gopsutil
- 安装gopsutil库
- 初步使用
- CPU相关信息
- 硬盘与内存相关信息
- 主机相关信息
- 网络信息
- 整合应用:简易监控信息工具
- project/main.go
- project/somedata/cpu.go
- project/somedata/diskram.go
- project/somedata/host.go
- project/somedata/net.go
- 运行测试
Go语言编写简易系统监控信息工具
系统性能数据gopsutil库
gopsutil
psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。
Go语言部署简单、性能好的特点非常适合做一些诸如采集系统信息和监控的服务,本文介绍的gopsutil库是知名Python库:psutil的一个Go语言版本的实现。
gopsutil
是一个用于获取系统和进程信息的Go
语言库。它可以帮助开发者轻松地访问系统级别的资源信息,包括 CPU、内存、磁盘、网络等。这些信息对于监控系统性能、分析应用程序行为以及故障排查非常有用。
主要特点
- 跨平台支持:支持多种操作系统,包括 Windows、Linux 和 macOS。
- 简单易用:提供了简洁的 API,方便快速集成到 Go 应用中。
- 实时监控:可以获取实时的系统资源使用情况,适合做系统监控和性能分析。
常用模块
- CPU:获取 CPU 使用率、核心信息等。
- 内存:获取物理内存和虚拟内存的使用情况。
- 磁盘:获取磁盘使用情况,包括读写速率和使用百分比。
- 网络:获取网络流量信息和网络接口统计。
- 进程:获取系统中运行的进程信息,如 PID、名称、状态等。
应用场景
- 系统监控工具
- 性能分析和调优
- 自动化运维脚本
- 故障排查和诊断工具
安装gopsutil库
go get github.com/shirou/gopsutil
初步使用
CPU相关信息
查看CPU信息:
func CpuData() {
info, _ := cpu.Info() //获取CPU硬件信息
pretty, _ := json.MarshalIndent(info, "", "")
//json.MarshalIndent() 将Go数据结构转换为格式化的JSON字符串
println("Info:", string(pretty)) //输出格式如:Info: [JSON数据]
}
输出示例:
Info: [
{
"cpu": 0,
"vendorId": "AuthenticAMD",
"family": "25",
"model": "97",
"stepping": 2,
"physicalId": "0",
"coreId": "0",
"cores": 1,
"modelName": "AMD Ryzen 7 7745HX with Radeon Graphics",
"mhz": 3593.183,
"cacheSize": 1024,
"flags": []
}
查看CPU负载信息:
func GetCpuload() {
fmt.Printf("CPU负载相关信息:")
info, _ := load.Avg()
fmt.Printf("%v
", info)
}
示例信息输出:
CPU负载相关信息:{"load1":0.29,"load5":0.26,"load15":0.41}
查看CPU核心数量:
func CpuNumber() {
fmt.Println("CPU核心数:")
cpuNumber, _ := cpu.Counts(true)
println("CPU逻辑数量", cpuNumber)
cpuNumber, _ = cpu.Counts(false)
println("CPU物理核心: ", cpuNumber)
}
示例信息输出:
CPU核心数:
CPU逻辑数量 2
CPU物理核心: 2
查看CPU的使用率:
func CpuPercent() {
cpuPercent, _ := cpu.Percent(time.Second, false)
fmt.Printf("CPU使用率:%.1f%%
", cpuPercent[0])
}
示例信息输出:
CPU使用率:18.6%
硬盘与内存相关信息
查看硬盘信息:
package somedata
import (
"fmt"
"github.com/shirou/gopsutil/disk"
)
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 14:45
**/
func DiskData() {
diskPart, _ := disk.Partitions(false)
for _, dp := range diskPart {
diskUsed, _ := disk.Usage(dp.Mountpoint)
fmt.Printf("路径:%s,分区大小:%d,剩余大小:%d,文件系统类型:%s,分区使用率:%.3f%%
",
diskUsed.Path,
diskUsed.Total,
diskUsed.Free,
dp.Fstype,
diskUsed.UsedPercent,
)
}
}
查看输出示例信息:
路径:/,分区大小:53660876800,剩余大小:33052852224,文件系统类型:xfs,分区使用率:38.404%
路径:/boot,分区大小:1063256064,剩余大小:859697152,文件系统类型:xfs,分区使用率:19.145%
路径:/home,分区大小:46274121728,剩余大小:46240337920,文件系统类型:xfs,分区使用率:0.073%
查看内存相关信息:
func RamData() {
memInfo, _ := mem.VirtualMemory()
fmt.Println("内存使用情况:")
fmt.Printf("总内存: %d MB
", memInfo.Total/1024/1024)
fmt.Printf("已使用内存: %d MB
", memInfo.Used/1024/1024)
fmt.Printf("可用内存: %d MB
", memInfo.Available/1024/1024)
fmt.Printf("内存使用率: %.2f%%
", memInfo.UsedPercent)
}
示例输出结果:
内存使用情况:
总内存: 7802 MB
已使用内存: 3876 MB
可用内存: 3597 MB
内存使用率: 49.69%
主机相关信息
查看主机相关信息:
package somedata
import (
"encoding/json"
"github.com/shirou/gopsutil/host"
"time"
)
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 15:02
**/
func HostData() {
hostinfo, _ := host.Info()
pretty, _ := json.MarshalIndent(hostinfo, "", "")
println("Info", string(pretty))
te := time.Unix(int64(hostinfo.BootTime), 0)
println("BootTime", te.Format(time.DateTime))
println("Uptime", hostinfo.Uptime)
}
示例输出信息:
Info {
"hostname": "master",
"uptime": 7620,
"bootTime": 1749358771,
"procs": 178,
"os": "linux",
"platform": "centos",
"platformFamily": "rhel",
"platformVersion": "7.9.2009",
"kernelVersion": "3.10.0-1160.119.1.el7.x86_64",
"kernelArch": "x86_64",
"virtualizationSystem": "",
"virtualizationRole": "",
"hostid": "52404d56-d59f-3642-2545-16e49d986b45"
}
BootTime 2025-06-08 12:59:31
Uptime 7620
网络信息
查看网卡信息:
package somedata
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 14:45
**/
import (
"fmt"
"github.com/shirou/gopsutil/net"
)
func NetInterfaces() {
// 获取所有网络接口信息
interfaces, err := net.Interfaces()
if err != nil {
fmt.Println("获取网卡信息失败:", err)
return
}
fmt.Println("系统网络接口信息:")
for i, iface := range interfaces {
fmt.Printf("
接口 %d:
", i+1)
fmt.Printf(" 名称: %s
", iface.Name)
fmt.Printf(" MAC地址: %s
", iface.HardwareAddr)
// 打印所有IPv4地址
fmt.Println(" IPv4地址:")
for _, addr := range iface.Addrs {
if len(addr.Addr) > 0 && addr.Addr[0] != ':' { // 过滤掉IPv6地址
fmt.Printf(" - %s
", addr.Addr)
}
}
}
}
示例输出结果:
系统网络接口信息:
接口 1:
名称: lo
MAC地址:
IPv4地址:
- 127.0.0.1/8
接口 2:
名称: ens33
MAC地址: 00:0c:29:98:6b:45
IPv4地址:
- 192.168.100.10/24
- fe80::5165:ab78:3bec:8ce9/64
接口 3:
名称: docker0
MAC地址: 02:42:c4:f4:9c:f4
IPv4地址:
- 172.17.0.1/16
整合应用:简易监控信息工具
当我们将上述的代码进行整合之后就形成了一个简易的监控服务:
project/main.go
package main
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 13:30
**/
import (
"bufio"
"fmt"
"os"
"strings"
)
import (
data "project/somedata"
)
func main() {
// 创建输入扫描器,用于读取标准输入(键盘输入)
scanner := bufio.NewScanner(os.Stdin)
for {
// 打印菜单选项
fmt.Println("
简易系统监控信息工具")
fmt.Println("1. 查看主机信息")
fmt.Println("2. 查看网卡信息")
fmt.Println("3. 查看CPU相关信息")
fmt.Println("4. 查询内存信息")
fmt.Println("5. 查询硬盘信息")
fmt.Println("6. 退出系统")
fmt.Print("请选择操作编号:")
scanner.Scan() // 等待用户输入
input := strings.TrimSpace(scanner.Text()) // 处理输入
switch input {
case "1":
data.HostData()
case "2":
data.NetInterfaces()
case "3":
data.CpuData()
case "4":
data.RamData()
case "5":
data.DiskData()
case "6":
fmt.Println("感谢使用,再见!")
return // 结束程序
default:
fmt.Println("无效的输入,请重新输入")
}
}
}
project/somedata/cpu.go
package somedata
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 13:02
**/
import (
"encoding/json"
"fmt"
"github.com/shirou/gopsutil/cpu"
"time"
)
//func GetCpuload() {
// fmt.Printf("CPU负载相关信息:")
// info, _ := load.Avg()
// fmt.Printf("%v
", info)
//}
func CpuData() {
info, _ := cpu.Info()
pretty, _ := json.MarshalIndent(info, "", "")
println("Info:", string(pretty))
fmt.Println("CPU核心数:")
cpuNumber, _ := cpu.Counts(true)
println("CPU逻辑数量", cpuNumber)
cpuNumber, _ = cpu.Counts(false)
println("CPU物理核心: ", cpuNumber)
cpuPercent, _ := cpu.Percent(time.Second, false)
fmt.Printf("CPU使用率:%.1f%%
", cpuPercent[0])
}
//func CpuNumber() {
// fmt.Println("CPU核心数:")
// cpuNumber, _ := cpu.Counts(true)
// println("CPU逻辑数量", cpuNumber)
// cpuNumber, _ = cpu.Counts(false)
// println("CPU物理核心: ", cpuNumber)
//}
//func CpuPercent() {
// cpuPercent, _ := cpu.Percent(time.Second, false)
// fmt.Printf("CPU使用率:%.1f%%
", cpuPercent[0])
//}
project/somedata/diskram.go
package somedata
import (
"fmt"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"
)
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 14:45
**/
func DiskData() {
diskPart, _ := disk.Partitions(false)
for _, dp := range diskPart {
diskUsed, _ := disk.Usage(dp.Mountpoint)
fmt.Printf("路径:%s,分区大小:%d,剩余大小:%d,文件系统类型:%s,分区使用率:%.3f%%
",
diskUsed.Path,
diskUsed.Total,
diskUsed.Free,
dp.Fstype,
diskUsed.UsedPercent,
)
}
}
func RamData() {
memInfo, _ := mem.VirtualMemory()
fmt.Println("内存使用情况:")
fmt.Printf("总内存: %d MB
", memInfo.Total/1024/1024)
fmt.Printf("已使用内存: %d MB
", memInfo.Used/1024/1024)
fmt.Printf("可用内存: %d MB
", memInfo.Available/1024/1024)
fmt.Printf("内存使用率: %.2f%%
", memInfo.UsedPercent)
}
project/somedata/host.go
package somedata
import (
"encoding/json"
"github.com/shirou/gopsutil/host"
"time"
)
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 15:02
**/
func HostData() {
hostinfo, _ := host.Info()
pretty, _ := json.MarshalIndent(hostinfo, "", "")
println("Info", string(pretty))
te := time.Unix(int64(hostinfo.BootTime), 0)
println("BootTime", te.Format(time.DateTime))
println("Uptime", hostinfo.Uptime)
}
project/somedata/net.go
package somedata
/**
* @Description
* @Author 是垚不是土
* @Date 2025/6/8 14:45
**/
import (
"fmt"
"github.com/shirou/gopsutil/net"
)
func NetInterfaces() {
// 获取所有网络接口信息
interfaces, err := net.Interfaces()
if err != nil {
fmt.Println("获取网卡信息失败:", err)
return
}
fmt.Println("系统网络接口信息:")
for i, iface := range interfaces {
fmt.Printf("
接口 %d:
", i+1)
fmt.Printf(" 名称: %s
", iface.Name)
fmt.Printf(" MAC地址: %s
", iface.HardwareAddr)
// 打印所有IPv4地址
fmt.Println(" IPv4地址:")
for _, addr := range iface.Addrs {
if len(addr.Addr) > 0 && addr.Addr[0] != ':' { // 过滤掉IPv6地址
fmt.Printf(" - %s
", addr.Addr)
}
}
}
}
运行测试
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:1
Info {
"hostname": "master",
"uptime": 10729,
"bootTime": 1749358771,
"procs": 178,
"os": "linux",
"platform": "centos",
"platformFamily": "rhel",
"platformVersion": "7.9.2009",
"kernelVersion": "3.10.0-1160.119.1.el7.x86_64",
"kernelArch": "x86_64",
"virtualizationSystem": "",
"virtualizationRole": "",
"hostid": "52404d56-d59f-3642-2545-16e49d986b45"
}
BootTime 2025-06-08 12:59:31
Uptime 10729
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:2
系统网络接口信息:
接口 1:
名称: lo
MAC地址:
IPv4地址:
- 127.0.0.1/8
接口 2:
名称: ens33
MAC地址: 00:0c:29:98:6b:45
IPv4地址:
- 192.168.100.10/24
- fe80::5165:ab78:3bec:8ce9/64
接口 3:
名称: docker0
MAC地址: 02:42:c4:f4:9c:f4
IPv4地址:
- 172.17.0.1/16
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:3
CPU核心数:
Info: [
{
"cpu": 0,
"vendorId": "AuthenticAMD",
"family": "25",
"model": "97",
"stepping": 2,
"physicalId": "0",
"coreId": "0",
"cores": 1,
"modelName": "AMD Ryzen 7 7745HX with Radeon Graphics",
"mhz": 3593.183,
"cacheSize": 1024,
"flags": [],
"microcode": "0xffffffff"
},
----
----(省略)
CPU逻辑数量 2
CPU物理核心: 2
CPU使用率:4.7%
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:4
内存使用情况:
总内存: 7802 MB
已使用内存: 4013 MB
可用内存: 3452 MB
内存使用率: 51.44%
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:5
路径:/,分区大小:53660876800,剩余大小:33040707584,文件系统类型:xfs,分区使用率:38.427%
路径:/boot,分区大小:1063256064,剩余大小:859697152,文件系统类型:xfs,分区使用率:19.145%
路径:/home,分区大小:46274121728,剩余大小:46240337920,文件系统类型:xfs,分区使用率:0.073%
简易系统监控信息工具
1. 查看主机信息
2. 查看网卡信息
3. 查看CPU相关信息
4. 查询内存信息
5. 查询硬盘信息
6. 退出系统
请选择操作编号:6
感谢使用,再见!
进程 已完成,退出代码为 0
至此,基础的库应用已经完成。
在后续,作者会进行尝试使用该标准库结合Gin框架,完成这些信息的前端展示,并且会进一步的丰富这些采集信息,在前端网站上有一个更好的展示。
学习Go的道路上注定艰难,一个运维工程师向Go语言开发的转变注定不会一帆风顺,在未来会进一步的学习,永无止境的探索下去。