还在自己动手编写那些繁琐的Go语言系统监控函数吗?

2026-04-01 22:061阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1865个文字,预计阅读时间需要8分钟。

还在自己动手编写那些繁琐的Go语言系统监控函数吗?

如果有一个Go开发需求,需要获取主机的硬盘、CPU、内存、进程等使用情况,我会通过以下步骤进行:

1. 使用`os/exec`包执行系统命令,如`ps`、`cd`、`top`等,来获取相关信息。

2.解析命令的执行结果,提取所需数据。

例如,要获取CPU使用情况,可以执行`top`命令,然后解析输出结果。具体步骤如下:

1. 导入必要的包:

goimport ( os/exec strings)

2. 执行`top`命令:gocmd :=exec.Command(top, -b, -n, 1)out, err :=cmd.CombinedOutput()if err !=nil { panic(err)}

3. 解析输出结果,提取CPU使用率:gooutput :=string(out)cpuUsage :=strings.Fields(output)[7] // 假设CPU使用率在第8个位置

这样,就可以获取到CPU的使用情况,类似地,可以获取硬盘、内存、进程等信息。这种方法简单直接,但可能需要根据不同的系统和命令输出格式进行适当的调整。

还在自己动手编写那些繁琐的Go语言系统监控函数吗?

如果有个 Go 开发需求:获取主机的硬盘、CPU、内存、进程等使用情况,你会怎么做?比较朴素的想法是通过 os/exec 去执行某些例如 ps、cd、top 命令,之后解析它们的执行结果。当然,基于 Linux 的一切皆文件思想,更直接地做法是去读取相关文件内容,例如 /proc 目录下的文件。

上面的方式能够完成需求,但是我们大不必重复造轮子,因为已经有相当完善的三方库为我们实现了这些采集需求,它就是 gopsutil。

gopsutil 简介

psutil (process and system utilities,)是一个跨平台库,用于在 Python 中获取进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息,而 gopsutil 是它的 Go 语言版本。

gopsutil 为我们屏蔽了各系统差异,具有很好的移植性。

已支持列表

  • FreeBSD i386/amd64/arm
  • Linux i386/amd64/arm(raspberry pi)
  • Windows i386/amd64/arm/arm64
  • Darwin i386/amd64
  • OpenBSD amd64
  • Solaris amd64

部分支持列表

  • CPU on DragonFly BSD
  • host on Linux RISC-V

另外,该项目通过将 C 结构移植到 Go 结构,它的实现中没有 cgo 的代码,这样就更有利于交叉编译了。

使用

gopsutil 现有 v3 和 v2 版本,且没有向后兼容性保证,因此有两种使用方式

import ( // "github.com/shirou/gopsutil/v3/mem" // to use v3 "github.com/shirou/gopsutil/mem" )

例如我们想查看系统内存使用信息,可以通过以下方式获取

package main import ( "fmt" "github.com/shirou/gopsutil/v3/mem" // "github.com/shirou/gopsutil/mem" // to use v2 ) func main() { v, _ := mem.VirtualMemory() // almost every return value is a struct fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent) // convert to JSON. String() is also implemented fmt.Println(v) }

其结果为

Total: 8589934592, Free:138248192, UsedPercent:76.416254% {"total":8589934592,"available":2025828352,"used":6564106240,"usedPercent":76.4162540435791,"free":138248192,"active":1949327360,"inactive":1887580160,"wired":2214510592,"laundry":0,"buffers":0,"cached":0,"writeBack":0,"dirty":0,"writeBackTmp":0,"shared":0,"slab":0,"sreclaimable":0,"sunreclaim":0,"pageTables":0,"swapCached":0,"commitLimit":0,"committedAS":0,"highTotal":0,"highFree":0,"lowTotal":0,"lowFree":0,"swapTotal":0,"swapFree":0,"mapped":0,"vmallocTotal":0,"vmallocUsed":0,"vmallocChunk":0,"hugePagesTotal":0,"hugePagesFree":0,"hugePageSize":0}

gopsutil 包有一点比较友好的是,绝大多数的采集函数返回的都是一个结构体对象,它们都实现了 fmt.Stringer 接口,因此在打印时它们将会以 json 格式进行输出。

例如,上例中 mem.VirtualMemory 返回的是 VirtualMemoryStat 结构体,它在 String() 方法中调用了 json.Marshal() 函数。

type VirtualMemoryStat struct { Total uint64 `json:"total"` Available uint64 `json:"available"` Used uint64 `json:"used"` UsedPercent float64 `json:"usedPercent"` Free uint64 `json:"free"` Active uint64 `json:"active"` Inactive uint64 `json:"inactive"` Wired uint64 `json:"wired"` func (m VirtualMemoryStat) String() string { s, _ := json.Marshal(m) return string(s) }

gopsutil 通过不同采集单元划分为不同的子包,在使用中通过引入不同的子包,即可调用相关的方法。

import ( "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/docker" "github.com/shirou/gopsutil/v3/host" "github.com/shirou/gopsutil/v3/internal" "github.com/shirou/gopsutil/v3/load" "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/net" "github.com/shirou/gopsutil/v3/process" "github.com/shirou/gopsutil/v3/winservices" )

例如我们想要获取主机信息,就需要引入 github.com/shirou/gopsutil/v3/host 子包

import ( "fmt" "github.com/shirou/gopsutil/v3/host" ) func main() { hostInfo, _ := host.Info() fmt.Println(hostInfo) }

输出

{"hostname":"MacBook-Pro.local","uptime":1619284,"bootTime":1644332729,"procs":301,"os":"darwin","platform":"darwin","platformFamily":"Standalone Workstation","platformVersion":"10.15.5","kernelVersion":"19.5.0","kernelArch":"x86_64","virtualizationSystem":"","virtualizationRole":"","hostId":"7a1a74f2-30fc-4cc1-b439-6b7aef22e45d"}总结

gopsutil 库有非常全面的覆盖单元,包括主机、磁盘、内存、CPU、网络、进程、docker等模块,它能很好地帮助我们获取系统信息。并且 gopsutil 处理了跨平台兼容性问题,对外接口基本保持一致,使用起来比较友好。

本文共计1865个文字,预计阅读时间需要8分钟。

还在自己动手编写那些繁琐的Go语言系统监控函数吗?

如果有一个Go开发需求,需要获取主机的硬盘、CPU、内存、进程等使用情况,我会通过以下步骤进行:

1. 使用`os/exec`包执行系统命令,如`ps`、`cd`、`top`等,来获取相关信息。

2.解析命令的执行结果,提取所需数据。

例如,要获取CPU使用情况,可以执行`top`命令,然后解析输出结果。具体步骤如下:

1. 导入必要的包:

goimport ( os/exec strings)

2. 执行`top`命令:gocmd :=exec.Command(top, -b, -n, 1)out, err :=cmd.CombinedOutput()if err !=nil { panic(err)}

3. 解析输出结果,提取CPU使用率:gooutput :=string(out)cpuUsage :=strings.Fields(output)[7] // 假设CPU使用率在第8个位置

这样,就可以获取到CPU的使用情况,类似地,可以获取硬盘、内存、进程等信息。这种方法简单直接,但可能需要根据不同的系统和命令输出格式进行适当的调整。

还在自己动手编写那些繁琐的Go语言系统监控函数吗?

如果有个 Go 开发需求:获取主机的硬盘、CPU、内存、进程等使用情况,你会怎么做?比较朴素的想法是通过 os/exec 去执行某些例如 ps、cd、top 命令,之后解析它们的执行结果。当然,基于 Linux 的一切皆文件思想,更直接地做法是去读取相关文件内容,例如 /proc 目录下的文件。

上面的方式能够完成需求,但是我们大不必重复造轮子,因为已经有相当完善的三方库为我们实现了这些采集需求,它就是 gopsutil。

gopsutil 简介

psutil (process and system utilities,)是一个跨平台库,用于在 Python 中获取进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息,而 gopsutil 是它的 Go 语言版本。

gopsutil 为我们屏蔽了各系统差异,具有很好的移植性。

已支持列表

  • FreeBSD i386/amd64/arm
  • Linux i386/amd64/arm(raspberry pi)
  • Windows i386/amd64/arm/arm64
  • Darwin i386/amd64
  • OpenBSD amd64
  • Solaris amd64

部分支持列表

  • CPU on DragonFly BSD
  • host on Linux RISC-V

另外,该项目通过将 C 结构移植到 Go 结构,它的实现中没有 cgo 的代码,这样就更有利于交叉编译了。

使用

gopsutil 现有 v3 和 v2 版本,且没有向后兼容性保证,因此有两种使用方式

import ( // "github.com/shirou/gopsutil/v3/mem" // to use v3 "github.com/shirou/gopsutil/mem" )

例如我们想查看系统内存使用信息,可以通过以下方式获取

package main import ( "fmt" "github.com/shirou/gopsutil/v3/mem" // "github.com/shirou/gopsutil/mem" // to use v2 ) func main() { v, _ := mem.VirtualMemory() // almost every return value is a struct fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent) // convert to JSON. String() is also implemented fmt.Println(v) }

其结果为

Total: 8589934592, Free:138248192, UsedPercent:76.416254% {"total":8589934592,"available":2025828352,"used":6564106240,"usedPercent":76.4162540435791,"free":138248192,"active":1949327360,"inactive":1887580160,"wired":2214510592,"laundry":0,"buffers":0,"cached":0,"writeBack":0,"dirty":0,"writeBackTmp":0,"shared":0,"slab":0,"sreclaimable":0,"sunreclaim":0,"pageTables":0,"swapCached":0,"commitLimit":0,"committedAS":0,"highTotal":0,"highFree":0,"lowTotal":0,"lowFree":0,"swapTotal":0,"swapFree":0,"mapped":0,"vmallocTotal":0,"vmallocUsed":0,"vmallocChunk":0,"hugePagesTotal":0,"hugePagesFree":0,"hugePageSize":0}

gopsutil 包有一点比较友好的是,绝大多数的采集函数返回的都是一个结构体对象,它们都实现了 fmt.Stringer 接口,因此在打印时它们将会以 json 格式进行输出。

例如,上例中 mem.VirtualMemory 返回的是 VirtualMemoryStat 结构体,它在 String() 方法中调用了 json.Marshal() 函数。

type VirtualMemoryStat struct { Total uint64 `json:"total"` Available uint64 `json:"available"` Used uint64 `json:"used"` UsedPercent float64 `json:"usedPercent"` Free uint64 `json:"free"` Active uint64 `json:"active"` Inactive uint64 `json:"inactive"` Wired uint64 `json:"wired"` func (m VirtualMemoryStat) String() string { s, _ := json.Marshal(m) return string(s) }

gopsutil 通过不同采集单元划分为不同的子包,在使用中通过引入不同的子包,即可调用相关的方法。

import ( "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/docker" "github.com/shirou/gopsutil/v3/host" "github.com/shirou/gopsutil/v3/internal" "github.com/shirou/gopsutil/v3/load" "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/net" "github.com/shirou/gopsutil/v3/process" "github.com/shirou/gopsutil/v3/winservices" )

例如我们想要获取主机信息,就需要引入 github.com/shirou/gopsutil/v3/host 子包

import ( "fmt" "github.com/shirou/gopsutil/v3/host" ) func main() { hostInfo, _ := host.Info() fmt.Println(hostInfo) }

输出

{"hostname":"MacBook-Pro.local","uptime":1619284,"bootTime":1644332729,"procs":301,"os":"darwin","platform":"darwin","platformFamily":"Standalone Workstation","platformVersion":"10.15.5","kernelVersion":"19.5.0","kernelArch":"x86_64","virtualizationSystem":"","virtualizationRole":"","hostId":"7a1a74f2-30fc-4cc1-b439-6b7aef22e45d"}总结

gopsutil 库有非常全面的覆盖单元,包括主机、磁盘、内存、CPU、网络、进程、docker等模块,它能很好地帮助我们获取系统信息。并且 gopsutil 处理了跨平台兼容性问题,对外接口基本保持一致,使用起来比较友好。