| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // package server_stat -- глобальная статистика сервера
- package server_stat
- import (
- "encoding/json"
- "strings"
- "sync"
- "time"
- . "gitp78su.ipnodns.ru/svi/kern"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- // . "wartank/app/lev0/types"
- )
- // СерверСтат -- структура статистики сервера
- type СерверСтат struct {
- конт IKernelCtx
- CчётСтарт_ int `json:"count_start"` // Количество запусков
- ВремяВсего_ time.Duration `json:"time_total"` // Общее время работы в секундах
- ВремяСессия_ time.Duration `json:"time_session"` // Время сессии в секундах
- блок sync.RWMutex
- лог ILogBuf
- }
- // НовСерверСтат -- возвращает структуру статистики сервера
- func НовСерверСтат() *СерверСтат {
- конт := GetKernelCtx()
- лог := NewLogBuf()
- лог.Info("НовСерверСтат()\n")
- сам := &СерверСтат{
- конт: конт,
- CчётСтарт_: 0,
- ВремяВсего_: 0,
- ВремяСессия_: 0,
- лог: лог,
- }
- сам.загр()
- сам.блок.Lock()
- сам.CчётСтарт_++
- сам.блок.Unlock()
- сам.сохр()
- go сам.пуск()
- return сам
- }
- // Загружает статистику сервера
- func (сам *СерверСтат) загр() {
- store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
- бинДанные, ош := store.Get("server_stat")
- if ош != nil {
- if strings.Contains(ош.Error(), "not found") {
- return
- }
- Hassert(false, "СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%v\n", ош)
- }
- ош = json.Unmarshal(бинДанные, сам)
- Hassert(ош == nil, "СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%v\n", ош)
- go сам.пуск()
- }
- // Работает в отдельном потоке, считает время работы и счетчик запусков
- func (сам *СерверСтат) пуск() {
- фнПуск := func() {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- сам.ВремяВсего_ += time.Second
- сам.ВремяСессия_ += time.Second
- сам.сохр()
- time.Sleep(time.Second)
- }
- for {
- select {
- case <-сам.конт.Ctx().Done():
- return
- default:
- фнПуск()
- }
- }
- }
- // Сохраняет статистику сервера
- func (сам *СерверСтат) сохр() {
- фнСохр := func() {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- бинДанные, ош := json.Marshal(сам)
- Hassert(ош == nil, "СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%v\n", ош)
- store := сам.конт.Get("kernStoreKV").Val().(IKernelStoreKv)
- ош = store.Set("server_stat", бинДанные)
- Hassert(ош == nil, "СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош)
- }
- фнСохр()
- }
- // СчётСтарт -- счётчик запусков
- func (сам *СерверСтат) СчётСтарт() int {
- return сам.CчётСтарт_
- }
- // ВремяСессия -- возвращает время сессии
- func (сам *СерверСтат) ВремяСессия() string {
- return сам.ВремяСессия_.String()
- }
- // ВремяВсего -- возвращает общее время работы
- func (сам *СерверСтат) ВремяВсего() string {
- сам.блок.RLock()
- defer сам.блок.RUnlock()
- return сам.ВремяВсего_.String()
- }
|