feat: 新增ue事件日志上报接口
This commit is contained in:
@@ -2,26 +2,35 @@ package event
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"be.ems/lib/core/utils/ctx"
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
"be.ems/lib/global"
|
"be.ems/lib/global"
|
||||||
"be.ems/lib/log"
|
"be.ems/lib/log"
|
||||||
"be.ems/lib/services"
|
"be.ems/lib/services"
|
||||||
|
"be.ems/restagent/config"
|
||||||
wsService "be.ems/src/modules/ws/service"
|
wsService "be.ems/src/modules/ws/service"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
UriUEEvent = "/upload-ue/v1/:eventType"
|
// 走Gin
|
||||||
|
UriUEEventAMF = "/upload-ue/v1/:eventType"
|
||||||
|
// 走Mux
|
||||||
|
UriUEEvent = config.DefaultUriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent"
|
||||||
|
CustomUriUEEvent = config.UriPrefix + "/logManagement/v1/elementType/{elementTypeValue}/objectType/ueEvent"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UEEvent struct {
|
type UEEvent struct {
|
||||||
NeType string `json:"neType" xorm:"ne_type"`
|
NeType string `json:"neType" xorm:"ne_type"`
|
||||||
NeName string `json:"neName" xorm:"ne_name"`
|
NeName string `json:"neName" xorm:"ne_name"`
|
||||||
RmUID string `json:"rmUID" xorm:"rm_uid"`
|
RmUID string `json:"rmUID" xorm:"rm_uid"`
|
||||||
Timestamp int `json:"timestamp" xorm:"timestamp"`
|
Timestamp int64 `json:"timestamp" xorm:"timestamp"`
|
||||||
EventType string `json:"eventType" xorm:"event_type"`
|
EventType string `json:"eventType" xorm:"event_type"`
|
||||||
EventJson map[string]any `json:"eventJSON" xorm:"event_json"`
|
EventJson map[string]any `json:"eventJSON" xorm:"event_json"`
|
||||||
}
|
}
|
||||||
@@ -51,13 +60,13 @@ func PostUEEventFromAMF(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
ueEvent.NeType = "AMF"
|
ueEvent.NeType = "AMF"
|
||||||
ueEvent.Timestamp = int(time.Now().Unix())
|
ueEvent.Timestamp = time.Now().Unix()
|
||||||
ueEvent.EventType = eventType
|
ueEvent.EventType = eventType
|
||||||
log.Trace("ueEvent:", ueEvent)
|
log.Trace("ueEvent AMF:", ueEvent)
|
||||||
|
|
||||||
affected, err := dborm.XormInsertTableOne("ue_event", ueEvent)
|
affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent)
|
||||||
if err != nil && affected <= 0 {
|
if err != nil && affected <= 0 {
|
||||||
log.Error("Failed to insert ue_event:", err)
|
log.Error("Failed to insert ue_event_amf:", err)
|
||||||
services.ResponseInternalServerError500ProcessError(c.Writer, err)
|
services.ResponseInternalServerError500ProcessError(c.Writer, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -67,3 +76,32 @@ func PostUEEventFromAMF(c *gin.Context) {
|
|||||||
|
|
||||||
services.ResponseStatusOK204NoContent(c.Writer)
|
services.ResponseStatusOK204NoContent(c.Writer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PostUEEvent(w http.ResponseWriter, r *http.Request) {
|
||||||
|
log.Info("PostUEEvent processing... ")
|
||||||
|
|
||||||
|
neType := ctx.GetParam(r, "elementTypeValue")
|
||||||
|
ueEvent := new(UEEvent)
|
||||||
|
if err := ctx.ShouldBindJSON(r, &ueEvent.EventJson); err != nil {
|
||||||
|
services.ResponseInternalServerError500ProcessError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ueEvent.NeType = strings.ToUpper(neType)
|
||||||
|
ueEvent.Timestamp = time.Now().Unix()
|
||||||
|
|
||||||
|
tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType))
|
||||||
|
affected, err := dborm.XormInsertTableOne(tableName, ueEvent)
|
||||||
|
if err != nil && affected <= 0 {
|
||||||
|
log.Error("Failed to insert "+tableName, err)
|
||||||
|
services.ResponseInternalServerError500ProcessError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 推送到ws订阅组
|
||||||
|
if ueEvent.NeType == "MME" {
|
||||||
|
wsService.NewWSSendImpl.ByGroupID(wsService.GROUP_MME_UE, ueEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
services.ResponseStatusOK204NoContent(w)
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"be.ems/features/cdr"
|
"be.ems/features/cdr"
|
||||||
"be.ems/features/cm"
|
"be.ems/features/cm"
|
||||||
"be.ems/features/dbrest"
|
"be.ems/features/dbrest"
|
||||||
|
"be.ems/features/event"
|
||||||
"be.ems/features/file"
|
"be.ems/features/file"
|
||||||
"be.ems/features/fm"
|
"be.ems/features/fm"
|
||||||
"be.ems/features/lm"
|
"be.ems/features/lm"
|
||||||
@@ -289,6 +290,9 @@ func init() {
|
|||||||
Register("POST", cdr.UriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
Register("POST", cdr.UriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
||||||
Register("POST", cdr.CustomUriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
Register("POST", cdr.CustomUriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
||||||
|
|
||||||
|
// UE event 上报的UE事件
|
||||||
|
Register("POST", event.UriUEEvent, event.PostUEEvent, nil)
|
||||||
|
|
||||||
// UE event AMF上报的UE事件, 无前缀给到Gin处理
|
// UE event AMF上报的UE事件, 无前缀给到Gin处理
|
||||||
//Register("POST", event.UriUEEvent, event.PostUEEventFromAMF, nil)
|
//Register("POST", event.UriUEEvent, event.PostUEEventFromAMF, nil)
|
||||||
|
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ func main() {
|
|||||||
uriGroup := app.Group(config.UriPrefix)
|
uriGroup := app.Group(config.UriPrefix)
|
||||||
uriGroup.Any("/*any", gin.WrapH(routes.NewRouter()))
|
uriGroup.Any("/*any", gin.WrapH(routes.NewRouter()))
|
||||||
// AMF上报的UE事件, 无前缀,暂时特殊处理
|
// AMF上报的UE事件, 无前缀,暂时特殊处理
|
||||||
app.POST(event.UriUEEvent, event.PostUEEventFromAMF)
|
app.POST(event.UriUEEventAMF, event.PostUEEventFromAMF)
|
||||||
|
|
||||||
var listenLocalhost bool = false
|
var listenLocalhost bool = false
|
||||||
for _, rest := range conf.Rest {
|
for _, rest := range conf.Rest {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ var URL_WHITE_LIST = []string{
|
|||||||
"/systemState",
|
"/systemState",
|
||||||
"/omcNeConfig",
|
"/omcNeConfig",
|
||||||
"/cdrEvent",
|
"/cdrEvent",
|
||||||
|
"/ueEvent",
|
||||||
"/upload-ue",
|
"/upload-ue",
|
||||||
"/oauth/token",
|
"/oauth/token",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ import (
|
|||||||
// GetUEConnectByAMF 获取UE会话事件-AMF
|
// GetUEConnectByAMF 获取UE会话事件-AMF
|
||||||
func GetUEConnectByAMF(requestID string, data any) ([]byte, error) {
|
func GetUEConnectByAMF(requestID string, data any) ([]byte, error) {
|
||||||
msgByte, _ := json.Marshal(data)
|
msgByte, _ := json.Marshal(data)
|
||||||
var query neDataModel.UEEventQuery
|
var query neDataModel.UEEventAMFQuery
|
||||||
err := json.Unmarshal(msgByte, &query)
|
err := json.Unmarshal(msgByte, &query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warnf("ws processor GetUEConnect err: %s", err.Error())
|
logger.Warnf("ws processor GetUEConnect err: %s", err.Error())
|
||||||
return nil, fmt.Errorf("query data structure error")
|
return nil, fmt.Errorf("query data structure error")
|
||||||
}
|
}
|
||||||
|
|
||||||
dataMap := neDataService.NewUEEventImpl.SelectPage(query)
|
dataMap := neDataService.NewUEEventAMFImpl.SelectPage(query)
|
||||||
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
resultByte, err := json.Marshal(result.Ok(map[string]any{
|
||||||
"requestId": requestID,
|
"requestId": requestID,
|
||||||
"data": dataMap,
|
"data": dataMap,
|
||||||
|
|||||||
Reference in New Issue
Block a user