log.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package controller
  2. import (
  3. "net/http"
  4. "strconv"
  5. "time"
  6. "github.com/gin-gonic/gin"
  7. "github.com/labring/aiproxy/core/controller/utils"
  8. "github.com/labring/aiproxy/core/middleware"
  9. "github.com/labring/aiproxy/core/model"
  10. )
  11. func parseCommonParams(c *gin.Context) (params struct {
  12. tokenName string
  13. modelName string
  14. channelID int
  15. tokenID int
  16. order string
  17. requestID string
  18. codeType string
  19. code int
  20. withBody bool
  21. ip string
  22. user string
  23. },
  24. ) {
  25. params.tokenName = c.Query("token_name")
  26. params.modelName = c.Query("model_name")
  27. params.channelID, _ = strconv.Atoi(c.Query("channel"))
  28. params.tokenID, _ = strconv.Atoi(c.Query("token_id"))
  29. params.order = c.Query("order")
  30. params.requestID = c.Query("request_id")
  31. params.codeType = c.Query("code_type")
  32. params.code, _ = strconv.Atoi(c.Query("code"))
  33. params.withBody, _ = strconv.ParseBool(c.Query("with_body"))
  34. params.ip = c.Query("ip")
  35. params.user = c.Query("user")
  36. return
  37. }
  38. // GetLogs godoc
  39. //
  40. // @Summary Get all logs
  41. // @Description Returns a paginated list of all logs with optional filters
  42. // @Tags logs
  43. // @Produce json
  44. // @Security ApiKeyAuth
  45. // @Param page query int false "Page number"
  46. // @Param per_page query int false "Items per page"
  47. // @Param start_timestamp query int false "Start timestamp (milliseconds)"
  48. // @Param end_timestamp query int false "End timestamp (milliseconds)"
  49. // @Param model_name query string false "Model name"
  50. // @Param channel query int false "Channel ID"
  51. // @Param order query string false "Order"
  52. // @Param request_id query string false "Request ID"
  53. // @Param code_type query string false "Status code type"
  54. // @Param code query int false "Status code"
  55. // @Param with_body query bool false "With body"
  56. // @Param ip query string false "IP"
  57. // @Param user query string false "User"
  58. // @Success 200 {object} middleware.APIResponse{data=model.GetLogsResult}
  59. // @Router /api/logs/ [get]
  60. func GetLogs(c *gin.Context) {
  61. page, perPage := utils.ParsePageParams(c)
  62. startTime, endTime := utils.ParseTimeRange(c, 0)
  63. params := parseCommonParams(c)
  64. result, err := model.GetLogs(
  65. startTime,
  66. endTime,
  67. params.modelName,
  68. params.requestID,
  69. params.channelID,
  70. params.order,
  71. model.CodeType(params.codeType),
  72. params.code,
  73. params.withBody,
  74. params.ip,
  75. params.user,
  76. page,
  77. perPage,
  78. )
  79. if err != nil {
  80. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  81. return
  82. }
  83. middleware.SuccessResponse(c, result)
  84. }
  85. // GetGroupLogs godoc
  86. //
  87. // @Summary Get group logs
  88. // @Description Get logs for a specific group
  89. // @Tags log
  90. // @Produce json
  91. // @Security ApiKeyAuth
  92. // @Param group path string true "Group name"
  93. // @Param page query int false "Page number"
  94. // @Param per_page query int false "Items per page"
  95. // @Param start_timestamp query int false "Start timestamp (milliseconds)"
  96. // @Param end_timestamp query int false "End timestamp (milliseconds)"
  97. // @Param token_name query string false "Token name"
  98. // @Param model_name query string false "Model name"
  99. // @Param channel query int false "Channel ID"
  100. // @Param token_id query int false "Token ID"
  101. // @Param order query string false "Order"
  102. // @Param request_id query string false "Request ID"
  103. // @Param code_type query string false "Status code type"
  104. // @Param code query int false "Status code"
  105. // @Param with_body query bool false "With body"
  106. // @Param ip query string false "IP"
  107. // @Param user query string false "User"
  108. // @Success 200 {object} middleware.APIResponse{data=model.GetGroupLogsResult}
  109. // @Router /api/log/{group} [get]
  110. func GetGroupLogs(c *gin.Context) {
  111. group := c.Param("group")
  112. if group == "" {
  113. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid group parameter")
  114. return
  115. }
  116. page, perPage := utils.ParsePageParams(c)
  117. startTime, endTime := utils.ParseTimeRange(c, 0)
  118. params := parseCommonParams(c)
  119. result, err := model.GetGroupLogs(
  120. group,
  121. startTime,
  122. endTime,
  123. params.modelName,
  124. params.requestID,
  125. params.tokenID,
  126. params.tokenName,
  127. params.order,
  128. model.CodeType(params.codeType),
  129. params.code,
  130. params.withBody,
  131. params.ip,
  132. params.user,
  133. page,
  134. perPage,
  135. )
  136. if err != nil {
  137. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  138. return
  139. }
  140. middleware.SuccessResponse(c, result)
  141. }
  142. // SearchLogs godoc
  143. //
  144. // @Summary Search logs
  145. // @Description Search logs with various filters
  146. // @Tags logs
  147. // @Produce json
  148. // @Security ApiKeyAuth
  149. // @Param keyword query string false "Keyword"
  150. // @Param page query int false "Page number"
  151. // @Param per_page query int false "Items per page"
  152. // @Param start_timestamp query int false "Start timestamp (milliseconds)"
  153. // @Param end_timestamp query int false "End timestamp (milliseconds)"
  154. // @Param model_name query string false "Filter by model name"
  155. // @Param channel query int false "Filter by channel"
  156. // @Param token_id query int false "Filter by token id"
  157. // @Param order query string false "Order"
  158. // @Param request_id query string false "Request ID"
  159. // @Param code_type query string false "Status code type"
  160. // @Param code query int false "Status code"
  161. // @Param with_body query bool false "With body"
  162. // @Param ip query string false "IP"
  163. // @Param user query string false "User"
  164. // @Success 200 {object} middleware.APIResponse{data=model.GetLogsResult}
  165. // @Router /api/logs/search [get]
  166. func SearchLogs(c *gin.Context) {
  167. page, perPage := utils.ParsePageParams(c)
  168. startTime, endTime := utils.ParseTimeRange(c, 0)
  169. params := parseCommonParams(c)
  170. keyword := c.Query("keyword")
  171. result, err := model.SearchLogs(
  172. keyword,
  173. params.requestID,
  174. params.tokenID,
  175. params.modelName,
  176. startTime,
  177. endTime,
  178. params.channelID,
  179. params.order,
  180. model.CodeType(params.codeType),
  181. params.code,
  182. params.withBody,
  183. params.ip,
  184. params.user,
  185. page,
  186. perPage,
  187. )
  188. if err != nil {
  189. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  190. return
  191. }
  192. middleware.SuccessResponse(c, result)
  193. }
  194. // SearchGroupLogs godoc
  195. //
  196. // @Summary Search group logs
  197. // @Description Search logs for a specific group with filters
  198. // @Tags log
  199. // @Produce json
  200. // @Security ApiKeyAuth
  201. // @Param group path string true "Group name"
  202. // @Param keyword query string false "Keyword"
  203. // @Param page query int false "Page number"
  204. // @Param per_page query int false "Items per page"
  205. // @Param start_timestamp query int false "Start timestamp (milliseconds)"
  206. // @Param end_timestamp query int false "End timestamp (milliseconds)"
  207. // @Param token_name query string false "Filter by token name"
  208. // @Param model_name query string false "Filter by model name"
  209. // @Param token_id query int false "Filter by token id"
  210. // @Param order query string false "Order"
  211. // @Param request_id query string false "Request ID"
  212. // @Param code_type query string false "Status code type"
  213. // @Param code query int false "Status code"
  214. // @Param with_body query bool false "With body"
  215. // @Param ip query string false "IP"
  216. // @Param user query string false "User"
  217. // @Success 200 {object} middleware.APIResponse{data=model.GetGroupLogsResult}
  218. // @Router /api/log/{group}/search [get]
  219. func SearchGroupLogs(c *gin.Context) {
  220. group := c.Param("group")
  221. if group == "" {
  222. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid group parameter")
  223. return
  224. }
  225. page, perPage := utils.ParsePageParams(c)
  226. startTime, endTime := utils.ParseTimeRange(c, 0)
  227. params := parseCommonParams(c)
  228. keyword := c.Query("keyword")
  229. result, err := model.SearchGroupLogs(
  230. group,
  231. keyword,
  232. params.requestID,
  233. params.tokenID,
  234. params.tokenName,
  235. params.modelName,
  236. startTime,
  237. endTime,
  238. params.order,
  239. model.CodeType(params.codeType),
  240. params.code,
  241. params.withBody,
  242. params.ip,
  243. params.user,
  244. page,
  245. perPage,
  246. )
  247. if err != nil {
  248. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  249. return
  250. }
  251. middleware.SuccessResponse(c, result)
  252. }
  253. // GetLogDetail godoc
  254. //
  255. // @Summary Get log detail
  256. // @Description Get detailed information about a specific log entry
  257. // @Tags logs
  258. // @Produce json
  259. // @Security ApiKeyAuth
  260. // @Param log_id path string true "Log ID"
  261. // @Success 200 {object} middleware.APIResponse{data=model.RequestDetail}
  262. // @Router /api/logs/detail/{log_id} [get]
  263. func GetLogDetail(c *gin.Context) {
  264. logID, _ := strconv.Atoi(c.Param("log_id"))
  265. log, err := model.GetLogDetail(logID)
  266. if err != nil {
  267. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  268. return
  269. }
  270. middleware.SuccessResponse(c, log)
  271. }
  272. // GetGroupLogDetail godoc
  273. //
  274. // @Summary Get group log detail
  275. // @Description Get detailed information about a specific log entry in a group
  276. // @Tags log
  277. // @Produce json
  278. // @Security ApiKeyAuth
  279. // @Param group path string true "Group name"
  280. // @Param log_id path string true "Log ID"
  281. // @Success 200 {object} middleware.APIResponse{data=model.RequestDetail}
  282. // @Router /api/log/{group}/detail/{log_id} [get]
  283. func GetGroupLogDetail(c *gin.Context) {
  284. group := c.Param("group")
  285. if group == "" {
  286. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid group parameter")
  287. return
  288. }
  289. logID, _ := strconv.Atoi(c.Param("log_id"))
  290. log, err := model.GetGroupLogDetail(logID, group)
  291. if err != nil {
  292. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  293. return
  294. }
  295. middleware.SuccessResponse(c, log)
  296. }
  297. // DeleteHistoryLogs godoc
  298. //
  299. // @Summary Delete historical logs
  300. // @Description Deletes logs older than the specified retention period
  301. // @Tags logs
  302. // @Produce json
  303. // @Security ApiKeyAuth
  304. // @Param timestamp query int true "Timestamp (milliseconds)"
  305. // @Success 200 {object} middleware.APIResponse{data=int}
  306. // @Router /api/logs/ [delete]
  307. func DeleteHistoryLogs(c *gin.Context) {
  308. timestamp, _ := strconv.ParseInt(c.Query("timestamp"), 10, 64)
  309. if timestamp == 0 {
  310. middleware.ErrorResponse(c, http.StatusBadRequest, "timestamp is required")
  311. return
  312. }
  313. count, err := model.DeleteOldLog(time.UnixMilli(timestamp))
  314. if err != nil {
  315. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  316. return
  317. }
  318. middleware.SuccessResponse(c, count)
  319. }
  320. // SearchConsumeError godoc
  321. //
  322. // @Summary Search consumption errors
  323. // @Description Search for logs with consumption errors
  324. // @Tags logs
  325. // @Produce json
  326. // @Security ApiKeyAuth
  327. // @Param page query int false "Page number"
  328. // @Param per_page query int false "Items per page"
  329. // @Param start_timestamp query int false "Start timestamp (milliseconds)"
  330. // @Param end_timestamp query int false "End timestamp (milliseconds)"
  331. // @Param keyword query string false "Keyword"
  332. // @Param group query string false "Group"
  333. // @Param token_name query string false "Token name"
  334. // @Param model_name query string false "Model name"
  335. // @Param content query string false "Content"
  336. // @Param token_id query int false "Token ID"
  337. // @Param order query string false "Order"
  338. // @Param request_id query string false "Request ID"
  339. // @Success 200 {object} middleware.APIResponse{data=map[string]any{logs=[]model.RequestDetail,total=int}}
  340. // @Router /api/logs/consume_error [get]
  341. func SearchConsumeError(c *gin.Context) {
  342. keyword := c.Query("keyword")
  343. group := c.Query("group")
  344. tokenName := c.Query("token_name")
  345. modelName := c.Query("model_name")
  346. tokenID, _ := strconv.Atoi(c.Query("token_id"))
  347. page, perPage := utils.ParsePageParams(c)
  348. order := c.Query("order")
  349. requestID := c.Query("request_id")
  350. logs, total, err := model.SearchConsumeError(
  351. keyword,
  352. requestID,
  353. group,
  354. tokenName,
  355. modelName,
  356. tokenID,
  357. page,
  358. perPage,
  359. order,
  360. )
  361. if err != nil {
  362. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  363. return
  364. }
  365. middleware.SuccessResponse(c, gin.H{
  366. "logs": logs,
  367. "total": total,
  368. })
  369. }