Go CLI: add admin stats commands (#17090)

### Summary

```
RAGFlow(admin)> STATS USERS TOP 5 FROM '2026-01-01' TO '2026-02-01';
+-----------------------+----------------------------------------------+------------+---------------------+-----+
| command               | error                                        | from_date  | to_date             | top |
+-----------------------+----------------------------------------------+------------+---------------------+-----+
| get_token_users_stats | 'Get API token users stats' is not supported | 2026-01-01 | 2026-02-01 23:59:59 | 5   |
+-----------------------+----------------------------------------------+------------+---------------------+-----+
RAGFlow(admin)> STATS USER 'aaa@aaa.com' FROM '2026-01-01' TO '2026-02-01' MONTH;
+-----------------+----------------------------------------+------------+-------------+---------------------+-------------+
| command         | error                                  | from_date  | granularity | to_date             | user_name   |
+-----------------+----------------------------------------+------------+-------------+---------------------+-------------+
| get_token_stats | 'Get API token stats' is not supported | 2026-01-01 | month       | 2026-02-01 23:59:59 | aaa@aaa.com |
+-----------------+----------------------------------------+------------+-------------+---------------------+-------------+
RAGFlow(admin)> STATS SUMMARY FROM '2026-01-01' TO '2026-02-01' MONTH;
+-----------+------------------------------------------------+
| field     | value                                          |
+-----------+------------------------------------------------+
| to_date   | 2026-02-01 23:59:59                            |
| command   | get_token_stats_summary                        |
| error     | 'Get API token stats summary' is not supported |
| from_date | 2026-01-01                                     |
+-----------+------------------------------------------------+
```

---------

Signed-off-by: Jin Hai <haijin.chn@gmail.com>
This commit is contained in:
Jin Hai
2026-07-20 14:24:28 +08:00
committed by GitHub
parent 27b6cd1a65
commit 7ad27adecb
9 changed files with 383 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ package cli
import (
"encoding/json"
"fmt"
"net/url"
"ragflow/internal/common"
)
@@ -1733,6 +1734,102 @@ func (c *CLI) AdminShowUsersPlanQuotaCommand(cmd *Command) (ResponseIf, error) {
return HandleCommonDataResponse(resp, "get users plan quota")
}
// AdminStatsUserCommand stats user token usage
func (c *CLI) AdminStatsUserCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != AdminMode || c.AdminServerClient.LoginToken == nil {
return nil, fmt.Errorf("this command is only allowed in ADMIN mode or already login")
}
userName, ok := cmd.Params["user_name"].(string)
if !ok {
return nil, fmt.Errorf("user name not provided")
}
fromTime, _ := cmd.Params["from"].(string)
toTime, _ := cmd.Params["to"].(string)
granularity, ok := cmd.Params["granularity"].(string)
if !ok {
return nil, fmt.Errorf("granularity not provided")
}
q := url.Values{}
q.Set("user_name", userName)
if fromTime != "" {
q.Set("from", fromTime)
}
if toTime != "" {
q.Set("to", toTime)
}
q.Set("granularity", granularity)
baseUrl := fmt.Sprintf("/admin/stats/token?%s", q.Encode())
resp, err := c.AdminServerClient.Request("GET", baseUrl, "admin", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to get stats user: %w", err)
}
return HandleCommonResponse(resp, "get stats user")
}
// AdminStatsUsersCommand stats users token usage
func (c *CLI) AdminStatsUsersCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != AdminMode || c.AdminServerClient.LoginToken == nil {
return nil, fmt.Errorf("this command is only allowed in ADMIN mode or already login")
}
top, ok := cmd.Params["top"].(int)
if !ok {
return nil, fmt.Errorf("top not provided")
}
fromTime, _ := cmd.Params["from"].(string)
toTime, _ := cmd.Params["to"].(string)
q := url.Values{}
q.Set("top", fmt.Sprintf("%d", top))
if fromTime != "" {
q.Set("from", fromTime)
}
if toTime != "" {
q.Set("to", toTime)
}
url := fmt.Sprintf("/admin/stats/token/users?%s", q.Encode())
resp, err := c.AdminServerClient.Request("GET", url, "web", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to get stats: %w", err)
}
return HandleCommonResponse(resp, "get stats")
}
// AdminStatsSummaryCommand stats summary token usage
func (c *CLI) AdminStatsSummaryCommand(cmd *Command) (ResponseIf, error) {
if c.Config.CLIMode != AdminMode || c.AdminServerClient.LoginToken == nil {
return nil, fmt.Errorf("this command is only allowed in ADMIN mode or already login")
}
fromTime, _ := cmd.Params["from"].(string)
toTime, _ := cmd.Params["to"].(string)
q := url.Values{}
if fromTime != "" {
q.Set("from", fromTime)
}
if toTime != "" {
q.Set("to", toTime)
}
baseUrl := fmt.Sprintf("/admin/stats/token/summary?%s", q.Encode())
resp, err := c.AdminServerClient.Request("GET", baseUrl, "admin", nil, nil)
if err != nil {
return nil, fmt.Errorf("failed to get stats summary: %w", err)
}
return HandleCommonDataResponse(resp, "get stats summary")
}
// ListUsers lists all users (admin mode only)
// Returns (result_map, error) - result_map is non-nil for benchmark mode
func (c *CLI) AdminListUsersCommand(cmd *Command) (ResponseIf, error) {