Schreiben Sie immer noch Ihre eigenen Go-Systemüberwachungsfunktionen?

Freigeben: 2023-07-24 15:03:36
nach vorne
640 Leute haben es durchsucht
Wenn Sie eine Go-Entwicklungsanforderung haben: Ermitteln Sie die Nutzung der Festplatte, der CPU, des Arbeitsspeichers, der Prozesse usw. des Hosts. Was würden Sie tun? Eine einfachere Idee besteht darin, os/exec zu verwenden, um bestimmte Befehle wie ps, cd und top auszuführen und dann deren Ausführungsergebnisse zu analysieren. Basierend auf der Idee von Linux, dass alles eine Datei ist, besteht ein direkterer Ansatz natürlich darin, den Inhalt verwandter Dateien zu lesen, beispielsweise Dateien im Verzeichnis /proc.

Die obige Methode kann die Anforderungen erfüllen, aber wir müssen das Rad nicht neu erfinden, da es bereits eine ziemlich vollständige Bibliothek eines Drittanbieters gibt, die diese Sammlungsanforderungen für uns umsetzt, nämlich gopsutil.

gopsutil-Einführung

psutil (Prozess- und Systemdienstprogramme) ist eine plattformübergreifende Bibliothek, die zum Abrufen von Informationen zur Prozess- und Systemauslastung (CPU, Speicher, Festplatte, Netzwerk, Sensoren) in Python verwendet wird. Gopsutil ist die dazugehörige Go-Sprachversion.

gopsutil schützt uns vor Unterschieden in verschiedenen Systemen und ist gut portierbar.

Unterstützte Liste

  • FreeBSD i386/amd64/arm
  • Linux i386/amd64/arm (Raspberry Pi)
  • Windows i386/amd64/arm/arm64
  • Darwin i386/amd64
  • OpenBSD amd64
  • Solaris amd64

Teilweise unterstützte Liste

  • CPU auf DragonFly SD
  • Host auf Linux RISC-V

Darüber hinaus überträgt dieses Projekt die C-Struktur in die Go-Struktur. In seiner Implementierung gibt es keinen CGO-Code, was der Kreuzkompilierung förderlicher ist.

Mit

gopsutil gibt es derzeit in den Versionen v3 und v2, und es gibt keine Abwärtskompatibilitätsgarantie, daher gibt es zwei Möglichkeiten, es zu verwenden

import (
    // "github.com/shirou/gopsutil/v3/mem" // to use v3
    "github.com/shirou/gopsutil/mem"  
)
Nach dem Login kopieren

Zum Beispiel, wenn wir Informationen zur Systemspeichernutzung anzeigen möchten , es kann auf folgende Weise abgerufen werden

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)
}
Nach dem Login kopieren

Das Ergebnis ist

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}
Nach dem Login kopieren

Eine benutzerfreundlichere Sache am gopsutil-Paket ist, dass die meisten Sammlungsfunktionen ein Strukturobjekt zurückgeben und alle das FMT implementieren .Stringer-Schnittstelle, daher werden sie beim Drucken im JSON-Format ausgegeben.

Im obigen Beispiel gibt mem.VirtualMemory beispielsweise die VirtualMemoryStat-Struktur zurück, die die Funktion json.Marshal() in der Methode String() aufruft.

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)
}
Nach dem Login kopieren

gopsutil ist über verschiedene Sammeleinheiten in verschiedene Unterpakete unterteilt. Durch die Einführung verschiedener Unterpakete während der Verwendung können verwandte Methoden aufgerufen werden.

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"
)
Nach dem Login kopieren

Wenn wir beispielsweise Hostinformationen erhalten möchten, müssen wir das Unterpaket github.com/shirou/gopsutil/v3/host einführen

import (
 "fmt"
 "github.com/shirou/gopsutil/v3/host"
)

func main() {
 hostInfo, _ := host.Info()
 fmt.Println(hostInfo)
}
Nach dem Login kopieren

输出

{"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"}
Nach dem Login kopieren

总结

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

Das obige ist der detaillierte Inhalt vonSchreiben Sie immer noch Ihre eigenen Go-Systemüberwachungsfunktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
go
Quelle:Go语言进阶学习
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage