server_stat.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. сам.CчётСтарт_++
  36. сам.сохр()
  37. go сам.пуск()
  38. return сам
  39. }
  40. // Загружает статистику сервера
  41. func (сам *СерверСтат) загр() {
  42. store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
  43. бинДанные, ош := store.Get("server_stat")
  44. if ош != nil {
  45. if strings.Contains(ош.Error(), "not found") {
  46. return
  47. }
  48. Hassert(false, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
  49. }
  50. ош = json.Unmarshal(бинДанные, сам)
  51. Hassert(ош == nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
  52. go сам.пуск()
  53. }
  54. // Работает в отдельном потоке, считает время работы и счетчик запусков
  55. func (сам *СерверСтат) пуск() {
  56. фнПуск := func() {
  57. сам.блок.Lock()
  58. defer сам.блок.Unlock()
  59. сам.ВремяВсего_ += time.Second
  60. сам.ВремяСессия_ += time.Second
  61. сам.сохр()
  62. time.Sleep(time.Second)
  63. }
  64. for {
  65. select {
  66. case <-сам.конт.Ctx().Done():
  67. return
  68. default:
  69. фнПуск()
  70. }
  71. }
  72. }
  73. // Сохраняет статистику сервера
  74. func (сам *СерверСтат) сохр() {
  75. бинДанные, ош := json.Marshal(сам)
  76. Hassert(ош == nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
  77. store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
  78. ош = store.Set("server_stat", бинДанные)
  79. Hassert(ош == nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
  80. }
  81. // СчётСтарт -- счётчик запусков
  82. func (сам *СерверСтат) СчётСтарт() int {
  83. return сам.CчётСтарт_
  84. }
  85. // ВремяСессия -- возвращает время сессии
  86. func (сам *СерверСтат) ВремяСессия() string {
  87. return сам.ВремяСессия_.String()
  88. }
  89. // ВремяВсего -- возвращает общее время работы
  90. func (сам *СерверСтат) ВремяВсего() string {
  91. сам.блок.RLock()
  92. defer сам.блок.RUnlock()
  93. return сам.ВремяВсего_.String()
  94. }