server_stat.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // package server_stat -- глобальная статистика сервера
  2. package server_stat
  3. import (
  4. "encoding/json"
  5. "strings"
  6. "sync"
  7. "time"
  8. . "wartank/pkg/kernel/kernel_types"
  9. "wartank/pkg/kernel/logger"
  10. . "wartank/server/lev0/types"
  11. )
  12. // СерверСтат -- структура статистики сервера
  13. type СерверСтат struct {
  14. серв ИСервер
  15. CчётСтарт_ int `json:"count_start"` // Количество запусков
  16. ВремяВсего_ time.Duration `json:"time_total"` // Общее время работы в секундах
  17. ВремяСессия_ time.Duration `json:"time_session"` // Время сессии в секундах
  18. блок sync.RWMutex
  19. лог ИЛоггер
  20. }
  21. // НовСерверСтат -- возвращает структуру статистики сервера
  22. func НовСерверСтат(серв ИСервер) *СерверСтат {
  23. лог := logger.НовЛоггер("СерверСтат")
  24. лог.Инфо("НовСерверСтат()\n")
  25. лог.Паника(серв == nil, "НовСерверСтат: ИСервер == nil")
  26. сам := &СерверСтат{
  27. серв: серв,
  28. CчётСтарт_: 0,
  29. ВремяВсего_: 0,
  30. ВремяСессия_: 0,
  31. лог: лог,
  32. }
  33. сам.загр()
  34. сам.CчётСтарт_++
  35. сам.сохр()
  36. go сам.пуск()
  37. return сам
  38. }
  39. // Загружает статистику сервера
  40. func (сам *СерверСтат) загр() {
  41. бинДанные, ош := сам.серв.Хранилище().Получ("server_stat")
  42. if ош != nil {
  43. if strings.Contains(ош.Error(), "not found") {
  44. return
  45. }
  46. сам.лог.Паника(true, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
  47. }
  48. ош = json.Unmarshal(бинДанные, сам)
  49. сам.лог.Паника(ош != nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
  50. go сам.пуск()
  51. }
  52. // Работает в отдельном потоке, считает время работы и счетчик запусков
  53. func (сам *СерверСтат) пуск() {
  54. фнПуск := func() {
  55. сам.блок.Lock()
  56. defer сам.блок.Unlock()
  57. сам.ВремяВсего_ += time.Second
  58. сам.ВремяСессия_ += time.Second
  59. сам.сохр()
  60. time.Sleep(time.Second)
  61. }
  62. for {
  63. select {
  64. case <-сам.серв.Done():
  65. return
  66. default:
  67. фнПуск()
  68. }
  69. }
  70. }
  71. // Сохраняет статистику сервера
  72. func (сам *СерверСтат) сохр() {
  73. бинДанные, ош := json.Marshal(сам)
  74. сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
  75. ош = сам.серв.Хранилище().Уст("server_stat", бинДанные)
  76. сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
  77. }
  78. // СчётСтарт -- счётчик запусков
  79. func (сам *СерверСтат) СчётСтарт() int {
  80. return сам.CчётСтарт_
  81. }
  82. // ВремяСессия -- возвращает время сессии
  83. func (сам *СерверСтат) ВремяСессия() string {
  84. return сам.ВремяСессия_.String()
  85. }
  86. // ВремяВсего -- возвращает общее время работы
  87. func (сам *СерверСтат) ВремяВсего() string {
  88. сам.блок.RLock()
  89. defer сам.блок.RUnlock()
  90. return сам.ВремяВсего_.String()
  91. }