perf_metric.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package model
  2. import (
  3. "time"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/clause"
  6. )
  7. // PerfMetric stores aggregated relay performance metrics for the model square.
  8. type PerfMetric struct {
  9. Id int `json:"id" gorm:"primaryKey"`
  10. ModelName string `json:"model_name" gorm:"size:128;uniqueIndex:idx_perf_model_group_bucket,priority:1"`
  11. Group string `json:"group" gorm:"column:group;size:64;uniqueIndex:idx_perf_model_group_bucket,priority:2"`
  12. BucketTs int64 `json:"bucket_ts" gorm:"uniqueIndex:idx_perf_model_group_bucket,priority:3;index:idx_perf_bucket_ts"`
  13. RequestCount int64 `json:"request_count" gorm:"default:0"`
  14. SuccessCount int64 `json:"success_count" gorm:"default:0"`
  15. TotalLatencyMs int64 `json:"total_latency_ms" gorm:"default:0"`
  16. TtftSumMs int64 `json:"ttft_sum_ms" gorm:"default:0"`
  17. TtftCount int64 `json:"ttft_count" gorm:"default:0"`
  18. }
  19. func (PerfMetric) TableName() string {
  20. return "perf_metrics"
  21. }
  22. func UpsertPerfMetric(metric *PerfMetric) error {
  23. if metric == nil || metric.RequestCount == 0 {
  24. return nil
  25. }
  26. return DB.Clauses(clause.OnConflict{
  27. Columns: []clause.Column{
  28. {Name: "model_name"},
  29. {Name: "group"},
  30. {Name: "bucket_ts"},
  31. },
  32. DoUpdates: clause.Assignments(map[string]interface{}{
  33. "request_count": gorm.Expr("request_count + ?", metric.RequestCount),
  34. "success_count": gorm.Expr("success_count + ?", metric.SuccessCount),
  35. "total_latency_ms": gorm.Expr("total_latency_ms + ?", metric.TotalLatencyMs),
  36. "ttft_sum_ms": gorm.Expr("ttft_sum_ms + ?", metric.TtftSumMs),
  37. "ttft_count": gorm.Expr("ttft_count + ?", metric.TtftCount),
  38. }),
  39. }).Create(metric).Error
  40. }
  41. func GetPerfMetrics(modelName string, group string, startTs int64, endTs int64) ([]PerfMetric, error) {
  42. var metrics []PerfMetric
  43. query := DB.Model(&PerfMetric{}).
  44. Where("model_name = ? AND bucket_ts >= ? AND bucket_ts <= ?", modelName, startTs, endTs)
  45. if group != "" {
  46. query = query.Where(commonGroupCol+" = ?", group)
  47. }
  48. err := query.Order("bucket_ts ASC").Find(&metrics).Error
  49. return metrics, err
  50. }
  51. func DeletePerfMetricsBefore(cutoffTs int64) error {
  52. if cutoffTs <= 0 {
  53. return nil
  54. }
  55. return DB.Where("bucket_ts < ?", cutoffTs).Delete(&PerfMetric{}).Error
  56. }
  57. func PerfMetricStartTime(hours int) int64 {
  58. if hours <= 0 {
  59. hours = 24
  60. }
  61. return time.Now().Add(-time.Duration(hours) * time.Hour).Unix()
  62. }