Files
EdgeAPI/internal/rpc/services/service_server_stat_board.go

703 lines
23 KiB
Go
Raw Permalink Normal View History

2024-05-17 18:27:26 +08:00
// Copyright 2021 GoEdge CDN goedge.cdn@gmail.com. All rights reserved.
2021-07-05 11:37:22 +08:00
package services
import (
"context"
2024-07-27 14:15:25 +08:00
"time"
2021-07-05 11:37:22 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
2021-12-06 09:16:18 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
2021-07-05 11:37:22 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/tasks"
2022-07-05 20:08:58 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/utils"
2021-07-05 11:37:22 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
2021-07-05 16:37:53 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
2022-11-04 20:30:53 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
2021-07-05 11:37:22 +08:00
timeutil "github.com/iwind/TeaGo/utils/time"
)
// ServerStatBoardService 统计看板条目
type ServerStatBoardService struct {
BaseService
}
// FindAllEnabledServerStatBoards 读取所有看板
func (this *ServerStatBoardService) FindAllEnabledServerStatBoards(ctx context.Context, req *pb.FindAllEnabledServerStatBoardsRequest) (*pb.FindAllEnabledServerStatBoardsResponse, error) {
2022-07-22 14:35:17 +08:00
_, err := this.ValidateAdmin(ctx)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
var tx = this.NullTx()
boards, err := models.SharedServerStatBoardDAO.FindAllEnabledBoards(tx, req.NodeClusterId)
if err != nil {
return nil, err
}
var pbBoards = []*pb.ServerStatBoard{}
for _, board := range boards {
pbBoards = append(pbBoards, &pb.ServerStatBoard{
Id: int64(board.Id),
Name: board.Name,
2022-03-22 21:45:07 +08:00
IsOn: board.IsOn,
2021-07-05 11:37:22 +08:00
})
}
return &pb.FindAllEnabledServerStatBoardsResponse{
ServerStatBoards: pbBoards,
}, nil
}
// ComposeServerStatNodeClusterBoard 组合看板数据
func (this *ServerStatBoardService) ComposeServerStatNodeClusterBoard(ctx context.Context, req *pb.ComposeServerStatNodeClusterBoardRequest) (*pb.ComposeServerStatNodeClusterBoardResponse, error) {
2022-07-22 14:35:17 +08:00
_, err := this.ValidateAdmin(ctx)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
var tx = this.NullTx()
var result = &pb.ComposeServerStatNodeClusterBoardResponse{}
// 统计数字
2022-04-04 12:08:08 +08:00
countActiveNodes, err := models.SharedNodeDAO.CountAllEnabledNodesMatch(tx, req.NodeClusterId, configutils.BoolStateAll, configutils.BoolStateYes, "", 0, 0, 0, true)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
result.CountActiveNodes = countActiveNodes
2022-04-04 12:08:08 +08:00
countInactiveNodes, err := models.SharedNodeDAO.CountAllEnabledNodesMatch(tx, req.NodeClusterId, configutils.BoolStateAll, configutils.BoolStateNo, "", 0, 0, 0, true)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
result.CountInactiveNodes = countInactiveNodes
countUsers, err := models.SharedUserDAO.CountAllEnabledUsers(tx, req.NodeClusterId, "", false, -1)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
result.CountUsers = countUsers
countServers, err := models.SharedServerDAO.CountAllEnabledServersWithNodeClusterId(tx, req.NodeClusterId)
if err != nil {
return nil, err
}
result.CountServers = countServers
// 当月总流量
monthlyTrafficStat, err := stats.SharedNodeClusterTrafficDailyStatDAO.SumDailyStat(tx, req.NodeClusterId, timeutil.Format("Ym01"), timeutil.Format("Ym31"))
if err != nil {
return nil, err
}
if monthlyTrafficStat != nil {
result.MonthlyTrafficBytes = int64(monthlyTrafficStat.Bytes)
}
2021-07-05 11:37:22 +08:00
// 按日流量统计
2022-07-05 20:08:58 +08:00
var dayFrom = timeutil.Format("Ymd", time.Now().AddDate(0, 0, -14))
2021-07-05 11:37:22 +08:00
dailyTrafficStats, err := stats.SharedNodeClusterTrafficDailyStatDAO.FindDailyStats(tx, req.NodeClusterId, dayFrom, timeutil.Format("Ymd"))
if err != nil {
return nil, err
}
var dailyTrafficBytes int64
var lastDailyTrafficBytes int64
2021-07-05 11:37:22 +08:00
for _, stat := range dailyTrafficStats {
if stat.Day == timeutil.Format("Ymd") { // 今天
dailyTrafficBytes = int64(stat.Bytes)
} else if stat.Day == timeutil.Format("Ymd", time.Now().AddDate(0, 0, -1)) {
lastDailyTrafficBytes = int64(stat.Bytes)
}
2021-07-05 11:37:22 +08:00
result.DailyTrafficStats = append(result.DailyTrafficStats, &pb.ComposeServerStatNodeClusterBoardResponse_DailyTrafficStat{
Day: stat.Day,
Bytes: int64(stat.Bytes),
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
2021-07-05 11:37:22 +08:00
})
}
result.DailyTrafficBytes = dailyTrafficBytes
result.LastDailyTrafficBytes = lastDailyTrafficBytes
2021-07-05 11:37:22 +08:00
// 小时流量统计
2022-07-05 20:08:58 +08:00
var hourFrom = timeutil.Format("YmdH", time.Now().Add(-23*time.Hour))
var hourTo = timeutil.Format("YmdH")
2021-07-05 11:37:22 +08:00
hourlyTrafficStats, err := stats.SharedNodeTrafficHourlyStatDAO.FindHourlyStatsWithClusterId(tx, req.NodeClusterId, hourFrom, hourTo)
if err != nil {
return nil, err
}
for _, stat := range hourlyTrafficStats {
result.HourlyTrafficStats = append(result.HourlyTrafficStats, &pb.ComposeServerStatNodeClusterBoardResponse_HourlyTrafficStat{
Hour: stat.Hour,
Bytes: int64(stat.Bytes),
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
2021-07-05 11:37:22 +08:00
})
}
// 节点排行
2021-08-20 10:10:55 +08:00
topNodeStats, err := stats.SharedNodeTrafficHourlyStatDAO.FindTopNodeStatsWithClusterId(tx, "node", req.NodeClusterId, hourFrom, hourTo, 10)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
for _, stat := range topNodeStats {
nodeName, err := models.SharedNodeDAO.FindNodeName(tx, int64(stat.NodeId))
if err != nil {
return nil, err
}
if len(nodeName) == 0 {
continue
}
result.TopNodeStats = append(result.TopNodeStats, &pb.ComposeServerStatNodeClusterBoardResponse_NodeStat{
2021-07-13 11:04:45 +08:00
NodeId: int64(stat.NodeId),
NodeName: nodeName,
CountRequests: int64(stat.CountRequests),
Bytes: int64(stat.Bytes),
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
2021-07-05 11:37:22 +08:00
})
}
// CPU、内存、负载
cpuValues, err := models.SharedNodeValueDAO.ListValuesWithClusterId(tx, "node", req.NodeClusterId, nodeconfigs.NodeValueItemCPU, "usage", nodeconfigs.NodeValueRangeMinute)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
for _, v := range cpuValues {
result.CpuNodeValues = append(result.CpuNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
2021-07-05 11:37:22 +08:00
CreatedAt: int64(v.CreatedAt),
})
}
memoryValues, err := models.SharedNodeValueDAO.ListValuesWithClusterId(tx, "node", req.NodeClusterId, nodeconfigs.NodeValueItemMemory, "usage", nodeconfigs.NodeValueRangeMinute)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
for _, v := range memoryValues {
result.MemoryNodeValues = append(result.MemoryNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
2021-07-05 11:37:22 +08:00
CreatedAt: int64(v.CreatedAt),
})
}
loadValues, err := models.SharedNodeValueDAO.ListValuesWithClusterId(tx, "node", req.NodeClusterId, nodeconfigs.NodeValueItemLoad, "load1m", nodeconfigs.NodeValueRangeMinute)
2021-07-05 11:37:22 +08:00
if err != nil {
return nil, err
}
for _, v := range loadValues {
result.LoadNodeValues = append(result.LoadNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
2021-07-05 11:37:22 +08:00
CreatedAt: int64(v.CreatedAt),
})
}
var pbCharts []*pb.MetricDataChart
charts, ok := tasks.SharedCacheTaskManager.GetCluster(tasks.CacheKeyFindNodeClusterMetricDataCharts, req.NodeClusterId, serverconfigs.MetricItemCategoryHTTP)
if ok {
pbCharts = charts.([]*pb.MetricDataChart)
2021-07-05 16:37:53 +08:00
}
result.MetricDataCharts = pbCharts
2021-07-05 16:37:53 +08:00
2021-07-05 11:37:22 +08:00
return result, nil
}
// ComposeServerStatNodeBoard 组合节点看板数据
func (this *ServerStatBoardService) ComposeServerStatNodeBoard(ctx context.Context, req *pb.ComposeServerStatNodeBoardRequest) (*pb.ComposeServerStatNodeBoardResponse, error) {
2022-07-22 14:35:17 +08:00
_, err := this.ValidateAdmin(ctx)
if err != nil {
return nil, err
}
var result = &pb.ComposeServerStatNodeBoardResponse{}
// 在线状态
var tx = this.NullTx()
node, err := models.SharedNodeDAO.FindEnabledNode(tx, req.NodeId)
if err != nil {
return nil, err
}
if node == nil {
return nil, errors.New("node not found")
}
status, err := node.DecodeStatus()
if err != nil {
return nil, err
}
if status != nil && time.Now().Unix()-status.UpdatedAt < 60 {
result.IsActive = true
result.CacheDiskSize = status.CacheTotalDiskSize
result.CacheMemorySize = status.CacheTotalMemorySize
}
// 流量
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemTrafficIn)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.TrafficInBytes = value.DecodeMapValue().GetInt64("total")
}
}
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemTrafficOut)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.TrafficOutBytes = value.DecodeMapValue().GetInt64("total")
}
}
// 连接数
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemConnections)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.CountConnections = value.DecodeMapValue().GetInt64("total")
}
}
// 请求量
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemRequests)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.CountRequests = value.DecodeMapValue().GetInt64("total")
}
}
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemAttackRequests)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.CountAttackRequests = value.DecodeMapValue().GetInt64("total")
}
}
// CPU
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemCPU)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.CpuUsage = value.DecodeMapValue().GetFloat32("usage")
}
}
// 内存
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemMemory)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
m := value.DecodeMapValue()
result.MemoryUsage = m.GetFloat32("usage")
result.MemoryTotalSize = m.GetInt64("total")
}
}
// 负载
{
value, err := models.SharedNodeValueDAO.FindLatestNodeValue(tx, "node", int64(node.Id), nodeconfigs.NodeValueItemLoad)
if err != nil {
return nil, err
}
if value != nil && time.Now().Unix()-int64(value.CreatedAt) < 120 {
result.Load = value.DecodeMapValue().GetFloat32("load1m")
}
}
// 当月总流量
2023-05-17 18:42:21 +08:00
monthlyTrafficStat, err := models.SharedNodeTrafficDailyStatDAO.SumDailyStat(tx, nodeconfigs.NodeRoleNode, req.NodeId, timeutil.Format("Ym01"), timeutil.Format("Ym31"))
if err != nil {
return nil, err
}
if monthlyTrafficStat != nil {
result.MonthlyTrafficBytes = int64(monthlyTrafficStat.Bytes)
}
// 按日流量统计
2022-07-05 20:08:58 +08:00
var dayFrom = timeutil.Format("Ymd", time.Now().AddDate(0, 0, -14))
2023-05-17 18:42:21 +08:00
dailyTrafficStats, err := models.SharedNodeTrafficDailyStatDAO.FindDailyStats(tx, "node", req.NodeId, dayFrom, timeutil.Format("Ymd"))
if err != nil {
return nil, err
}
var dailyTrafficBytes int64
var lastDailyTrafficBytes int64
for _, stat := range dailyTrafficStats {
if stat.Day == timeutil.Format("Ymd") { // 当天
dailyTrafficBytes = int64(stat.Bytes)
} else if stat.Day == timeutil.Format("Ymd", time.Now().AddDate(0, 0, -1)) { // 昨天
lastDailyTrafficBytes = int64(stat.Bytes)
}
result.DailyTrafficStats = append(result.DailyTrafficStats, &pb.ComposeServerStatNodeBoardResponse_DailyTrafficStat{
Day: stat.Day,
Bytes: int64(stat.Bytes),
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
})
}
result.DailyTrafficBytes = dailyTrafficBytes
result.LastDailyTrafficBytes = lastDailyTrafficBytes
// 小时流量统计
2022-07-05 20:08:58 +08:00
var hourFrom = timeutil.Format("YmdH", time.Now().Add(-23*time.Hour))
var hourTo = timeutil.Format("YmdH")
hourlyTrafficStats, err := stats.SharedNodeTrafficHourlyStatDAO.FindHourlyStatsWithNodeId(tx, "node", req.NodeId, hourFrom, hourTo)
if err != nil {
return nil, err
}
for _, stat := range hourlyTrafficStats {
result.HourlyTrafficStats = append(result.HourlyTrafficStats, &pb.ComposeServerStatNodeBoardResponse_HourlyTrafficStat{
Hour: stat.Hour,
Bytes: int64(stat.Bytes),
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
})
}
// CPU、内存、负载
cpuValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemCPU, nodeconfigs.NodeValueRangeMinute)
if err != nil {
return nil, err
}
for _, v := range cpuValues {
result.CpuNodeValues = append(result.CpuNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
CreatedAt: int64(v.CreatedAt),
})
}
memoryValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemMemory, nodeconfigs.NodeValueRangeMinute)
if err != nil {
return nil, err
}
for _, v := range memoryValues {
result.MemoryNodeValues = append(result.MemoryNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
CreatedAt: int64(v.CreatedAt),
})
}
loadValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemLoad, nodeconfigs.NodeValueRangeMinute)
if err != nil {
return nil, err
}
for _, v := range loadValues {
result.LoadNodeValues = append(result.LoadNodeValues, &pb.NodeValue{
ValueJSON: v.Value,
CreatedAt: int64(v.CreatedAt),
})
}
networkPacketsValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemNetworkPackets, nodeconfigs.NodeValueRangeMinute)
if err != nil {
return nil, err
}
for _, v := range networkPacketsValues {
result.NetworkPacketsValues = append(result.NetworkPacketsValues, &pb.NodeValue{
ValueJSON: v.Value,
CreatedAt: int64(v.CreatedAt),
})
}
2021-07-08 19:43:09 +08:00
cacheDirValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemCacheDir, nodeconfigs.NodeValueRangeMinute)
if err != nil {
return nil, err
}
for _, v := range cacheDirValues {
result.CacheDirsValues = append(result.CacheDirsValues, &pb.NodeValue{
2022-03-22 19:30:30 +08:00
ValueJSON: v.Value,
2021-07-08 19:43:09 +08:00
CreatedAt: int64(v.CreatedAt),
})
}
// 指标
var clusterId = int64(node.ClusterId)
var pbCharts []*pb.MetricDataChart
charts, ok := tasks.SharedCacheTaskManager.GetNode(tasks.CacheKeyFindNodeMetricDataCharts, clusterId, req.NodeId, serverconfigs.MetricItemCategoryHTTP)
if ok {
pbCharts = charts.([]*pb.MetricDataChart)
}
result.MetricDataCharts = pbCharts
return result, nil
}
2021-07-07 19:55:37 +08:00
// ComposeServerStatBoard 组合服务看板数据
func (this *ServerStatBoardService) ComposeServerStatBoard(ctx context.Context, req *pb.ComposeServerStatBoardRequest) (*pb.ComposeServerStatBoardResponse, error) {
2022-07-22 14:35:17 +08:00
_, err := this.ValidateAdmin(ctx)
2021-07-07 19:55:37 +08:00
if err != nil {
return nil, err
}
var result = &pb.ComposeServerStatBoardResponse{}
var tx = this.NullTx()
// 用户ID
userId, err := models.SharedServerDAO.FindServerUserId(tx, req.ServerId)
if err != nil {
return nil, err
}
var bandwidthAglo = ""
if userId > 0 {
bandwidthAglo, err = models.SharedUserDAO.FindUserBandwidthAlgoForView(tx, userId, nil)
if err != nil {
return nil, err
}
}
// 当日统计
{
var day = timeutil.Format("Ymd")
stat, err := models.SharedServerBandwidthStatDAO.SumDailyStat(tx, req.ServerId, 0, day, day)
if err != nil {
return nil, err
}
result.DailyCountIPs = stat.CountIPs
result.DailyTrafficBytes = stat.Bytes
}
2022-07-05 20:08:58 +08:00
// 带宽统计
2022-07-07 17:11:49 +08:00
{
var month = timeutil.Format("Ym")
var day = timeutil.Format("Ymd")
// 当前N分钟区间
{
2022-09-05 16:04:34 +08:00
// 查询最近的三个时段,以尽可能获取数据
var timestamp = time.Now().Unix() / 300 * 300
var minute1 = timeutil.FormatTime("Hi", timestamp)
var minute2 = timeutil.FormatTime("Hi", timestamp-300)
var minute3 = timeutil.FormatTime("Hi", timestamp-300*2)
2022-07-07 17:11:49 +08:00
2022-09-05 16:04:34 +08:00
for _, minute := range []string{minute1, minute2, minute3} {
bytes, err := models.SharedServerBandwidthStatDAO.FindMinutelyPeekBandwidthBytes(tx, req.ServerId, day, minute, bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-07-07 17:11:49 +08:00
if err != nil {
return nil, err
}
if bytes > 0 {
result.MinutelyPeekBandwidthBytes = bytes
break
}
}
}
// 当天
{
bytes, err := models.SharedServerBandwidthStatDAO.FindDailyPeekBandwidthBytes(tx, req.ServerId, day, bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-07-07 17:11:49 +08:00
if err != nil {
return nil, err
}
result.DailyPeekBandwidthBytes = bytes
}
// 当月
{
bytes, err := models.SharedServerBandwidthStatDAO.FindMonthlyPeekBandwidthBytes(tx, req.ServerId, month, bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-07-07 17:11:49 +08:00
if err != nil {
return nil, err
}
result.MonthlyPeekBandwidthBytes = bytes
}
// 上月
{
bytes, err := models.SharedServerBandwidthStatDAO.FindMonthlyPeekBandwidthBytes(tx, req.ServerId, timeutil.Format("Ym", time.Now().AddDate(0, -1, 0)), bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-07-07 17:11:49 +08:00
if err != nil {
return nil, err
}
result.LastMonthlyPeekBandwidthBytes = bytes
}
}
2022-07-05 20:08:58 +08:00
{
var bandwidthMinutes = utils.RangeMinutes(time.Now(), 12, 5)
var bandwidthStatMap = map[string]*pb.ServerBandwidthStat{}
2022-11-04 20:30:53 +08:00
var timeFrom = ""
var timeTo = ""
2022-07-05 20:08:58 +08:00
for _, r := range utils.GroupMinuteRanges(bandwidthMinutes) {
2022-11-04 20:30:53 +08:00
if len(timeFrom) == 0 || timeFrom > r.Day+r.MinuteFrom {
timeFrom = r.Day + r.MinuteFrom
}
if len(timeTo) == 0 || timeTo < r.Day+r.MinuteTo {
timeTo = r.Day + r.MinuteTo
}
bandwidthStats, err := models.SharedServerBandwidthStatDAO.FindServerStats(tx, req.ServerId, r.Day, r.MinuteFrom, r.MinuteTo, bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-07-05 20:08:58 +08:00
if err != nil {
return nil, err
}
for _, stat := range bandwidthStats {
bandwidthStatMap[stat.Day+"@"+stat.TimeAt] = &pb.ServerBandwidthStat{
Id: int64(stat.Id),
ServerId: int64(stat.ServerId),
Day: stat.Day,
TimeAt: stat.TimeAt,
Bytes: int64(stat.Bytes),
Bits: int64(stat.Bytes * 8),
2022-07-05 20:08:58 +08:00
}
}
}
var pbBandwidthStats = []*pb.ServerBandwidthStat{}
for _, minute := range bandwidthMinutes {
stat, ok := bandwidthStatMap[minute.Day+"@"+minute.Minute]
if ok {
pbBandwidthStats = append(pbBandwidthStats, stat)
} else {
2022-10-14 10:03:29 +08:00
var bytes = ServerBandwidthGetCacheBytes(req.ServerId, minute.Minute) // 从当前缓存中读取
2022-07-05 20:08:58 +08:00
pbBandwidthStats = append(pbBandwidthStats, &pb.ServerBandwidthStat{
Id: 0,
ServerId: req.ServerId,
Day: minute.Day,
TimeAt: minute.Minute,
Bytes: bytes,
Bits: bytes * 8,
2022-07-05 20:08:58 +08:00
})
}
}
2022-07-07 17:11:49 +08:00
result.MinutelyBandwidthStats = pbBandwidthStats
2022-11-04 20:30:53 +08:00
// percentile
if len(timeFrom) > 0 && len(timeTo) > 0 {
var percentile = systemconfigs.DefaultBandwidthPercentile
userUIConfig, _ := models.SharedSysSettingDAO.ReadUserUIConfig(tx)
if userUIConfig != nil && userUIConfig.TrafficStats.BandwidthPercentile > 0 {
percentile = userUIConfig.TrafficStats.BandwidthPercentile
}
result.BandwidthPercentile = percentile
percentileStat, err := models.SharedServerBandwidthStatDAO.FindPercentileBetweenTimes(tx, req.ServerId, timeFrom, timeTo, percentile, bandwidthAglo == systemconfigs.BandwidthAlgoAvg)
2022-11-04 20:30:53 +08:00
if err != nil {
return nil, err
}
if percentileStat != nil {
result.MinutelyNthBandwidthStat = &pb.ServerBandwidthStat{
Day: percentileStat.Day,
TimeAt: percentileStat.TimeAt,
Bytes: int64(percentileStat.Bytes),
Bits: int64(percentileStat.Bytes * 8),
}
}
}
2022-07-05 20:08:58 +08:00
}
2021-07-07 19:55:37 +08:00
// 按日流量统计
2022-07-05 20:08:58 +08:00
var dayFrom = timeutil.Format("Ymd", time.Now().AddDate(0, 0, -14))
dailyTrafficStats, err := models.SharedServerBandwidthStatDAO.FindDailyStats(tx, req.ServerId, dayFrom, timeutil.Format("Ymd"))
2021-07-07 19:55:37 +08:00
if err != nil {
return nil, err
}
for _, stat := range dailyTrafficStats {
result.DailyTrafficStats = append(result.DailyTrafficStats, &pb.ComposeServerStatBoardResponse_DailyTrafficStat{
Day: stat.Day,
Bytes: int64(stat.TotalBytes),
2021-07-07 19:55:37 +08:00
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
2021-07-07 19:55:37 +08:00
})
}
// 小时流量统计
2022-07-05 20:08:58 +08:00
var hourFrom = timeutil.Format("YmdH", time.Now().Add(-23*time.Hour))
var hourTo = timeutil.Format("YmdH")
hourlyTrafficStats, err := models.SharedServerBandwidthStatDAO.FindHourlyStats(tx, req.ServerId, hourFrom, hourTo)
2021-07-07 19:55:37 +08:00
if err != nil {
return nil, err
}
for _, stat := range hourlyTrafficStats {
result.HourlyTrafficStats = append(result.HourlyTrafficStats, &pb.ComposeServerStatBoardResponse_HourlyTrafficStat{
Hour: stat.Day + stat.TimeAt[:2],
Bytes: int64(stat.TotalBytes),
2021-07-07 19:55:37 +08:00
CachedBytes: int64(stat.CachedBytes),
CountRequests: int64(stat.CountRequests),
CountCachedRequests: int64(stat.CountCachedRequests),
2021-07-13 11:04:45 +08:00
CountAttackRequests: int64(stat.CountAttackRequests),
AttackBytes: int64(stat.AttackBytes),
2021-07-07 19:55:37 +08:00
})
}
2021-12-06 09:16:18 +08:00
// 地区流量排行
totalCountryBytes, err := stats.SharedServerRegionCountryDailyStatDAO.SumDailyTotalBytesWithServerId(tx, timeutil.Format("Ymd"), req.ServerId)
if err != nil {
return nil, err
}
if totalCountryBytes > 0 {
topCountryStats, err := stats.SharedServerRegionCountryDailyStatDAO.ListServerStats(tx, req.ServerId, timeutil.Format("Ymd"), "bytes", 0, 100)
if err != nil {
return nil, err
}
for _, stat := range topCountryStats {
countryName, err := regions.SharedRegionCountryDAO.FindRegionCountryName(tx, int64(stat.CountryId))
if err != nil {
return nil, err
}
result.TopCountryStats = append(result.TopCountryStats, &pb.ComposeServerStatBoardResponse_CountryStat{
CountryName: countryName,
Bytes: int64(stat.Bytes),
CountRequests: int64(stat.CountRequests),
AttackBytes: int64(stat.AttackBytes),
CountAttackRequests: int64(stat.CountAttackRequests),
Percent: float32(stat.Bytes*100) / float32(totalCountryBytes),
})
}
}
2021-07-07 19:55:37 +08:00
// 指标
clusterId, err := models.SharedServerDAO.FindServerClusterId(tx, req.ServerId)
if err != nil {
return nil, err
}
var metricCategory = serverconfigs.MetricItemCategoryHTTP
serverType, err := models.SharedServerDAO.FindEnabledServerType(tx, req.ServerId)
if err != nil {
return nil, err
}
switch serverType {
case serverconfigs.ServerTypeTCPProxy:
metricCategory = serverconfigs.MetricItemCategoryTCP
case serverconfigs.ServerTypeUDPProxy:
metricCategory = serverconfigs.MetricItemCategoryUDP
}
2021-07-19 17:58:16 +08:00
var pbCharts []*pb.MetricDataChart
charts, ok := tasks.SharedCacheTaskManager.GetServer(tasks.CacheKeyFindServerMetricDataCharts, clusterId, req.ServerId, metricCategory)
if ok {
pbCharts = charts.([]*pb.MetricDataChart)
2021-07-19 17:58:16 +08:00
}
result.MetricDataCharts = pbCharts
2021-07-19 17:58:16 +08:00
return result, nil
2021-07-07 19:55:37 +08:00
}