mirror of
https://github.com/hamster1963/HomeDash-Backend.git
synced 2025-06-19 05:31:22 +08:00
update: 初始化代码提交
This commit is contained in:
114
utility/uptime_utils/kuma.go
Normal file
114
utility/uptime_utils/kuma.go
Normal file
@ -0,0 +1,114 @@
|
||||
package uptime_utils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/gclient"
|
||||
"github.com/gogf/gf/v2/os/gcache"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"home-network-watcher/manifest"
|
||||
"time"
|
||||
)
|
||||
|
||||
type uKuma struct{}
|
||||
|
||||
var Kuma = &uKuma{}
|
||||
|
||||
type UptimeInfo struct {
|
||||
Status bool `json:"status"`
|
||||
Ping int `json:"ping"`
|
||||
Uptime string `json:"uptime"`
|
||||
}
|
||||
|
||||
// GetMonitorStatus
|
||||
//
|
||||
// @dc: 获取监控状态
|
||||
// @author: hamster @date:2023/9/20 14:43:18
|
||||
func (u *uKuma) GetMonitorStatus(ctx context.Context) (serverCount int, errorServer int, err error) {
|
||||
response, err := g.Client().Get(ctx, manifest.UptimeKumaApiUrl)
|
||||
defer func(response *gclient.Response) {
|
||||
err := response.Close()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}(response)
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
// 获取返还数据
|
||||
heartBeatJson := gjson.New(response.ReadAllString()).Get("heartbeatList").Map()
|
||||
serverCount = len(heartBeatJson)
|
||||
for _, value := range heartBeatJson {
|
||||
pingList := gconv.SliceAny(value)
|
||||
if gjson.New(pingList[len(pingList)-1]).Get("status").Int() != 1 {
|
||||
errorServer++
|
||||
}
|
||||
}
|
||||
return serverCount, errorServer, nil
|
||||
}
|
||||
|
||||
// GetUptimeData
|
||||
//
|
||||
// @dc: 获取核心服务监控数据
|
||||
// @author: hamster @date:2023/9/21 11:21:13
|
||||
func (u *uKuma) GetUptimeData(ctx context.Context) (err error) {
|
||||
serviceMap := g.Map{
|
||||
"xui": 2,
|
||||
"v2raya": 9,
|
||||
"proxy": 8,
|
||||
"nginx": 5,
|
||||
"home": 7,
|
||||
"netflix": 15}
|
||||
response, err := g.Client().Get(ctx, manifest.UptimeKumaApiUrl)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(response *gclient.Response) {
|
||||
err := response.Close()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}(response)
|
||||
// 获取返还数据,获取最新状态与 24 小时状态
|
||||
heartBeatJson := gjson.New(response.ReadAllString())
|
||||
for key, value := range serviceMap {
|
||||
serviceUptime := &UptimeInfo{}
|
||||
statusList := heartBeatJson.Get("heartbeatList" + "." + gconv.String(value)).Array()
|
||||
if len(statusList) == 0 {
|
||||
serviceUptime.Status = false
|
||||
serviceUptime.Ping = 0
|
||||
serviceUptime.Uptime = "0.00"
|
||||
serviceMap[key] = gconv.Map(serviceUptime)
|
||||
continue
|
||||
}
|
||||
// 获取最后一条数据
|
||||
lastHeartBeat := statusList[len(statusList)-1]
|
||||
if gconv.Int(gconv.Map(lastHeartBeat)["status"]) == 1 {
|
||||
serviceUptime.Status = true
|
||||
} else {
|
||||
serviceUptime.Status = false
|
||||
}
|
||||
serviceUptime.Ping = gconv.Int(gconv.Map(lastHeartBeat)["ping"])
|
||||
// 获取24小时可用率
|
||||
uptimeList := heartBeatJson.Get("uptimeList" + "." + gconv.String(value) + "_24").Float64()
|
||||
switch uptimeList {
|
||||
case 0:
|
||||
serviceUptime.Uptime = "0.00"
|
||||
case 1:
|
||||
serviceUptime.Uptime = "100.0"
|
||||
default:
|
||||
// 转换为2位小数百分比
|
||||
serviceUptime.Uptime = gconv.String(uptimeList * 100)
|
||||
if len(serviceUptime.Uptime) > 4 {
|
||||
serviceUptime.Uptime = serviceUptime.Uptime[:4]
|
||||
}
|
||||
}
|
||||
serviceMap[key] = gconv.Map(serviceUptime)
|
||||
}
|
||||
err = gcache.Set(ctx, manifest.UptimeCacheKey, serviceMap, 1*time.Hour)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user