You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudbrain_statistic.go 7.7 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package repo
  2. import (
  3. "strings"
  4. "time"
  5. "code.gitea.io/gitea/models"
  6. "code.gitea.io/gitea/modules/log"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. )
  9. func CloudbrainDurationStatisticHour() {
  10. dateTime := time.Now().Format("2006-01-02 15:04:05")
  11. dayTime := time.Now().Format("2006-01-02")
  12. now := time.Now()
  13. currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
  14. m, _ := time.ParseDuration("-1h")
  15. beginTime := currentTime.Add(m).Unix()
  16. endTime := currentTime.Unix()
  17. hourTime := currentTime.Add(m).Hour()
  18. ciTasks, err := models.GetCloudbrainByTime(beginTime, endTime)
  19. if err != nil {
  20. log.Info("GetCloudbrainByTime err: %v", err)
  21. return
  22. }
  23. specMap := make(map[string]*models.Specification)
  24. models.LoadSpecs4CloudbrainInfo(ciTasks)
  25. for _, cloudbrain := range ciTasks {
  26. if _, ok := specMap[cloudbrain.Cloudbrain.Spec.AiCenterCode+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  27. if cloudbrain.Cloudbrain.Spec != nil {
  28. specMap[cloudbrain.Cloudbrain.Spec.AiCenterCode+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = cloudbrain.Cloudbrain.Spec
  29. }
  30. }
  31. }
  32. cloudBrainCenterCodeAndCardTypeInfo := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime)
  33. resourceQueues, err := models.GetCanUseCardInfo()
  34. if err != nil {
  35. log.Info("GetCanUseCardInfo err: %v", err)
  36. return
  37. }
  38. cardsTotalDurationMap := make(map[string]int)
  39. for _, resourceQueue := range resourceQueues {
  40. cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterName+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType+"/"+resourceQueue.ComputeResource] = resourceQueue.CardsTotalNum * 1 * 60 * 60
  41. }
  42. for centerCode, CardTypeInfo := range cloudBrainCenterCodeAndCardTypeInfo {
  43. for cardType, cardDuration := range CardTypeInfo {
  44. spec := specMap[centerCode+"/"+cardType]
  45. if spec != nil {
  46. if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, centerCode, cardType); err != nil {
  47. log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error())
  48. return
  49. }
  50. if _, ok := cardsTotalDurationMap[spec.Cluster+"/"+spec.AiCenterName+"/"+centerCode+"/"+cardType+"/"+spec.ComputeResource]; !ok {
  51. cardsTotalDurationMap[spec.Cluster+"/"+spec.AiCenterName+"/"+centerCode+"/"+cardType+"/"+spec.ComputeResource] = 0
  52. }
  53. cloudbrainDurationStat := models.CloudbrainDurationStatistic{
  54. DateTime: dateTime,
  55. DayTime: dayTime,
  56. HourTime: hourTime,
  57. Cluster: spec.Cluster,
  58. AiCenterName: spec.AiCenterName,
  59. AiCenterCode: centerCode,
  60. AccCardType: cardType,
  61. ComputeResource: spec.ComputeResource,
  62. CardsUseDuration: cardDuration,
  63. CardsTotalDuration: cardsTotalDurationMap[spec.Cluster+"/"+spec.AiCenterName+"/"+centerCode+"/"+cardType+"/"+spec.ComputeResource],
  64. CreatedUnix: timeutil.TimeStampNow(),
  65. }
  66. if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
  67. log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
  68. }
  69. delete(cardsTotalDurationMap, spec.Cluster+"/"+spec.AiCenterName+"/"+centerCode+"/"+cardType+"/"+spec.ComputeResource)
  70. }
  71. }
  72. }
  73. for key, cardsTotalDuration := range cardsTotalDurationMap {
  74. if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, strings.Split(key, "/")[2], strings.Split(key, "/")[3]); err != nil {
  75. log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error())
  76. return
  77. }
  78. cloudbrainDurationStat := models.CloudbrainDurationStatistic{
  79. DateTime: dateTime,
  80. DayTime: dayTime,
  81. HourTime: hourTime,
  82. Cluster: strings.Split(key, "/")[0],
  83. AiCenterName: strings.Split(key, "/")[1],
  84. AiCenterCode: strings.Split(key, "/")[2],
  85. AccCardType: strings.Split(key, "/")[3],
  86. ComputeResource: strings.Split(key, "/")[4],
  87. CardsUseDuration: 0,
  88. CardsTotalDuration: cardsTotalDuration,
  89. CreatedUnix: timeutil.TimeStampNow(),
  90. }
  91. if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
  92. log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
  93. }
  94. }
  95. log.Info("finish summary cloudbrainDurationStat")
  96. }
  97. func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) map[string]map[string]int {
  98. var WorkServerNumber int
  99. var AccCardsNum int
  100. cloudBrainCenterCodeAndCardType := make(map[string]map[string]int)
  101. for _, cloudbrain := range ciTasks {
  102. if cloudbrain.Cloudbrain.StartTime == 0 {
  103. cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix
  104. }
  105. if cloudbrain.Cloudbrain.EndTime == 0 {
  106. cloudbrain.Cloudbrain.EndTime = cloudbrain.Cloudbrain.UpdatedUnix
  107. }
  108. if cloudbrain.Cloudbrain.WorkServerNumber >= 1 {
  109. WorkServerNumber = cloudbrain.Cloudbrain.WorkServerNumber
  110. } else {
  111. WorkServerNumber = 1
  112. }
  113. if cloudbrain.Cloudbrain.Spec == nil {
  114. AccCardsNum = 1
  115. } else {
  116. AccCardsNum = cloudbrain.Cloudbrain.Spec.AccCardsNum
  117. }
  118. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode]; !ok {
  119. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode] = make(map[string]int)
  120. }
  121. if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) {
  122. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  123. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  124. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  125. } else {
  126. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  127. }
  128. } else {
  129. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  130. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  131. } else {
  132. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  133. }
  134. }
  135. } else {
  136. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  137. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  138. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
  139. } else {
  140. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
  141. }
  142. } else {
  143. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  144. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
  145. } else {
  146. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.Spec.AiCenterCode][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
  147. }
  148. }
  149. }
  150. }
  151. return cloudBrainCenterCodeAndCardType
  152. }