feat: 网元状态记录内存/CPU/磁盘列表

This commit is contained in:
TsMask
2025-05-09 11:49:28 +08:00
parent 8fe41b136f
commit 774c865e97
8 changed files with 267 additions and 19 deletions

View File

@@ -7,13 +7,15 @@ CREATE TABLE "ne_state" (
"ne_type" text(16), "ne_type" text(16),
"ne_id" text(32), "ne_id" text(32),
"version" text(16), "version" text(16),
"capability" text(64), "capability" integer,
"serial_num" text(16), "serial_num" text(16),
"expiry_date" text(10), "expiry_date" text(10),
"cpu_usage" text, "sys_cpu_usage" integer,
"mem_usage" text, "sys_mem_usage" integer,
"disk_space" text, "sys_disk_usage" integer,
"timestamp" integer(20), "nf_cpu_usage" integer,
"nf_mem_used" integer,
"create_time" integer,
PRIMARY KEY ("id") PRIMARY KEY ("id")
); );
@@ -24,7 +26,7 @@ CREATE INDEX "idx_type_id_time"
ON "ne_state" ( ON "ne_state" (
"ne_type" ASC, "ne_type" ASC,
"ne_id" ASC, "ne_id" ASC,
"timestamp" ASC "create_time" ASC
); );
-- ---------------------------- -- ----------------------------

View File

@@ -5,21 +5,22 @@ SET FOREIGN_KEY_CHECKS = 0;
-- Table structure for table `ne_state` -- Table structure for table `ne_state`
-- --
DROP TABLE IF EXISTS `ne_state`; DROP TABLE IF EXISTS `ne_state`;
CREATE TABLE `ne_state` ( CREATE TABLE `ne_state` (
`id` int NOT NULL AUTO_INCREMENT, `id` int NOT NULL AUTO_INCREMENT,
`ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本',
`capability` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `capability` bigint DEFAULT '0' COMMENT '用户容量',
`serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '序列号',
`expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '', `expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '许可证到期日期',
`cpu_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', `sys_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-sys',
`mem_usage` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', `sys_mem_usage` float DEFAULT '0' COMMENT '内存使用率-sys',
`disk_space` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'json信息', `sys_disk_usage` float DEFAULT '0' COMMENT '磁盘使用率-sys',
`timestamp` bigint DEFAULT '0' COMMENT '创建时间', `nf_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-nf',
`nf_mem_used` bigint DEFAULT '0' COMMENT '内存使用KB-nf',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
KEY `idx_type_id_time` (`ne_type`,`ne_id`,`timestamp`) USING BTREE KEY `idx_type_id_time` (`ne_type`,`ne_id`,`create_time`) USING BTREE COMMENT 'idx_state_ne_type_id_at'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录内存/CPU/磁盘';
SET FOREIGN_KEY_CHECKS=1; SET FOREIGN_KEY_CHECKS=1;

View File

@@ -0,0 +1,59 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"be.ems/src/framework/resp"
"be.ems/src/modules/network_data/model"
neDataService "be.ems/src/modules/network_data/service"
neService "be.ems/src/modules/network_element/service"
)
// 实例化控制层 NEStateController 结构体
var NewNEState = &NEStateController{
neInfoService: neService.NewNeInfo,
neStateService: neDataService.NewNEState,
}
// 网元状态记录
//
// PATH /ne-state
type NEStateController struct {
neInfoService *neService.NeInfo // 网元信息服务
neStateService *neDataService.NEState // 网元状态服务
}
// 网元状态记录-内存/CPU/磁盘列表
//
// GET /list
//
// @Tags network_data
// @Accept json
// @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) default(AMF)
// @Param neId query string true "NE ID" default(001)
// @Param pageNum query number true "pageNum" default(1)
// @Param pageSize query number true "pageSize" default(10)
// @Param startTime query number false "Start time (timestamped milliseconds)" default(1729162507596)
// @Param endTime query number false "End time (timestamped milliseconds)" default(1729164187611)
// @Param sortField query string false "Sort fields, fill in result fields" Enums(id,create_time) default(id)
// @Param sortOrder query string false "Sort by ascending or descending order" Enums(asc,desc) default(asc)
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary NE Status Record - Memory/CPU/Disk List
// @Description NE Status Record - Memory/CPU/Disk List
// @Router /ne-state/list [get]
func (s NEStateController) List(c *gin.Context) {
var query model.NEStateQuery
if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
c.JSON(422, resp.CodeMsg(422001, errMsgs))
return
}
// 查询数据
rows, total := s.neStateService.FindByPage(query)
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
}

View File

@@ -0,0 +1,35 @@
package model
// NEState 网元状态记录表 ne_state
type NEState struct {
ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
NeType string `json:"neType" gorm:"column:ne_type"`
NeId string `json:"neId" gorm:"column:ne_id"`
Version string `json:"version" gorm:"column:version"` // 版本
Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量
SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号
ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期
SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys
SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys
SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys
NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf
NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
}
// TableName 表名称
func (*NEState) TableName() string {
return "ne_state"
}
// NEStateQuery 查询参数结构体
type NEStateQuery struct {
NeType string `json:"neType" form:"neType" binding:"required"`
NeID string `json:"neId" form:"neId" binding:"required"`
PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"`
PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"`
BeginTime string `json:"beginTime" form:"beginTime"`
EndTime string `json:"endTime" form:"endTime"`
SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段
SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序asc desc
}

View File

@@ -84,6 +84,15 @@ func Setup(router *gin.Engine) {
) )
} }
// 网元状态记录信息
neStateGroup := neDataGroup.Group("/ne-state")
{
neStateGroup.GET("/list",
middleware.AuthorizeUser(nil),
controller.NewNEState.List,
)
}
// 基站状态历史记录信息 含AMF/MME // 基站状态历史记录信息 含AMF/MME
nbStateGroup := neDataGroup.Group("/nb-state") nbStateGroup := neDataGroup.Group("/nb-state")
{ {

View File

@@ -5,6 +5,7 @@ import (
"be.ems/src/framework/database/db" "be.ems/src/framework/database/db"
"be.ems/src/framework/logger" "be.ems/src/framework/logger"
"be.ems/src/framework/utils/date"
"be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/model"
) )
@@ -35,14 +36,14 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64)
if len(startTime) == 10 { if len(startTime) == 10 {
startTime = startTime + "000" startTime = startTime + "000"
} }
tx = tx.Where("create_time >= ?", startTime) tx = tx.Where("time >= ?", date.ParseDateToStr(startTime, date.YYYY_MM_DDTHH_MM_SSZ))
} }
if query.EndTime != "" { if query.EndTime != "" {
endTime := query.EndTime endTime := query.EndTime
if len(endTime) == 10 { if len(endTime) == 10 {
endTime = endTime + "999" endTime = endTime + "999"
} }
tx = tx.Where("create_time <= ?", endTime) tx = tx.Where("time <= ?", date.ParseDateToStr(endTime, date.YYYY_MM_DDTHH_MM_SSZ))
} }
// 查询结果 // 查询结果

View File

@@ -0,0 +1,110 @@
package repository
import (
"time"
"be.ems/src/framework/database/db"
"be.ems/src/framework/logger"
"be.ems/src/modules/network_data/model"
)
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{}
// NEState 网元状态记录表 数据层处理
type NEState struct{}
// SelectByPage 分页查询集合
func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) {
tx := db.DB("").Model(&model.NEState{})
// 查询条件拼接
if query.NeType != "" {
tx = tx.Where("ne_type = ?", query.NeType)
}
if query.NeID != "" {
tx = tx.Where("ne_id = ?", query.NeID)
}
if query.BeginTime != "" {
startTime := query.BeginTime
if len(startTime) == 10 {
startTime = startTime + "000"
}
tx = tx.Where("create_time >= ?", startTime)
}
if query.EndTime != "" {
endTime := query.EndTime
if len(endTime) == 10 {
endTime = endTime + "999"
}
tx = tx.Where("create_time <= ?", endTime)
}
// 查询结果
var total int64 = 0
rows := []model.NEState{}
// 查询数量为0直接返回
if err := tx.Count(&total).Error; err != nil || total <= 0 {
return rows, total
}
// 排序
if query.SortField != "" {
sortField := query.SortField
if query.SortOrder == "desc" {
sortField = sortField + " desc"
}
tx = tx.Order(sortField)
}
// 查询数据分页
pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize)
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
err := tx.Find(&rows).Error
if err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows, total
}
return rows, total
}
// SelectByIds 通过ID查询
func (r NEState) SelectByIds(ids []string) []model.NEState {
rows := []model.NEState{}
if len(ids) <= 0 {
return rows
}
tx := db.DB("").Model(&model.NEState{})
// 构建查询条件
tx = tx.Where("id in ?", ids)
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}
return rows
}
// DeleteByTime 删除信息
func (r NEState) DeleteByTime(ltTime int64) int64 {
if ltTime <= 0 {
return 0
}
tx := db.DB("").Where("create_time < ?", ltTime)
if err := tx.Delete(&model.NEState{}).Error; err != nil {
logger.Errorf("delete err => %v", err.Error())
return 0
}
return tx.RowsAffected
}
// Insert 新增信息
func (r NEState) Insert(param model.NEState) int64 {
param.CreateTime = time.Now().UnixMilli()
// 执行插入
if err := db.DB("").Create(&param).Error; err != nil {
logger.Errorf("insert err => %v", err.Error())
return 0
}
return param.ID
}

View File

@@ -0,0 +1,31 @@
package service
import (
"be.ems/src/modules/network_data/model"
"be.ems/src/modules/network_data/repository"
)
// 实例化数据层 NEState 结构体
var NewNEState = &NEState{
neStateRepository: repository.NewNEState,
}
// NEState 网元状态记录表 服务层处理
type NEState struct {
neStateRepository *repository.NEState // 网元状态记录信息
}
// FindByPage 根据条件分页查询
func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) {
return r.neStateRepository.SelectByPage(query)
}
// Insert 插入数据
func (r NEState) Insert(item model.NEState) int64 {
return r.neStateRepository.Insert(item)
}
// DeleteByTime 删除数据
func (r NEState) DeleteByTime(ltTime int64) int64 {
return r.neStateRepository.DeleteByTime(ltTime)
}