feat: 跟踪任务添加标题,任务错误移除已发任务

This commit is contained in:
TsMask
2025-05-12 18:19:35 +08:00
parent ca3f1b7738
commit 872567b28a
8 changed files with 131 additions and 13 deletions

View File

@@ -15,6 +15,7 @@ CREATE TABLE "trace_task" (
"dst_ip" text(128),
"create_by" text(50),
"create_time" integer,
"title" text(255),
"remark" text(500),
"ne_list" text(32) NOT NULL,
"notify_url" text(128) NOT NULL,

View File

@@ -0,0 +1,30 @@
-- ----------------------------
-- Table structure for trace_task
-- ----------------------------
CREATE TABLE IF NOT EXISTS "trace_task" (
"id" integer NOT NULL,
"trace_id" text(16) NOT NULL,
"trace_type" text(2) NOT NULL,
"start_time" integer,
"end_time" integer,
"interfaces" text(255),
"imsi" text(16),
"msisdn" text(16),
"src_ip" text(128),
"dst_ip" text(128),
"create_by" text(50),
"create_time" integer,
"title" text(255),
"remark" text(500),
"ne_list" text(32) NOT NULL,
"notify_url" text(128) NOT NULL,
PRIMARY KEY ("id")
);
-- ----------------------------
-- Indexes structure for table trace_task
-- ----------------------------
-- ADD COLUMN
ALTER TABLE trace_task ADD COLUMN title text(255);

View File

@@ -16,6 +16,7 @@ CREATE TABLE `trace_task` (
`dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP',
`create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '任务标题',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注',
`ne_list` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neType_neId 例如 UDM_001,AMF_001',
`notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033',

View File

@@ -0,0 +1,28 @@
--
-- Table structure for table `trace_task`
--
CREATE TABLE IF NOT EXISTS `trace_task` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`trace_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务编号',
`trace_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '1-Interface,2-Device,3-UE',
`start_time` bigint DEFAULT '0' COMMENT '开始时间 毫秒',
`end_time` bigint DEFAULT '0' COMMENT '结束时间 毫秒',
`interfaces` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '接口跟踪必须 例如 N8,N10',
`imsi` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪必须',
`msisdn` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户跟踪可选',
`src_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '源地址IP',
`dst_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '目标地址IP',
`create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
`create_time` bigint DEFAULT '0' COMMENT '创建时间',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '任务标题',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注',
`ne_list` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neType_neId 例如 UDM_001,AMF_001',
`notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务';
-- Dump completed on 2025-04-14 14:26:59
-- ADD COLUMN
ALTER TABLE `trace_task` ADD COLUMN `title` varchar(255) NULL COMMENT '任务标题';

View File

@@ -93,8 +93,16 @@ func processSQLFile(db *gorm.DB, filePath string) {
if strings.HasSuffix(line, ";") {
// 执行 SQL 语句
if err := db.Exec(sqlBuilder.String()).Error; err != nil {
log.Fatalln(err.Error())
return
errorStr := err.Error()
if strings.Contains(strings.ToLower(errorStr), "duplicate column") {
// 重复字段错误忽略
// log.Printf("Exec SQL: %s\n", line)
// log.Println(err.Error())
} else {
// 其他错误终止程序
log.Fatalln(errorStr)
return
}
}
sqlBuilder.Reset()

View File

@@ -14,6 +14,7 @@ type TraceTask struct {
DstIp string `json:"dstIp" gorm:"column:dst_ip"` // 目标地址IP
CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
Title string `json:"title" gorm:"column:title" binding:"required"` // 任务标题
Remark string `json:"remark" gorm:"column:remark"` // 备注
NeList string `json:"neList" gorm:"column:ne_list" binding:"required"` // 网元列表 neType_neId 例如 UDM_001,AMF_001
NotifyUrl string `json:"notifyUrl" gorm:"column:notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:33033

View File

@@ -29,6 +29,9 @@ func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int
if v, ok := query["msisdn"]; ok && v != "" {
tx = tx.Where("msisdn like ?", fmt.Sprintf("%s%%", v))
}
if v, ok := query["title"]; ok && v != "" {
tx = tx.Where("title like ?", fmt.Sprintf("%s%%", v))
}
if v, ok := query["startTime"]; ok && v != "" {
if len(v) == 10 {
v = fmt.Sprintf("%s000", v)
@@ -112,6 +115,20 @@ func (r TraceTask) SelectByIds(ids []int64) []model.TraceTask {
return rows
}
// SelectByUnstopped 查询未停止的任务补发
func (r TraceTask) SelectByUnstopped() []model.TraceTask {
rows := []model.TraceTask{}
tx := db.DB("").Model(&model.TraceTask{})
// 构建查询条件
tx = tx.Where("end_time > ?", time.Now().UnixMilli())
// 查询数据
if err := tx.Find(&rows).Error; err != nil {
logger.Errorf("query find err => %v", err.Error())
return rows
}
return rows
}
// Insert 新增信息 返回新增数据ID
func (r TraceTask) Insert(param model.TraceTask) int64 {
if param.CreateBy != "" {

View File

@@ -177,6 +177,19 @@ func (r TraceTask) FindById(id int64) model.TraceTask {
// Insert 新增信息
func (r TraceTask) Insert(task model.TraceTask) error {
if err := r.createTaskToNe(&task, false); err != nil {
return err
}
// 插入数据库
insertId := r.traceTaskRepository.Insert(task)
if insertId <= 0 {
return fmt.Errorf("insert task error")
}
return nil
}
// CreateTaskToNe 创建任务到网元
func (r TraceTask) createTaskToNe(task *model.TraceTask, ignoreErr bool) error {
// 跟踪配置是否开启
host, port, err := r.traceNotify()
if err != nil {
@@ -193,6 +206,7 @@ func (r TraceTask) Insert(task model.TraceTask) error {
task.TraceId = fmt.Sprint(traceId)
// 发送任务给网元
errNe := []string{}
for _, neTypeID := range neList {
neTypeIDArr := strings.Split(neTypeID, "_")
if len(neTypeIDArr) != 2 {
@@ -204,18 +218,28 @@ func (r TraceTask) Insert(task model.TraceTask) error {
logger.Warnf("ne type id is not exist")
continue
}
if err := r.createTaskToNe(neInfo, task); err != nil {
logger.Errorf("task to %s error: %s", neTypeID, err.Error())
return fmt.Errorf("task to %s error: %s", neTypeID, err.Error())
if err := r.traceNeTask(neInfo, *task); err != nil {
logger.Errorf("ne type id is %s to %s error: %s", task.TraceId, neTypeID, err.Error())
errNe = append(errNe, neTypeID)
continue
}
}
// 插入数据库
insertId := r.traceTaskRepository.Insert(task)
if insertId <= 0 {
return fmt.Errorf("insert task error")
if len(errNe) <= 0 && !ignoreErr {
return nil
}
return nil
// 移除任务
for _, neTypeID := range neList {
neTypeIDArr := strings.Split(neTypeID, "_")
if len(neTypeIDArr) != 2 {
continue
}
neInfo := neService.NewNeInfo.FindByNeTypeAndNeID(neTypeIDArr[0], neTypeIDArr[1])
if neInfo.NeType != neTypeIDArr[0] || neInfo.IP == "" {
continue
}
neFetchlink.NeTraceDelete(neInfo, task.TraceId)
}
return fmt.Errorf("task to ne error: %s", strings.Join(errNe, ","))
}
// traceNotify 网元通知地址
@@ -234,8 +258,8 @@ func (r TraceTask) traceNotify() (string, int64, error) {
return host, port, nil
}
// createTaskToNe 网元创建任务
func (r TraceTask) createTaskToNe(neInfo neModel.NeInfo, task model.TraceTask) error {
// traceNeTask 网元创建任务
func (r TraceTask) traceNeTask(neInfo neModel.NeInfo, task model.TraceTask) error {
data := model.TraceReq{
TraceId: parse.Number(task.TraceId),
NotifyUrl: task.NotifyUrl,
@@ -305,3 +329,11 @@ func (r TraceTask) DeleteByIds(ids []int64) (int64, error) {
// 删除信息失败!
return 0, fmt.Errorf("delete fail")
}
// RunUnstopped 启动跟踪未停止的任务
func (r TraceTask) RunUnstopped() {
tasks := r.traceTaskRepository.SelectByUnstopped()
for _, task := range tasks {
r.createTaskToNe(&task, true)
}
}