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 13 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
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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package repo
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "time"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/timeutil"
  12. cloudbrainService "code.gitea.io/gitea/services/cloudbrain"
  13. )
  14. func CloudbrainDurationStatisticHour() {
  15. if setting.IsCloudbrainTimingEnabled {
  16. var statisticTime time.Time
  17. var count int64
  18. recordDurationUpdateTime, err := models.GetDurationRecordUpdateTime()
  19. if err != nil {
  20. log.Error("Can not get GetDurationRecordBeginTime", err)
  21. }
  22. now := time.Now()
  23. currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location())
  24. if err == nil && len(recordDurationUpdateTime) > 0 {
  25. statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTimeUnix), 0).Add(+1 * time.Hour)
  26. } else {
  27. statisticTime = currentTime
  28. }
  29. err = models.DeleteCloudbrainDurationStatistic(timeutil.TimeStamp(statisticTime.Unix()), timeutil.TimeStamp(currentTime.Unix()))
  30. if err != nil {
  31. log.Error("DeleteCloudbrainDurationStatistic failed", err)
  32. }
  33. for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) {
  34. countEach := summaryDurationStat(statisticTime)
  35. count += countEach
  36. statisticTime = statisticTime.Add(+1 * time.Hour)
  37. }
  38. log.Info("summaryDurationStat count: %v", count)
  39. }
  40. }
  41. func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) int64 {
  42. var count int64
  43. statisticTime := beginTime
  44. currentTime := endTime
  45. for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) {
  46. countEach := summaryDurationStat(statisticTime)
  47. count += countEach
  48. statisticTime = statisticTime.Add(+1 * time.Hour)
  49. }
  50. return count
  51. }
  52. //statisticTime是当前的时辰,比如当前是2019-01-01 12:01:01,那么statisticTime就是2019-01-01 12:00:00
  53. func summaryDurationStat(statisticTime time.Time) int64 {
  54. var count int64
  55. dateTimeUnix := timeutil.TimeStamp(statisticTime.Add(-1 * time.Hour).Unix())
  56. beginTime := statisticTime.Add(-1 * time.Hour).Unix()
  57. dayTime := statisticTime.Add(-1 * time.Hour).Format("2006-01-02")
  58. hourTime := statisticTime.Add(-1 * time.Hour).Hour()
  59. endTime := statisticTime.Unix()
  60. ciTasks, err := models.GetCloudbrainByTime(beginTime, endTime)
  61. if err != nil {
  62. log.Info("GetCloudbrainByTime err: %v", err)
  63. return 0
  64. }
  65. fmt.Printf("ciTasks:", ciTasks[0].Cloudbrain.JobName)
  66. models.LoadSpecs4CloudbrainInfo(ciTasks)
  67. cloudBrainCenterCodeAndCardTypeInfo, cloudbrainMap := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime)
  68. resourceQueues, err := models.GetCanUseCardInfo()
  69. if err != nil {
  70. log.Info("GetCanUseCardInfo err: %v", err)
  71. return 0
  72. }
  73. cardsTotalDurationMap := make(map[string]int)
  74. for _, resourceQueue := range resourceQueues {
  75. if _, ok := cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType]; !ok {
  76. cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType] = resourceQueue.CardsTotalNum * 1 * 60 * 60
  77. } else {
  78. cardsTotalDurationMap[resourceQueue.Cluster+"/"+resourceQueue.AiCenterCode+"/"+resourceQueue.AccCardType] += resourceQueue.CardsTotalNum * 1 * 60 * 60
  79. }
  80. }
  81. for centerCode, CardTypes := range cloudBrainCenterCodeAndCardTypeInfo {
  82. for cardType, cardDuration := range CardTypes {
  83. cloudbrainTable := cloudbrainMap[centerCode+"/"+cardType]
  84. if cloudbrainTable != nil {
  85. if _, ok := cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType]; !ok {
  86. cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType] = 0
  87. }
  88. cloudbrainDurationStat := models.CloudbrainDurationStatistic{
  89. DateTimeUnix: dateTimeUnix,
  90. DayTime: dayTime,
  91. HourTime: hourTime,
  92. Cluster: cloudbrainTable.Cluster,
  93. AiCenterName: GetAiCenterNameByCode(centerCode, "zh-CN"),
  94. AiCenterCode: centerCode,
  95. AccCardType: cardType,
  96. CardsUseDuration: cardDuration,
  97. CardsTotalDuration: cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType],
  98. CreatedUnix: timeutil.TimeStampNow(),
  99. }
  100. if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
  101. log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
  102. }
  103. count++
  104. delete(cardsTotalDurationMap, cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType)
  105. }
  106. }
  107. }
  108. for key, cardsTotalDuration := range cardsTotalDurationMap {
  109. cloudbrainDurationStat := models.CloudbrainDurationStatistic{
  110. DateTimeUnix: dateTimeUnix,
  111. DayTime: dayTime,
  112. HourTime: hourTime,
  113. Cluster: strings.Split(key, "/")[0],
  114. AiCenterName: GetAiCenterNameByCode(strings.Split(key, "/")[1], "zh-CN"),
  115. AiCenterCode: strings.Split(key, "/")[1],
  116. AccCardType: strings.Split(key, "/")[2],
  117. CardsUseDuration: 0,
  118. CardsTotalDuration: cardsTotalDuration,
  119. CardsTotalNum: cardsTotalDuration / 1 / 60 / 60,
  120. CreatedUnix: timeutil.TimeStampNow(),
  121. }
  122. if _, err = models.InsertCloudbrainDurationStatistic(&cloudbrainDurationStat); err != nil {
  123. log.Error("Insert cloudbrainDurationStat failed: %v", err.Error())
  124. }
  125. count++
  126. }
  127. log.Info("finish summary cloudbrainDurationStat")
  128. return count
  129. }
  130. func GetAiCenterNameByCode(centerCode string, language string) string {
  131. var aiCenterName string
  132. aiCenterInfo := cloudbrainService.GetAiCenterInfoByCenterCode(centerCode)
  133. if aiCenterInfo != nil {
  134. if language == "zh-CN" {
  135. aiCenterName = aiCenterInfo.Content
  136. } else {
  137. aiCenterName = aiCenterInfo.ContentEN
  138. }
  139. } else {
  140. aiCenterName = centerCode
  141. }
  142. return aiCenterName
  143. }
  144. func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) (map[string]map[string]int, map[string]*models.Cloudbrain) {
  145. var WorkServerNumber int
  146. var AccCardsNum int
  147. cloudbrainMap := make(map[string]*models.Cloudbrain)
  148. cloudBrainCenterCodeAndCardType := make(map[string]map[string]int)
  149. for _, cloudbrain := range ciTasks {
  150. if cloudbrain.Cloudbrain.StartTime == 0 {
  151. cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix
  152. }
  153. if cloudbrain.Cloudbrain.EndTime == 0 {
  154. cloudbrain.Cloudbrain.EndTime = timeutil.TimeStamp(time.Now().Unix())
  155. }
  156. cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain)
  157. if cloudbrain.Cloudbrain.Spec != nil {
  158. if _, ok := cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  159. if cloudbrain.Cloudbrain.Spec != nil {
  160. cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = &cloudbrain.Cloudbrain
  161. }
  162. }
  163. }
  164. cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain)
  165. if cloudbrain.Cloudbrain.StartTime == 0 {
  166. cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix
  167. }
  168. if cloudbrain.Cloudbrain.EndTime == 0 {
  169. cloudbrain.Cloudbrain.EndTime = cloudbrain.Cloudbrain.UpdatedUnix
  170. }
  171. if cloudbrain.Cloudbrain.WorkServerNumber >= 1 {
  172. WorkServerNumber = cloudbrain.Cloudbrain.WorkServerNumber
  173. } else {
  174. WorkServerNumber = 1
  175. }
  176. if cloudbrain.Cloudbrain.Spec == nil {
  177. AccCardsNum = 1
  178. } else {
  179. AccCardsNum = cloudbrain.Cloudbrain.Spec.AccCardsNum
  180. }
  181. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter]; !ok {
  182. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter] = make(map[string]int)
  183. }
  184. if cloudbrain.Cloudbrain.Spec != nil {
  185. if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) && cloudbrain.Cloudbrain.DeletedAt.IsZero() {
  186. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  187. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  188. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  189. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) < endTime {
  190. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  191. } else if int64(cloudbrain.Cloudbrain.StartTime) >= endTime {
  192. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = 0
  193. }
  194. } else {
  195. if int64(cloudbrain.Cloudbrain.StartTime) < beginTime {
  196. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  197. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) < endTime {
  198. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  199. } else if int64(cloudbrain.Cloudbrain.StartTime) >= endTime {
  200. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += 0
  201. }
  202. }
  203. } else {
  204. if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok {
  205. if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
  206. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
  207. } else if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
  208. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  209. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
  210. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
  211. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
  212. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  213. }
  214. } else {
  215. if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
  216. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(beginTime))
  217. } else if int64(cloudbrain.Cloudbrain.StartTime) <= beginTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
  218. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime))
  219. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) <= endTime {
  220. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(cloudbrain.Cloudbrain.EndTime) - int(cloudbrain.Cloudbrain.StartTime))
  221. } else if beginTime <= int64(cloudbrain.Cloudbrain.StartTime) && int64(cloudbrain.Cloudbrain.StartTime) <= endTime && int64(cloudbrain.Cloudbrain.EndTime) > endTime {
  222. cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] += AccCardsNum * WorkServerNumber * (int(endTime) - int(cloudbrain.Cloudbrain.StartTime))
  223. }
  224. }
  225. }
  226. }
  227. }
  228. return cloudBrainCenterCodeAndCardType, cloudbrainMap
  229. }
  230. func CloudbrainUpdateHistoryData(ctx *context.Context) {
  231. beginTimeStr := ctx.QueryTrim("beginTime")
  232. endTimeStr := ctx.QueryTrim("endTime")
  233. var count int64
  234. var err error
  235. if beginTimeStr != "" && endTimeStr != "" {
  236. beginTime, _ := time.ParseInLocation("2006-01-02 15:04:05", beginTimeStr, time.Local)
  237. endTime, _ := time.ParseInLocation("2006-01-02 15:04:05", endTimeStr, time.Local)
  238. if time.Now().Before(endTime) {
  239. endTime = time.Now()
  240. }
  241. beginTimeUnix := timeutil.TimeStamp(beginTime.Unix())
  242. endTimeUnix := timeutil.TimeStamp(endTime.Unix())
  243. err = models.DeleteCloudbrainDurationStatistic(beginTimeUnix, endTimeUnix)
  244. count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime.Add(+1*time.Hour))
  245. }
  246. ctx.JSON(http.StatusOK, map[string]interface{}{
  247. "message": 0,
  248. "count": count,
  249. "err": err,
  250. })
  251. }