server_stat.go 3.8 KB

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