Maison  >  Article  >  développement back-end  >  Êtes-vous toujours en train d’écrire vos propres fonctions de surveillance du système Go ?

Êtes-vous toujours en train d’écrire vos propres fonctions de surveillance du système Go ?

Go语言进阶学习
Go语言进阶学习avant
2023-07-24 15:03:36629parcourir
Si vous avez une exigence de développement Go : obtenir l'utilisation du disque dur, du processeur, de la mémoire, des processus, etc. de l'hôte, que feriez-vous ? Une idée plus simple consiste à utiliser os/exec pour exécuter certaines commandes telles que ps, cd et top, puis à analyser les résultats de leur exécution. Bien sûr, basé sur l'idée de Linux selon laquelle tout est un fichier, une approche plus directe consiste à lire le contenu des fichiers associés, tels que les fichiers du répertoire /proc.

La méthode ci-dessus peut répondre aux exigences, mais nous n'avons pas besoin de réinventer la roue car il existe déjà une bibliothèque tierce assez complète qui réalise ces exigences de collection pour nous, c'est gopsutil.

gopsutil Introduction

psutil (utilitaires de processus et système) est une bibliothèque multiplateforme utilisée pour obtenir des informations sur l'utilisation des processus et du système (CPU, mémoire, disque, réseau, capteurs) en Python, et gopsutil est son Allez en version linguistique.

gopsutil nous protège des différences entre les différents systèmes et a une bonne portabilité.

Liste prise en charge

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

Liste de support partiel

  • CPU sur DragonFly BSD
  • hébergeur sur Linux RISC-V

De plus, ce projet transplante la structure C vers la structure Go. Il n'y a pas de code cgo dans son implémentation, ce qui est plus propice à la compilation croisée.

Utiliser

gopsutil a actuellement des versions v3 et v2, et il n'y a aucune garantie de compatibilité ascendante, il y a donc deux façons de l'utiliser

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

Par exemple, si nous voulons afficher les informations sur l'utilisation de la mémoire système , il peut être obtenu des manières suivantes

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

Le résultat est

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}

Une chose qui est plus conviviale à propos du package gopsutil est que la plupart des fonctions de collection renvoient un objet de structure, et elles implémentent toutes le fmt Interface .Stringer, donc lors de l'impression, ils seront sortis au format json.

Par exemple, dans l'exemple ci-dessus, mem.VirtualMemory renvoie la structure VirtualMemoryStat, qui appelle la fonction json.Marshal() dans la méthode 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 est divisé en différents sous-packages via différentes unités de collecte. En introduisant différents sous-packages lors de l'utilisation, des méthodes associées peuvent être appelées.

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

Par exemple, si nous voulons obtenir des informations sur l'hôte, nous devons introduire le sous-package 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 处理了跨平台兼容性问题,对外接口基本保持一致,使用起来比较友好。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer