mirror of
https://github.com/hamster1963/HomeDash-Backend.git
synced 2025-06-18 05:01:22 +08:00
115 lines
3.0 KiB
Go
115 lines
3.0 KiB
Go
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
|
|
}
|