server_stat.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // package server_stat -- глобальная статистика сервера
  2. package server_stat
  3. import (
  4. "encoding/json"
  5. "strings"
  6. "sync"
  7. "time"
  8. . "wartank/app/lev0/types"
  9. "wartank/pkg/kernel/kernel_log"
  10. . "wartank/pkg/kernel/kernel_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. лог := kernel_log.НовЛоггер("СерверСтат")
  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. store := сам.серв.Получ("kernStore").(IKernelStore)
  42. бинДанные, ош := store.Get("server_stat")
  43. if ош != nil {
  44. if strings.Contains(ош.Error(), "not found") {
  45. return
  46. }
  47. сам.лог.Паника(true, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
  48. }
  49. ош = json.Unmarshal(бинДанные, сам)
  50. сам.лог.Паника(ош != nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
  51. go сам.пуск()
  52. }
  53. // Работает в отдельном потоке, считает время работы и счетчик запусков
  54. func (сам *СерверСтат) пуск() {
  55. фнПуск := func() {
  56. сам.блок.Lock()
  57. defer сам.блок.Unlock()
  58. сам.ВремяВсего_ += time.Second
  59. сам.ВремяСессия_ += time.Second
  60. сам.сохр()
  61. time.Sleep(time.Second)
  62. }
  63. for {
  64. select {
  65. case <-сам.серв.Конт().Done():
  66. return
  67. default:
  68. фнПуск()
  69. }
  70. }
  71. }
  72. // Сохраняет статистику сервера
  73. func (сам *СерверСтат) сохр() {
  74. бинДанные, ош := json.Marshal(сам)
  75. сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
  76. store := сам.серв.Получ("kernStore").(IKernelStore)
  77. ош = store.Set("server_stat", бинДанные)
  78. сам.лог.Паника(ош != nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
  79. }
  80. // СчётСтарт -- счётчик запусков
  81. func (сам *СерверСтат) СчётСтарт() int {
  82. return сам.CчётСтарт_
  83. }
  84. // ВремяСессия -- возвращает время сессии
  85. func (сам *СерверСтат) ВремяСессия() string {
  86. return сам.ВремяСессия_.String()
  87. }
  88. // ВремяВсего -- возвращает общее время работы
  89. func (сам *СерверСтат) ВремяВсего() string {
  90. сам.блок.RLock()
  91. defer сам.блок.RUnlock()
  92. return сам.ВремяВсего_.String()
  93. }