marge: 合并11.2版本
This commit is contained in:
@@ -10,7 +10,10 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"be.ems/features/pm/kpi_c_report"
|
||||
"be.ems/features/pm/kpi_c_title"
|
||||
"be.ems/lib/dborm"
|
||||
evaluate "be.ems/lib/eval"
|
||||
"be.ems/lib/global"
|
||||
"be.ems/lib/log"
|
||||
"be.ems/lib/services"
|
||||
@@ -41,7 +44,7 @@ type KpiReport struct {
|
||||
NeType string `json:"NeType"`
|
||||
KPIs []struct {
|
||||
KPIID string `json:"KPIID"`
|
||||
Value int `json:"Value"`
|
||||
Value int64 `json:"Value"`
|
||||
Err string `json:"Err"`
|
||||
} `json:"KPIs"`
|
||||
} `json:"NE"`
|
||||
@@ -59,7 +62,7 @@ type GoldKpi struct {
|
||||
RmUid string `json:"rmUid" xorm:"rm_uid"`
|
||||
NEType string `json:"neType" xorm:"ne_type"`
|
||||
KpiId string `json:"kpiId" xorm:"kpi_id"`
|
||||
Value int `json:"value"`
|
||||
Value int64 `json:"value"`
|
||||
Error string `json:"error"`
|
||||
Timestamp string `json:"timestamp"`
|
||||
}
|
||||
@@ -246,9 +249,13 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
// kip_id ...
|
||||
"neType": kpiReport.Task.NE.NeType,
|
||||
"neName": kpiReport.Task.NE.NEName,
|
||||
"rmUID": kpiReport.Task.NE.RmUID,
|
||||
"startIndex": kpiIndex,
|
||||
"timeGroup": kpiData.CreatedAt,
|
||||
}
|
||||
|
||||
// for custom kpi
|
||||
kpiValMap := map[string]any{}
|
||||
for _, k := range kpiReport.Task.NE.KPIs {
|
||||
kpiEvent[k.KPIID] = k.Value // kip_id
|
||||
|
||||
@@ -256,7 +263,9 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
kpiVal.Value = int64(k.Value)
|
||||
kpiVal.Err = k.Err
|
||||
kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal)
|
||||
kpiValMap[k.KPIID] = k.Value
|
||||
}
|
||||
kpiValMap["granularity"] = kpiData.Granularity
|
||||
|
||||
// insert kpi_report table, no session
|
||||
tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType)
|
||||
@@ -267,147 +276,65 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
report := kpi_c_report.KpiCReport{
|
||||
NeType: &kpiData.NEType,
|
||||
NeName: &kpiData.NEName,
|
||||
RmUID: &kpiData.RmUid,
|
||||
Date: kpiData.Date,
|
||||
StartTime: &kpiData.StartTime,
|
||||
EndTime: &kpiData.EndTime,
|
||||
Index: int16(kpiData.Index),
|
||||
Granularity: &kpiData.Granularity,
|
||||
}
|
||||
|
||||
// 发送到匹配的网元
|
||||
neInfo := neService.NewNeInfoImpl.SelectNeInfoByRmuid(kpiData.RmUid)
|
||||
neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(kpiData.RmUid)
|
||||
// custom kpi report to FE
|
||||
kpiCEvent := map[string]any{
|
||||
// kip_id ...
|
||||
"neType": kpiData.NEType,
|
||||
"neId": neInfo.NeId,
|
||||
"neName": kpiData.NEName,
|
||||
"rmUID": kpiData.RmUid,
|
||||
"startIndex": kpiData.Index,
|
||||
"timeGroup": kpiData.Date[:10] + " " + kpiData.EndTime,
|
||||
"createdAt": kpiData.CreatedAt,
|
||||
"granularity": kpiData.Granularity,
|
||||
}
|
||||
kpiCList := kpi_c_title.GetActiveKPICList(kpiData.NEType)
|
||||
for _, k := range kpiCList {
|
||||
result, err := evaluate.CalcExpr(*k.Expression, kpiValMap)
|
||||
kpiCVal := new(kpi_c_report.KpiCVal)
|
||||
kpiCVal.KPIID = *k.KpiID
|
||||
if err != nil {
|
||||
kpiCVal.Value = 0.0
|
||||
kpiCVal.Err = err.Error()
|
||||
} else {
|
||||
kpiCVal.Value = result
|
||||
}
|
||||
|
||||
report.KpiValues = append(report.KpiValues, *kpiCVal)
|
||||
|
||||
// set KPIC event kpiid and value
|
||||
kpiCEvent[kpiCVal.KPIID] = kpiCVal.Value
|
||||
}
|
||||
|
||||
// KPI自定义指标入库
|
||||
kpi_c_report.InsertKpiCReport(kpiData.NEType, report)
|
||||
|
||||
if neInfo.RmUID == kpiData.RmUid {
|
||||
// 推送到ws订阅组
|
||||
wsService.NewWSSendImpl.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
|
||||
// 推送自定义KPI到ws订阅组
|
||||
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent)
|
||||
if neInfo.NeType == "UPF" {
|
||||
wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent)
|
||||
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent)
|
||||
}
|
||||
}
|
||||
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
}
|
||||
|
||||
// PostGoldKPIFromNF 已废弃
|
||||
// post kpi report from NEs, insert insto gold_kpi table, discard...
|
||||
func PostGoldKPIFromNF(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("PostKPIReportFromNF processing... ")
|
||||
|
||||
vars := mux.Vars(r)
|
||||
apiVer := vars["apiVersion"]
|
||||
if apiVer != global.ApiVersionV1 {
|
||||
log.Error("Uri api version is invalid. apiVersion:", apiVer)
|
||||
services.ResponseNotFound404UriNotExist(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
|
||||
body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
|
||||
if err != nil {
|
||||
log.Error("Faile to io.ReadAll: ", err)
|
||||
services.ResponseNotFound404UriNotExist(w, r)
|
||||
return
|
||||
}
|
||||
log.Trace("Request body:", string(body))
|
||||
kpiReport := new(KpiReport)
|
||||
_ = json.Unmarshal(body, &kpiReport)
|
||||
log.Trace("kpiReport:", kpiReport)
|
||||
|
||||
session := xEngine.NewSession()
|
||||
defer session.Close()
|
||||
goldKpi := new(GoldKpi)
|
||||
layout := time.RFC3339Nano
|
||||
goldKpi.Date = GetDateFromTimeString(layout, kpiReport.Task.Period.StartTime)
|
||||
goldKpi.Index, _ = strconv.Atoi(vars["index"])
|
||||
goldKpi.StartTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.StartTime, time.DateTime)
|
||||
goldKpi.EndTime = global.GetFmtTimeString(layout, kpiReport.Task.Period.EndTime, time.DateTime)
|
||||
// get time granularity from startTime and endTime
|
||||
seconds, _ := global.GetSecondDuration(goldKpi.StartTime, goldKpi.EndTime)
|
||||
goldKpi.Granularity = 60
|
||||
if seconds != 0 && seconds <= math.MaxInt8 && seconds >= math.MinInt8 {
|
||||
goldKpi.Granularity = int8(seconds)
|
||||
}
|
||||
goldKpi.NEName = kpiReport.Task.NE.NEName
|
||||
goldKpi.RmUid = kpiReport.Task.NE.RmUID
|
||||
goldKpi.NEType = kpiReport.Task.NE.NeType
|
||||
goldKpi.Timestamp = global.GetFmtTimeString(layout, kpiReport.Timestamp, time.DateTime)
|
||||
// 黄金指标事件对象
|
||||
kpiEvent := map[string]any{
|
||||
// kip_id ...
|
||||
"neType": goldKpi.NEType,
|
||||
"neName": goldKpi.NEName,
|
||||
"startIndex": goldKpi.Index,
|
||||
"timeGroup": goldKpi.StartTime,
|
||||
}
|
||||
// insert into new kpi_report_xxx table
|
||||
kpiData := new(KpiData)
|
||||
kpiData.Date = goldKpi.Date
|
||||
kpiData.Index = goldKpi.Index
|
||||
//st, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.StartTime, time.Local)
|
||||
//et, _ := time.ParseInLocation(time.RFC3339Nano, kpiReport.Task.Period.EndTime, time.Local)
|
||||
kpiData.StartTime = goldKpi.StartTime
|
||||
kpiData.EndTime = goldKpi.EndTime
|
||||
kpiData.Granularity = goldKpi.Granularity
|
||||
kpiData.NEName = goldKpi.NEName
|
||||
kpiData.NEType = goldKpi.NEType
|
||||
kpiData.RmUid = goldKpi.RmUid
|
||||
kpiVal := new(KPIVal)
|
||||
kpiData.CreatedAt = time.Now().UnixMilli()
|
||||
for _, k := range kpiReport.Task.NE.KPIs {
|
||||
kpiEvent[k.KPIID] = k.Value // kip_id
|
||||
goldKpi.KpiId = k.KPIID
|
||||
goldKpi.Value = k.Value
|
||||
goldKpi.Error = k.Err
|
||||
|
||||
kpiVal.KPIID = k.KPIID
|
||||
kpiVal.Value = int64(k.Value)
|
||||
kpiVal.Err = k.Err
|
||||
kpiData.KPIValues = append(kpiData.KPIValues, *kpiVal)
|
||||
|
||||
//log.Trace("goldKpi:", goldKpi)
|
||||
|
||||
// 启动事务
|
||||
err := session.Begin()
|
||||
if err != nil {
|
||||
log.Error("Failed to Begin gold_kpi:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
gkpi := &GoldKpi{}
|
||||
_, err = session.Where("id = ?", 1).ForUpdate().Get(gkpi)
|
||||
if err != nil {
|
||||
// 回滚事务
|
||||
session.Rollback()
|
||||
log.Error("Failed to ForUpdate gold_kpi:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
affected, err := session.Insert(goldKpi)
|
||||
if err != nil && affected <= 0 {
|
||||
session.Rollback()
|
||||
log.Error("Failed to insert gold_kpi:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
// 提交事务
|
||||
err = session.Commit()
|
||||
if err != nil {
|
||||
log.Error("Failed to Commit gold_kpi:", err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// insert kpi_report table, no session
|
||||
tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType)
|
||||
affected, err := xEngine.Table(tableName).Insert(kpiData)
|
||||
if err != nil && affected <= 0 {
|
||||
log.Errorf("Failed to insert %s:%v", tableName, err)
|
||||
services.ResponseInternalServerError500ProcessError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 推送到ws订阅组
|
||||
wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI, kpiEvent)
|
||||
if goldKpi.NEType == "UPF" {
|
||||
wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_KPI_UPF, kpiEvent)
|
||||
}
|
||||
|
||||
services.ResponseStatusOK204NoContent(w)
|
||||
}
|
||||
|
||||
type MeasureTask struct {
|
||||
Tasks []Task `json:"Tasks"`
|
||||
NotifyUrl string `json:"NotifyUrl"` /* "http://xEngine.xEngine.xEngine.x:xxxx/api/rest/performanceManagement/v1/elementType/smf/objectType/measureReport */
|
||||
|
||||
Reference in New Issue
Block a user