retrylog.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package model
  2. import (
  3. "time"
  4. "github.com/bytedance/sonic"
  5. "github.com/labring/aiproxy/core/common"
  6. "github.com/labring/aiproxy/core/common/config"
  7. "gorm.io/gorm"
  8. )
  9. type RetryLog struct {
  10. RequestBody string `gorm:"type:text" json:"request_body,omitempty"`
  11. ResponseBody string `gorm:"type:text" json:"response_body,omitempty"`
  12. RequestBodyTruncated bool ` json:"request_body_truncated,omitempty"`
  13. ResponseBodyTruncated bool ` json:"response_body_truncated,omitempty"`
  14. RequestAt time.Time ` json:"request_at"`
  15. RetryAt time.Time ` json:"retry_at,omitempty"`
  16. TTFBMilliseconds ZeroNullInt64 ` json:"ttfb_milliseconds,omitempty"`
  17. CreatedAt time.Time `gorm:"autoCreateTime;index" json:"created_at"`
  18. Model string `gorm:"size:64" json:"model"`
  19. RequestID EmptyNullString `gorm:"type:char(16);index:,where:request_id is not null" json:"request_id"`
  20. ID int `gorm:"primaryKey" json:"id"`
  21. ChannelID int ` json:"channel,omitempty"`
  22. Code int `gorm:"index" json:"code,omitempty"`
  23. Mode int ` json:"mode,omitempty"`
  24. RetryTimes ZeroNullInt64 ` json:"retry_times,omitempty"`
  25. }
  26. func (r *RetryLog) BeforeSave(_ *gorm.DB) (err error) {
  27. if reqMax := config.GetLogDetailRequestBodyMaxSize(); reqMax > 0 &&
  28. int64(len(r.RequestBody)) > reqMax {
  29. r.RequestBody = common.TruncateByRune(r.RequestBody, int(reqMax)) + "..."
  30. r.RequestBodyTruncated = true
  31. }
  32. if respMax := config.GetLogDetailResponseBodyMaxSize(); respMax > 0 &&
  33. int64(len(r.ResponseBody)) > respMax {
  34. r.ResponseBody = common.TruncateByRune(r.ResponseBody, int(respMax)) + "..."
  35. r.ResponseBodyTruncated = true
  36. }
  37. return
  38. }
  39. func (r *RetryLog) MarshalJSON() ([]byte, error) {
  40. type Alias RetryLog
  41. a := &struct {
  42. *Alias
  43. CreatedAt int64 `json:"created_at"`
  44. RequestAt int64 `json:"request_at"`
  45. RetryAt int64 `json:"retry_at,omitempty"`
  46. }{
  47. Alias: (*Alias)(r),
  48. CreatedAt: r.CreatedAt.UnixMilli(),
  49. RequestAt: r.RequestAt.UnixMilli(),
  50. }
  51. if !r.RetryAt.IsZero() {
  52. a.RetryAt = r.RetryAt.UnixMilli()
  53. }
  54. return sonic.Marshal(a)
  55. }
  56. func RecordRetryLog(
  57. requestID string,
  58. createAt time.Time,
  59. requestAt time.Time,
  60. retryAt time.Time,
  61. firstByteAt time.Time,
  62. code int,
  63. channelID int,
  64. modelName string,
  65. mode int,
  66. retryTimes int,
  67. requestDetail *RequestDetail,
  68. ) error {
  69. if createAt.IsZero() {
  70. createAt = time.Now()
  71. }
  72. if requestAt.IsZero() {
  73. requestAt = createAt
  74. }
  75. if firstByteAt.IsZero() || firstByteAt.Before(requestAt) {
  76. firstByteAt = requestAt
  77. }
  78. log := &RetryLog{
  79. RequestID: EmptyNullString(requestID),
  80. RequestAt: requestAt,
  81. CreatedAt: createAt,
  82. RetryAt: retryAt,
  83. TTFBMilliseconds: ZeroNullInt64(firstByteAt.Sub(requestAt).Milliseconds()),
  84. Code: code,
  85. Model: modelName,
  86. Mode: mode,
  87. ChannelID: channelID,
  88. RetryTimes: ZeroNullInt64(retryTimes),
  89. RequestBody: requestDetail.RequestBody,
  90. ResponseBody: requestDetail.ResponseBody,
  91. }
  92. return LogDB.Create(log).Error
  93. }