Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah anda masih menulis fungsi pemantauan sistem Go anda sendiri?

Adakah anda masih menulis fungsi pemantauan sistem Go anda sendiri?

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-24 15:03:36628semak imbas
Jika anda mempunyai keperluan pembangunan Go: dapatkan penggunaan cakera keras hos, CPU, memori, proses, dll., apakah yang akan anda lakukan? Idea yang lebih mudah ialah menggunakan os/exec untuk melaksanakan arahan tertentu seperti ps, cd, dan atas, dan kemudian menganalisis hasil pelaksanaannya. Sudah tentu, berdasarkan idea Linux bahawa semuanya adalah fail, pendekatan yang lebih langsung ialah membaca kandungan fail berkaitan, seperti fail dalam direktori /proc.

Kaedah di atas boleh memenuhi keperluan, tetapi kami tidak perlu mencipta semula roda kerana sudah ada perpustakaan pihak ketiga yang cukup lengkap yang melaksanakan keperluan koleksi ini untuk kami, ia adalah gopsutil.

gopsutil Pengenalan

psutil (proses dan utiliti sistem,) ialah perpustakaan merentas platform yang digunakan untuk mendapatkan proses dan penggunaan sistem (CPU, memori, cakera, rangkaian, penderia) dalam Python, dan gopsutil adalah Pergi versi bahasa.

gopsutil melindungi kita daripada perbezaan dalam pelbagai sistem dan mempunyai mudah alih yang baik.

Senarai yang disokong

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

    Senarai Sokongan B
  • SD
  • hos di Linux RISC-V

Selain itu, projek ini memindahkan struktur C ke struktur Go Tiada kod cgo dalam pelaksanaannya, yang lebih kondusif untuk kompilasi silang.

Menggunakan

gopsutil pada masa ini mempunyai versi v3 dan v2, dan tiada jaminan keserasian ke belakang, jadi terdapat dua cara untuk menggunakannya

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

Contohnya, jika kita ingin melihat maklumat penggunaan sistem , ia boleh diperolehi dengan cara berikut

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)
}

Hasilnya ialah

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}

Satu perkara yang lebih mesra tentang pakej gopsutil ialah kebanyakan fungsi koleksi mengembalikan objek struktur, dan semuanya melaksanakan fmt Antara muka .Stringer, jadi apabila mencetak Ia akan dikeluarkan dalam format json.

Sebagai contoh, dalam contoh di atas, mem.VirtualMemory mengembalikan struktur VirtualMemoryStat, yang memanggil fungsi json.Marshal() dalam kaedah String().

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 dibahagikan kepada sub-pakej yang berbeza melalui unit koleksi yang berbeza Dengan memperkenalkan sub-pakej yang berbeza semasa penggunaan, kaedah yang berkaitan boleh dipanggil.

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"
)

Sebagai contoh, jika kita ingin mendapatkan maklumat hos, kita perlu memperkenalkan github.com/shirou/gopsutil/v3/host sub-package

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 处理了跨平台兼容性问题,对外接口基本保持一致,使用起来比较友好。

Atas ialah kandungan terperinci Adakah anda masih menulis fungsi pemantauan sistem Go anda sendiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam