Heim >Backend-Entwicklung >Golang >Schreiben Sie immer noch Ihre eigenen Go-Systemüberwachungsfunktionen?

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

Go语言进阶学习
Go语言进阶学习nach vorne
2023-07-24 15:03:36655Durchsuche
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"  
)

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

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}

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

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

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

输出

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Go语言进阶学习. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen