server_stat.go 3.8 KB

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