Skip to content

Commit

Permalink
feat: dashboard rpm
Browse files Browse the repository at this point in the history
  • Loading branch information
zijiren233 committed Dec 27, 2024
1 parent 5a3e407 commit aae76b9
Show file tree
Hide file tree
Showing 7 changed files with 356 additions and 385 deletions.
34 changes: 25 additions & 9 deletions service/aiproxy/controller/dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,10 @@ import (
"github.com/labring/sealos/service/aiproxy/model"
)

func GetGroupDashboard(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
return
}

func getDashboardStartEndTime(t string) (time.Time, time.Time) {
end := time.Now()
var start time.Time
switch c.Query("type") {
switch t {
case "month":
start = end.AddDate(0, 0, -30)
case "two_week":
Expand All @@ -30,10 +24,32 @@ func GetGroupDashboard(c *gin.Context) {
default:
start = end.AddDate(0, 0, -1)
}
return start, end
}

func GetDashboard(c *gin.Context) {
start, end := getDashboardStartEndTime(c.Query("type"))
modelName := c.Query("model")
dashboards, err := model.GetDashboardData(start, end, modelName)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
middleware.SuccessResponse(c, dashboards)
}

func GetGroupDashboard(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
return
}

start, end := getDashboardStartEndTime(c.Query("type"))
tokenName := c.Query("token_name")
modelName := c.Query("model")

dashboards, err := model.GetDashboardData(group, start, end, tokenName, modelName)
dashboards, err := model.GetGroupDashboardData(group, start, end, tokenName, modelName)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, "failed to get statistics")
return
Expand Down
16 changes: 10 additions & 6 deletions service/aiproxy/controller/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,20 +193,24 @@ func DeleteGroups(c *gin.Context) {
}

type CreateGroupRequest struct {
ID string `json:"id"`
RPMRatio float64 `json:"rpm_ratio"`
}

func CreateGroup(c *gin.Context) {
var group CreateGroupRequest
err := json.NewDecoder(c.Request.Body).Decode(&group)
if err != nil || group.ID == "" {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
return
}
req := CreateGroupRequest{}
err := json.NewDecoder(c.Request.Body).Decode(&req)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
return
}
if err := model.CreateGroup(&model.Group{
ID: group.ID,
RPMRatio: group.RPMRatio,
ID: group,
RPMRatio: req.RPMRatio,
}); err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
Expand Down
20 changes: 14 additions & 6 deletions service/aiproxy/controller/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ func GetLogs(c *gin.Context) {
codeType := c.Query("code_type")
withBody, _ := strconv.ParseBool(c.Query("with_body"))
result, err := model.GetLogs(
group,
startTimestampTime,
endTimestampTime,
modelName,
group,
requestID,
tokenID,
tokenName,
Expand All @@ -68,6 +68,11 @@ func GetLogs(c *gin.Context) {
}

func GetGroupLogs(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "group is required")
return
}
p, _ := strconv.Atoi(c.Query("p"))
p--
if p < 0 {
Expand All @@ -92,7 +97,6 @@ func GetGroupLogs(c *gin.Context) {
tokenName := c.Query("token_name")
modelName := c.Query("model_name")
channelID, _ := strconv.Atoi(c.Query("channel"))
group := c.Param("group")
endpoint := c.Query("endpoint")
tokenID, _ := strconv.Atoi(c.Query("token_id"))
order := c.Query("order")
Expand Down Expand Up @@ -136,7 +140,7 @@ func SearchLogs(c *gin.Context) {
endpoint := c.Query("endpoint")
tokenName := c.Query("token_name")
modelName := c.Query("model_name")
groupID := c.Query("group_id")
group := c.Query("group_id")
tokenID, _ := strconv.Atoi(c.Query("token_id"))
channelID, _ := strconv.Atoi(c.Query("channel"))
startTimestamp, _ := strconv.ParseInt(c.Query("start_timestamp"), 10, 64)
Expand All @@ -155,11 +159,11 @@ func SearchLogs(c *gin.Context) {
codeType := c.Query("code_type")
withBody, _ := strconv.ParseBool(c.Query("with_body"))
result, err := model.SearchLogs(
group,
keyword,
p,
perPage,
endpoint,
groupID,
requestID,
tokenID,
tokenName,
Expand All @@ -180,6 +184,11 @@ func SearchLogs(c *gin.Context) {
}

func SearchGroupLogs(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "group is required")
return
}
keyword := c.Query("keyword")
p, _ := strconv.Atoi(c.Query("p"))
perPage, _ := strconv.Atoi(c.Query("per_page"))
Expand All @@ -188,7 +197,6 @@ func SearchGroupLogs(c *gin.Context) {
} else if perPage > 100 {
perPage = 100
}
group := c.Param("group")
endpoint := c.Query("endpoint")
tokenName := c.Query("token_name")
modelName := c.Query("model_name")
Expand Down Expand Up @@ -251,7 +259,7 @@ func GetGroupLogDetail(c *gin.Context) {
return
}
logID, _ := strconv.Atoi(c.Param("log_id"))
log, err := model.GetGroupLogDetail(group, logID)
log, err := model.GetGroupLogDetail(logID, group)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
Expand Down
70 changes: 40 additions & 30 deletions service/aiproxy/controller/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ func GetTokens(c *gin.Context) {
group := c.Query("group")
order := c.Query("order")
status, _ := strconv.Atoi(c.Query("status"))
tokens, total, err := model.GetTokens(p*perPage, perPage, order, group, status)
tokens, total, err := model.GetTokens(group, p*perPage, perPage, order, status)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
Expand All @@ -70,6 +70,11 @@ func GetTokens(c *gin.Context) {
}

func GetGroupTokens(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "group is required")
return
}
p, _ := strconv.Atoi(c.Query("p"))
p--
if p < 0 {
Expand All @@ -81,17 +86,16 @@ func GetGroupTokens(c *gin.Context) {
} else if perPage > 100 {
perPage = 100
}
group := c.Param("group")
order := c.Query("order")
status, _ := strconv.Atoi(c.Query("status"))
tokens, total, err := model.GetGroupTokens(group, p*perPage, perPage, order, status)
tokens, total, err := model.GetTokens(group, p*perPage, perPage, order, status)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
tokenResponses := make([]*TokenResponse, len(tokens))
for i, token := range tokens {
lastRequestAt, _ := model.GetGroupTokenLastRequestTime(group, token.ID)
lastRequestAt, _ := model.GetTokenLastRequestTime(token.ID)
tokenResponses[i] = &TokenResponse{
Token: token,
AccessedAt: lastRequestAt,
Expand Down Expand Up @@ -121,7 +125,7 @@ func SearchTokens(c *gin.Context) {
key := c.Query("key")
status, _ := strconv.Atoi(c.Query("status"))
group := c.Query("group")
tokens, total, err := model.SearchTokens(keyword, p*perPage, perPage, order, status, name, key, group)
tokens, total, err := model.SearchTokens(group, keyword, p*perPage, perPage, order, status, name, key)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
Expand All @@ -141,6 +145,11 @@ func SearchTokens(c *gin.Context) {
}

func SearchGroupTokens(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "group is required")
return
}
keyword := c.Query("keyword")
p, _ := strconv.Atoi(c.Query("p"))
p--
Expand All @@ -153,19 +162,18 @@ func SearchGroupTokens(c *gin.Context) {
} else if perPage > 100 {
perPage = 100
}
group := c.Param("group")
order := c.Query("order")
name := c.Query("name")
key := c.Query("key")
status, _ := strconv.Atoi(c.Query("status"))
tokens, total, err := model.SearchGroupTokens(group, keyword, p*perPage, perPage, order, status, name, key)
tokens, total, err := model.SearchTokens(group, keyword, p*perPage, perPage, order, status, name, key)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
tokenResponses := make([]*TokenResponse, len(tokens))
for i, token := range tokens {
lastRequestAt, _ := model.GetGroupTokenLastRequestTime(group, token.ID)
lastRequestAt, _ := model.GetTokenLastRequestTime(token.ID)
tokenResponses[i] = &TokenResponse{
Token: token,
AccessedAt: lastRequestAt,
Expand Down Expand Up @@ -197,18 +205,22 @@ func GetToken(c *gin.Context) {
}

func GetGroupToken(c *gin.Context) {
group := c.Param("group")
if group == "" {
middleware.ErrorResponse(c, http.StatusOK, "group is required")
return
}
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
group := c.Param("group")
token, err := model.GetGroupTokenByID(group, id)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
lastRequestAt, _ := model.GetGroupTokenLastRequestTime(group, id)
lastRequestAt, _ := model.GetTokenLastRequestTime(id)
tokenResponse := &TokenResponse{
Token: token,
AccessedAt: lastRequestAt,
Expand Down Expand Up @@ -444,20 +456,14 @@ func UpdateTokenStatus(c *gin.Context) {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}

if token.Status == model.TokenStatusEnabled {
if cleanToken.Status == model.TokenStatusExpired && !cleanToken.ExpiredAt.IsZero() && cleanToken.ExpiredAt.Before(time.Now()) {
middleware.ErrorResponse(c, http.StatusOK, "token expired, please update token expired time or set to never expire")
return
}
if cleanToken.Status == model.TokenStatusExhausted && cleanToken.Quota > 0 && cleanToken.UsedAmount >= cleanToken.Quota {
middleware.ErrorResponse(c, http.StatusOK, "token quota exhausted, please update token quota or set to unlimited quota")
return
}
if cleanToken.Status == model.TokenStatusExhausted && cleanToken.Quota > 0 && cleanToken.UsedAmount >= cleanToken.Quota {
middleware.ErrorResponse(c, http.StatusOK, "token quota exhausted, please update token quota or set to unlimited quota")
if err := validateTokenStatus(cleanToken); err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
}

err = model.UpdateTokenStatus(id, token.Status)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
Expand Down Expand Up @@ -488,20 +494,14 @@ func UpdateGroupTokenStatus(c *gin.Context) {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}

if token.Status == model.TokenStatusEnabled {
if cleanToken.Status == model.TokenStatusExpired && !cleanToken.ExpiredAt.IsZero() && cleanToken.ExpiredAt.Before(time.Now()) {
middleware.ErrorResponse(c, http.StatusOK, "token expired, please update token expired time or set to never expire")
return
}
if cleanToken.Status == model.TokenStatusExhausted && cleanToken.Quota > 0 && cleanToken.UsedAmount >= cleanToken.Quota {
middleware.ErrorResponse(c, http.StatusOK, "token quota exhausted, please update token quota or set to unlimited quota")
return
}
if cleanToken.Status == model.TokenStatusExhausted && cleanToken.Quota > 0 && cleanToken.UsedAmount >= cleanToken.Quota {
middleware.ErrorResponse(c, http.StatusOK, "token quota exhausted, please update token quota or set to unlimited quota")
if err := validateTokenStatus(cleanToken); err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
return
}
}

err = model.UpdateGroupTokenStatus(group, id, token.Status)
if err != nil {
middleware.ErrorResponse(c, http.StatusOK, err.Error())
Expand All @@ -510,6 +510,16 @@ func UpdateGroupTokenStatus(c *gin.Context) {
middleware.SuccessResponse(c, nil)
}

func validateTokenStatus(token *model.Token) error {
if token.Status == model.TokenStatusExpired && !token.ExpiredAt.IsZero() && token.ExpiredAt.Before(time.Now()) {
return errors.New("token expired, please update token expired time or set to never expire")
}
if token.Status == model.TokenStatusExhausted && token.Quota > 0 && token.UsedAmount >= token.Quota {
return errors.New("token quota exhausted, please update token quota or set to unlimited quota")
}
return nil
}

type UpdateTokenNameRequest struct {
Name string `json:"name"`
}
Expand Down
Loading

0 comments on commit aae76b9

Please sign in to comment.