监控模块撰写

Former-commit-id: 3e97406e761be8328f84760a2e52791f36e5789e
This commit is contained in:
zhangwei 2023-10-24 10:12:33 +08:00
parent 363e40f4ff
commit 3f5950b7c6
14 changed files with 224 additions and 108 deletions

View File

@ -229,22 +229,40 @@ type (
}
)
// 任务列表参数
type (
taskListReq {
PageNum int `form:"pageNum"`
PageSize int `form:"pageSize"`
}
taskListResp {
TotalCount int `json:"totalCount"`
CardTime float32 `json:"cardTime"`
TotalRunTime float32 `json:"totalRunTime"`
TotalCount int64 `json:"totalCount"` // 任务总数
NormalCount int64 `json:"normalCount"` // 正常任务数
AlarmCount int64 `json:"alarmCount"` // 任务告警数
Tasks []Task `json:"tasks"`
}
Task {
Id int64 `json:"id"`
Name string `json:"name"`
Status string `json:"status"`
Strategy int `json:"strategy"`
TaskType string `json:"taskType"`
StartTime string `json:"startTime"`
EndTime string `json:"endTime"`
ParticipantStatus string `json:"participantStatus"`
ParticipantId int64 `json:"participantId"`
ParticipantName string `json:"participantName"`
SynergyStatus string `json:"synergyStatus"`
}
)
// 任务列表参数
type (
taskDetailReq {
TaskId int64 `path:"taskId"`
}
taskDetailResp {
}
)
type (
listCenterResp {
Code int32 `json:"code"`

View File

@ -36,8 +36,13 @@ service pcm {
@handler scheduleTaskHandler
post /core/scheduleTask (scheduleTaskReq)
// 任务列表接口
@handler TaskListHandler
get /core/taskList returns (taskListResp)
get /core/taskList (taskListReq)returns (taskListResp)
// 任务详情接口
@handler TaskDetailHandler
get /core/taskDetail (taskDetailReq) returns (taskDetailResp)
@handler JobTotalHandler
get /core/jobTotal returns (jobTotalResp)

View File

@ -0,0 +1,28 @@
package core
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/core"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
)
func ScheduleTaskByYamlHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.ScheduleTaskByYamlReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := core.NewScheduleTaskByYamlLogic(r.Context(), svcCtx)
resp, err := l.ScheduleTaskByYaml(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}

View File

@ -0,0 +1,25 @@
package core
import (
"gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/repository/result"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/core"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
)
func TaskDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.TaskDetailReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
l := core.NewTaskDetailLogic(r.Context(), svcCtx)
resp, err := l.TaskDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -1,17 +0,0 @@
package core
import (
"gitlink.org.cn/jcce-pcm/utils/result"
"net/http"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/core"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
)
func TaskListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
l := core.NewTaskListLogic(r.Context(), svcCtx)
resp, err := l.TaskList()
result.HttpResult(r, w, resp, err)
}
}

View File

@ -45,6 +45,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/core/taskList",
Handler: core.TaskListHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/core/taskDetail",
Handler: core.TaskDetailHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/core/jobTotal",

View File

@ -0,0 +1,30 @@
package core
import (
"context"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type ScheduleTaskByYamlLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewScheduleTaskByYamlLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ScheduleTaskByYamlLogic {
return &ScheduleTaskByYamlLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *ScheduleTaskByYamlLogic) ScheduleTaskByYaml(req *types.ScheduleTaskByYamlReq) (resp *types.ScheduleTaskByYamlResp, err error) {
// todo: add your logic here and delete this line
return
}

View File

@ -43,7 +43,7 @@ func (l *ScheduleTaskLogic) ScheduleTask(req *types.ScheduleTaskReq) (err error)
Description: req.Description,
Name: req.Name,
YamlString: string(bytes),
CommitTime: time.Now(),
CommitTime: time.Now().String(),
}
// save the task in mysql and return id
tx := l.svcCtx.DbEngin.Create(&taskModel)

View File

@ -0,0 +1,30 @@
package core
import (
"context"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type TaskDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewTaskDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *TaskDetailLogic {
return &TaskDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *TaskDetailLogic) TaskDetail(req *types.TaskDetailReq) (resp *types.TaskDetailResp, err error) {
// todo: add your logic here and delete this line
return
}

View File

@ -1,73 +0,0 @@
package core
import (
"context"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
models2 "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/models"
"gitlink.org.cn/jcce-pcm/utils/enum"
"github.com/zeromicro/go-zero/core/logx"
)
type TaskListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewTaskListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *TaskListLogic {
return &TaskListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *TaskListLogic) TaskList() (resp *types.TaskListResp, err error) {
resp = &types.TaskListResp{}
// 查询任务数据
var tasks []models2.Task
tx := l.svcCtx.DbEngin.Find(&tasks)
if tx.Error != nil {
logx.Error(err)
return nil, tx.Error
}
if len(tasks) == 0 {
return nil, nil
}
for _, task := range tasks {
var participantName string
tx := l.svcCtx.DbEngin.Raw("SELECT name from sc_participant_phy_info where id in (SELECT CONCAT_WS(',',GROUP_CONCAT(DISTINCT h.participant_id) ,GROUP_CONCAT(DISTINCT a.participant_id) ,GROUP_CONCAT(DISTINCT c.participant_id))as service_name from task t left join hpc h on t.id = h.task_id left join cloud c on t.id = c.task_id left join ai a on t.id = a.task_id where t.id = ?)", task.Id).Scan(&participantName)
if tx.Error != nil {
logx.Error(err)
return nil, tx.Error
}
// 承接方转义
resp.Tasks = append(resp.Tasks, types.Task{
ParticipantName: participantName,
Name: task.Name,
Strategy: int(task.Strategy),
SynergyStatus: enum.SynergyStatus(task.SynergyStatus).String(),
Status: task.Status,
})
}
// 查询总运行时长
tx = l.svcCtx.DbEngin.Raw("select sum(running_time)/3600 as total_run_time from (select sum(running_time) as running_time from hpc union all select sum(running_time) as running_time from cloud union all select sum(running_time) as running_time from ai) runtime").Scan(&resp.TotalRunTime)
if tx.Error != nil {
logx.Error(err)
return nil, tx.Error
}
// 运行卡时数
tx = l.svcCtx.DbEngin.Model(&models2.Hpc{}).Select("(CASE WHEN SUM(running_time * card_count)/3600 IS NULL THEN 0 ELSE SUM(running_time * card_count)/3600 END )as cardTime").Find(&resp.CardTime)
if tx.Error != nil {
return nil, tx.Error
}
// 运行任务合计数
resp.TotalCount = len(tasks)
return resp, nil
}

View File

@ -207,19 +207,35 @@ type TrainJob struct {
Strategy int `json:"strategy"`
}
type TaskListReq struct {
PageNum int `form:"pageNum"`
PageSize int `form:"pageSize"`
}
type TaskListResp struct {
TotalCount int `json:"totalCount"`
CardTime float32 `json:"cardTime"`
TotalRunTime float32 `json:"totalRunTime"`
Tasks []Task `json:"tasks"`
TotalCount int64 `json:"totalCount"` // 任务总数
NormalCount int64 `json:"normalCount"` // 正常任务数
AlarmCount int64 `json:"alarmCount"` // 任务告警数
Tasks []Task `json:"tasks"`
}
type Task struct {
Name string `json:"name"`
Status string `json:"status"`
Strategy int `json:"strategy"`
ParticipantName string `json:"participantName"`
SynergyStatus string `json:"synergyStatus"`
Id int64 `json:"id"`
Name string `json:"name"`
Status string `json:"status"`
TaskType string `json:"taskType"`
StartTime string `json:"startTime"`
EndTime string `json:"endTime"`
ParticipantStatus string `json:"participantStatus"`
ParticipantId int64 `json:"participantId"`
ParticipantName string `json:"participantName"`
}
type TaskDetailReq struct {
TaskId int64 `path:"taskId"`
}
type TaskDetailResp struct {
}
type ListCenterResp struct {

View File

@ -7,7 +7,6 @@ import (
"database/sql"
"gorm.io/gorm"
"strings"
"time"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/sqlx"
@ -41,7 +40,8 @@ type (
Status string `db:"status"` // 作业状态
Strategy int64 `db:"strategy"` // 策略
SynergyStatus int64 `db:"synergy_status"` // 协同状态0-未协同、1-已协同)
CommitTime time.Time `db:"commit_time"` // 提交时间
CommitTime string `db:"commit_time"` // 提交时间
StartTime string `db:"start_time"` // 开始时间
EndTime string `db:"end_time"` // 结束运行时间
RunningTime int64 `db:"running_time"` // 已运行时间(单位秒)
YamlString string `db:"yaml_string"`

30
pkg/tracker/interface.go Normal file
View File

@ -0,0 +1,30 @@
package tracker
/*
Copyright 2020 KubeSphere Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
type Interface interface {
//GetMetric(expr string, time time.Time) Metric
//GetMetricOverTime(expr string, start, end time.Time, step time.Duration) Metric
//GetNamedMetrics(metrics []string, time time.Time, opt QueryOption) []Metric
//GetNamedMetricsOverTime(metrics []string, start, end time.Time, step time.Duration, opt QueryOption) []Metric
//GetMetadata(namespace string) []Metadata
//GetMetricLabelSet(expr string, start, end time.Time) []map[string]string
//
//// meter
//GetNamedMeters(meters []string, time time.Time, opts []QueryOption) []Metric
//GetNamedMetersOverTime(metrics []string, start, end time.Time, step time.Duration, opts []QueryOption) []Metric
}

19
pkg/tracker/tracker.go Normal file
View File

@ -0,0 +1,19 @@
package tracker
import (
"github.com/prometheus/client_golang/api"
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
)
type prometheus struct {
client v1.API
}
func NewPrometheus(address string) (Interface, error) {
cfg := api.Config{
Address: address,
}
client, err := api.NewClient(cfg)
return prometheus{client: v1.NewAPI(client)}, err
}