Commit a6a308b3 authored by Your Name's avatar Your Name

add monitor for smi

parent 7449b2dc
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/disk"
// "github.com/shirou/gopsutil/mem" // to use v2
)
func DiskSmi() ([]FileSystem, error) {
parts, err := disk.Partitions(true)
if err != nil {
return nil, err
}
res := make([]FileSystem, len(parts))
for _, p := range parts {
usage, err := disk.Usage(p.Mountpoint)
if err != nil {
fmt.Println(" disk.Usage(p.Mountpoint)", p.Mountpoint)
continue
}
fmt.Println(usage)
newres := FileSystem{
Device: p.Device,
MountPoints: []string{p.Mountpoint},
FreeBytes: int64(usage.Free),
SizeBytes: int64(usage.Total),
}
res = append(res, newres)
}
return res, nil
}
package main
import (
"strings"
"time"
"github.com/shirou/gopsutil/v3/cpu"
// "github.com/shirou/gopsutil/mem" // to use v2
)
func CpuSmi() (Cpu, error) {
infos, err := cpu.Info()
if err != nil {
return Cpu{}, err
}
cores := 0
model := ""
for _, info := range infos {
if cores < int(info.Cores) {
cores = int(info.Cores)
}
if len(model) == 0 {
model = info.ModelName
}
}
idx := strings.IndexAny(model, "@")
freq := ""
if idx != -1 && (idx+1) < len(model) {
freq = model[idx+1:]
}
percent, err := cpu.Percent(time.Second, false)
percentAsInt := int64(0)
if len(percent) > 0 {
percentAsInt = int64(percent[0] * 100.0)
}
c, err := cpu.Counts(false)
return Cpu{
Model: model,
Cores: int64(c),
Threads: int64(len(infos)),
Usage: percentAsInt,
Frequency: freq,
}, nil
}
......@@ -36,6 +36,7 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.8 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
......@@ -45,18 +46,23 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_golang v1.19.0 // indirect
github.com/prometheus/client_model v0.6.0 // indirect
github.com/prometheus/common v0.51.1 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/ricochet2200/go-disk-usage/du v0.0.0-20210707232629-ac9918953285 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/shopspring/decimal v1.3.1 // indirect
github.com/shirou/gopsutil/v3 v3.24.4 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/swaggo/files/v2 v2.0.0 // indirect
github.com/swaggo/swag v1.16.3 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.52.0 // indirect
github.com/valyala/tcplisten v1.0.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/oauth2 v0.18.0 // indirect
golang.org/x/sys v0.19.0 // indirect
......
......@@ -54,6 +54,9 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
......@@ -82,6 +85,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
......@@ -108,6 +113,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
......@@ -124,15 +131,32 @@ github.com/ricochet2200/go-disk-usage/du v0.0.0-20210707232629-ac9918953285 h1:d
github.com/ricochet2200/go-disk-usage/du v0.0.0-20210707232629-ac9918953285/go.mod h1:fxIDly1xtudczrZeOOlfaUvd2OPb2qZAPuWdU2BsBTk=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU=
github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw=
github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM=
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
......@@ -141,6 +165,8 @@ github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHY
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
......@@ -156,11 +182,14 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs=
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
......@@ -196,5 +225,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
package main
import (
"bytes"
"encoding/csv"
"fmt"
"os/exec"
"strconv"
)
func GpusSmi() ([]Gpu, error) {
gpusAsStr, err := getGpusWithSmi()
if err != nil {
return nil, err
}
return convertGpuStrToInt(gpusAsStr), nil
}
func convertGpuStrToInt(in []NewGpu) []Gpu {
out := make([]Gpu, 0, len(in))
for _, inGpu := range in {
resGpu := Gpu{}
seq, err := strconv.ParseInt(inGpu.Seq, 10, 64)
if err != nil {
fmt.Printf("inGpu.Seq: %v\n", err)
} else {
resGpu.Seq = int(seq)
}
gpuUtil, err := strconv.ParseInt(inGpu.GpuUtil, 10, 64)
if err != nil {
fmt.Printf("inGpu.GpuUtil: %v\n", err)
} else {
resGpu.GpuUtil = gpuUtil
}
memTotal, err := strconv.ParseInt(inGpu.MemTotal, 10, 64)
if err != nil {
fmt.Printf("inGpu.MemTotal: %v\n", err)
} else {
resGpu.MemTotal = memTotal * 1024 * 1024
}
memFree, err := strconv.ParseInt(inGpu.MemFree, 10, 64)
if err != nil {
fmt.Printf("inGpu.memFree: %v\n", err)
} else {
resGpu.MemFree = memFree * 1024 * 1024
}
gpuTemp, err := strconv.ParseInt(inGpu.GpuTemp, 10, 64)
if err != nil {
fmt.Printf("inGpu.GpuTemp: %v\n", err)
} else {
resGpu.GpuTemp = gpuTemp
}
// power, err := strconv.ParseInt(inGpu.Power, 10, 64)
// if err != nil {
// fmt.Printf("inGpu.Power: %v\n", err)
// } else {
// resGpu.Power = power
// }
floatValue, err := strconv.ParseFloat(inGpu.Power, 64)
if err != nil {
fmt.Printf("inGpu.Power: %v\n", err)
} else {
resGpu.Power = int64(floatValue)
}
resGpu.Model = inGpu.Model
resGpu.UUIDStr = inGpu.UUIDStr
resGpu.Performance = int64(comput[resGpu.Model])
out = append(out, resGpu)
}
return out
}
func getGpusWithSmi() ([]NewGpu, error) {
out, err := exec.Command(
"nvidia-smi",
"--query-gpu=index,uuid,name,memory.total,memory.free,utilization.gpu,temperature.gpu,power.draw",
"--format=csv,noheader,nounits").Output()
if err != nil {
return nil, err
}
csvReader := csv.NewReader(bytes.NewReader(out))
csvReader.TrimLeadingSpace = true
records, err := csvReader.ReadAll()
if err != nil {
return nil, err
}
for _, row := range records {
fmt.Println("row", row)
}
// row [0 GPU-1d4c2b90-feb1-c575-ba0b-6abb19c44283 NVIDIA GeForce RTX 3090 24576 23720 1 38 23.04]
// 0 0
// 1 GPU-1d4c2b90-feb1-c575-ba0b-6abb19c44283
// 2 NVIDIA GeForce RTX 3090
// 3 24576
// 4 23720
// 5 1
// 6 38
// 7 23.04
res := make([]NewGpu, 0, len(records))
for _, row := range records {
oneGpu := NewGpu{}
for idx, value := range row {
fmt.Println(idx, value)
switch idx {
case 0:
oneGpu.Seq = value
case 1:
oneGpu.UUIDStr = value
case 2:
oneGpu.Model = value
case 3:
oneGpu.MemTotal = value
case 4:
oneGpu.MemFree = value
case 5:
oneGpu.GpuUtil = value
case 6:
oneGpu.GpuTemp = value
case 7:
oneGpu.Power = value
}
}
res = append(res, oneGpu)
}
// resAsJson, err := json.Marshal(res)
// if err != nil {
// fmt.Printf("%s\n", err)
// return
// }
// fmt.Println("result", string(resAsJson))
return res, nil
}
type NewGpu struct {
Seq string
UUIDStr string
Model string
Performance string //无
PowerRating string //无
MemTotal string
MemFree string
GpuUtil string
GpuTemp string
Power string
}
// type GpuOld struct {
// Seq int `json:"seq"`
// UUIDStr string `json:"uuid"`
// Model string `json:"model"`
// Performance int64 `json:"performance"`
// PowerRating int64 `json:"power_rating"`
// MemTotal int64 `json:"mem_total"`
// MemFree int64 `json:"mem_free"`
// //performance
// GpuUtil int64 `json:"usage"`
// GpuTemp int64 `json:"temp"`
// // MemUtil int64 `json:"mem_util"`
// Power int64 `json:"power_rt"`
// }
......@@ -60,11 +60,11 @@ func (c *ProApi) Gpus() ([]Gpu, error) {
inGpus := make(map[string]Gpu)
gpuUtil, err := c.GpuUtil(inGpus)
// gpuUtil, err := c.GpuUtil(inGpus)
if err != nil {
return nil, err
}
// if err != nil {
// return nil, err
// }
// gpuMemUtil, err := c.GpuMemUtil(gpuUtil)
......@@ -72,7 +72,7 @@ func (c *ProApi) Gpus() ([]Gpu, error) {
// return nil, err
// }
powerUsage, err := c.GpuPowerUsage(gpuUtil)
powerUsage, err := c.GpuPowerUsage(inGpus)
if err != nil {
return nil, err
......@@ -99,6 +99,7 @@ func (c *ProApi) Gpus() ([]Gpu, error) {
for uuidStr, gpu := range gpuMemFree {
gpu.UUIDStr = uuidStr
gpu.Performance = int64(comput[gpu.Model])
gpu.GpuUtil = gpu.MemFree
res = append(res, gpu)
}
......
......@@ -2,11 +2,43 @@ package main
import (
"encoding/json"
"fmt"
"math/big"
"testing"
)
//GpuInfo()
func TestDecimal(t *testing.T) {
// 25392316416 bytes 24216 MB total 24564 smi
// 2738880512 bytes 2612 MB free
// 21604MB usage 推算. 21604 smi
// res := decimal.NewFromInt(2738880512).Mul(decimal.NewFromInt(25392316416))
// //69546520586320084992
// t.Log(res.String())
// package main
// import (
// "fmt"
// "math/big"
// )
// func main() {
// // 初始化两个大数,分别代表总数和部分
total := big.NewInt(25392316416)
part := big.NewInt(2738880512)
// 计算百分比
percentage := new(big.Int).Mul(part, big.NewInt(100))
percentage = percentage.Div(percentage, total)
fmt.Printf("百分比为: %s%% %d\n", percentage, percentage)
}
func TestGpuInfo(t *testing.T) {
cli, err := NewProCli("http://192.168.1.21:9090")
......
package main
import (
"flag"
"fmt"
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/swagger"
)
func mainbak() {
//ExampleAPI_query()
promethAddr := flag.String("promethaddr", "http://127.0.0.1:9090", "a string parameter")
flag.Parse()
//cli, err := NewProCli("http://192.168.1.21:9090")
fmt.Println("connect to prometh addr-----------", *promethAddr)
//cli, err := NewProCli("http://192.168.1.21:9090")
cli, err := NewProCli(*promethAddr)
if err != nil {
fmt.Println(err.Error())
return
}
// Initialize a new Fiber app
app := fiber.New()
app.Use(cors.New())
app.Static("/swagger/docs", "./docs")
app.Get("/swagger/*", swagger.New(swagger.Config{ // custom
URL: "http://124.193.167.71:5000/swagger/docs/swagger.yaml", //http://124.193.167.71:8000/
DeepLinking: false,
// Expand ("list") or Collapse ("none") tag groups by default
DocExpansion: "none",
// Prefill OAuth ClientId on Authorize popup
// OAuth: &swagger.OAuthConfig{
// AppName: "OAuth Provider",
// ClientId: "21bb4edc-05a7-4afc-86f1-2e151e4ba6e2",
// },
// Ability to change OAuth2 redirect uri location
//OAuth2RedirectUrl: "http://localhost:8080/swagger/oauth2-redirect.html",
}))
app.Get("/hw", func(c *fiber.Ctx) error {
res := NewResponse{}
gpus, err := cli.Gpus()
if err != nil {
fmt.Println("gpu error", err.Error())
res.Msg = err.Error()
res.Code = 500
}
res.Data.Gpus = gpus
cpus, err := cli.Cpus()
if err != nil {
fmt.Println("cpu error", err.Error())
res.Msg = err.Error()
res.Code = 500
}
res.Data.Cpus = cpus
networks, err := cli.Networks()
if err != nil {
fmt.Println("network error", err.Error())
res.Msg = err.Error()
res.Code = 500
}
res.Data.Networks = networks
filesystems, err := cli.Disks()
if err != nil {
fmt.Println("disks error", err.Error())
res.Msg = err.Error()
res.Code = 500
}
res.Data.Disk = filesystems
mem, err := cli.Mem()
if err != nil {
fmt.Println("mem error", err.Error())
res.Msg = err.Error()
res.Code = 500
}
res.Data.Mem = mem
res.Code = 200
return c.JSON(&res)
})
// app.Get("/hw/usage", func(c *fiber.Ctx) error {
// res := make([]DeviceInfo, 0, 10)
// // gpuUtils, err := cli.GpuUtil()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuUtils...)
// // gpuMemUtils, err := cli.GpuMemUtil()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuMemUtils...)
// diskUtil, err := cli.DiskUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskUtil...)
// networkSpeed, err := cli.NetworkSpeed()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, networkSpeed...)
// cpuUtils, err := cli.CpuUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, cpuUtils...)
// //MemUtil()
// memUtils, err := cli.MemUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memUtils...)
// netRece, err := cli.NetworkReceive()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, netRece...)
// netSend, err := cli.NetworkTransmit()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, netSend...)
// diskFreeSize, err := cli.DiskFreeSize()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskFreeSize...)
// // power, err := cli.GpuPowerUsage()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, power...)
// memTemp, err := cli.GpuMemTemp()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memTemp...)
// // gpuTemp, err := cli.GpuTemp()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuTemp...)
// return c.JSON(Response{
// Success: true,
// Devices: res,
// })
// })
// app.Get("/hw/info", func(c *fiber.Ctx) error {
// res := make([]DeviceInfo, 0, 10)
// diskTotalSize, err := cli.DiskTotalSize()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskTotalSize...)
// memSize, err := cli.MemInfo()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memSize...)
// gpuInfo, err := cli.GpuInfo()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, gpuInfo...)
// return c.JSON(Response{
// Success: true,
// Devices: res,
// })
// })
// Start the server on port 3000
log.Fatal(app.Listen(":5000"))
}
type Response struct {
Devices []DeviceInfo `json:"devices"`
Success bool `json:"success"`
Error string `json:"error`
}
type NewResponse struct {
Data Data `json:"hardware"`
Code int `json:"code"`
Msg string `json:"msg"`
}
type Data struct {
Cpus Cpu `json:"CPU"`
Gpus []Gpu `json:"GPU"`
Disk []FileSystem `json:"DISK"`
Networks []Network `json:"NET"`
Mem Mem `json:"RAM"`
}
......@@ -23,12 +23,12 @@ func main() {
//cli, err := NewProCli("http://192.168.1.21:9090")
cli, err := NewProCli(*promethAddr)
// cli, err := NewProCli(*promethAddr)
if err != nil {
fmt.Println(err.Error())
return
}
// if err != nil {
// fmt.Println(err.Error())
// return
// }
// Initialize a new Fiber app
app := fiber.New()
......@@ -53,7 +53,7 @@ func main() {
app.Get("/hw", func(c *fiber.Ctx) error {
res := NewResponse{}
gpus, err := cli.Gpus()
gpus, err := GpusSmi()
if err != nil {
fmt.Println("gpu error", err.Error())
......@@ -63,7 +63,7 @@ func main() {
res.Data.Gpus = gpus
cpus, err := cli.Cpus()
cpus, err := CpuSmi()
if err != nil {
fmt.Println("cpu error", err.Error())
......@@ -73,7 +73,7 @@ func main() {
res.Data.Cpus = cpus
networks, err := cli.Networks()
networks, err := NetSmi()
if err != nil {
fmt.Println("network error", err.Error())
......@@ -83,7 +83,7 @@ func main() {
res.Data.Networks = networks
filesystems, err := cli.Disks()
filesystems, err := DiskSmi()
if err != nil {
fmt.Println("disks error", err.Error())
......@@ -93,7 +93,7 @@ func main() {
res.Data.Disk = filesystems
mem, err := cli.Mem()
mem, err := memSmi()
if err != nil {
fmt.Println("mem error", err.Error())
......@@ -108,204 +108,6 @@ func main() {
})
// app.Get("/hw/usage", func(c *fiber.Ctx) error {
// res := make([]DeviceInfo, 0, 10)
// // gpuUtils, err := cli.GpuUtil()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuUtils...)
// // gpuMemUtils, err := cli.GpuMemUtil()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuMemUtils...)
// diskUtil, err := cli.DiskUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskUtil...)
// networkSpeed, err := cli.NetworkSpeed()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, networkSpeed...)
// cpuUtils, err := cli.CpuUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, cpuUtils...)
// //MemUtil()
// memUtils, err := cli.MemUtil()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memUtils...)
// netRece, err := cli.NetworkReceive()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, netRece...)
// netSend, err := cli.NetworkTransmit()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, netSend...)
// diskFreeSize, err := cli.DiskFreeSize()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskFreeSize...)
// // power, err := cli.GpuPowerUsage()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, power...)
// memTemp, err := cli.GpuMemTemp()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memTemp...)
// // gpuTemp, err := cli.GpuTemp()
// // if err != nil {
// // return c.JSON(Response{
// // Success: false,
// // Error: err.Error(),
// // })
// // }
// // res = append(res, gpuTemp...)
// return c.JSON(Response{
// Success: true,
// Devices: res,
// })
// })
// app.Get("/hw/info", func(c *fiber.Ctx) error {
// res := make([]DeviceInfo, 0, 10)
// diskTotalSize, err := cli.DiskTotalSize()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, diskTotalSize...)
// memSize, err := cli.MemInfo()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, memSize...)
// gpuInfo, err := cli.GpuInfo()
// if err != nil {
// return c.JSON(Response{
// Success: false,
// Error: err.Error(),
// })
// }
// res = append(res, gpuInfo...)
// return c.JSON(Response{
// Success: true,
// Devices: res,
// })
// })
// Start the server on port 3000
log.Fatal(app.Listen(":5000"))
}
type Response struct {
Devices []DeviceInfo `json:"devices"`
Success bool `json:"success"`
Error string `json:"error`
}
type NewResponse struct {
Data Data `json:"hardware"`
Code int `json:"code"`
Msg string `json:"msg"`
}
type Data struct {
Cpus Cpu `json:"CPU"`
Gpus []Gpu `json:"GPU"`
Disk []FileSystem `json:"DISK"`
Networks []Network `json:"NET"`
Mem Mem `json:"RAM"`
}
package main
import (
"github.com/shirou/gopsutil/v3/mem"
// "github.com/shirou/gopsutil/mem" // to use v2
)
func memSmi() (Mem, error) {
v, err := mem.VirtualMemory()
if err != nil {
return Mem{}, err
}
return Mem{
Total: int64(v.Total),
Free: int64(v.Free),
Util: int64(v.UsedPercent),
}, nil
// 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)
}
// 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)
package main
import (
"github.com/shirou/gopsutil/v3/net"
// "github.com/shirou/gopsutil/mem" // to use v2
)
func NetSmi() ([]Network, error) {
nets, err := net.Interfaces()
if err != nil {
return nil, err
}
res := make([]Network, 0, len(nets))
for _, net := range nets {
newRes := Network{
Device: net.Name,
Mac: net.HardwareAddr,
}
res = append(res, newRes)
}
return res, nil
}
// type Network struct {
// Device string `json:"device"`
// Speed int64 `json:"speed"`
// Send int64 `json:"send_rate"`
// Recevice int64 `json:"recv_rate"`
// Mac string `json:"mac"`
// }
// func (c *ProApi) Networks() ([]Network, error) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment