code.vegaprotocol.io/vega@v0.79.0/core/snapshot/metrics.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package snapshot 17 18 import ( 19 "sort" 20 "sync" 21 "time" 22 23 "code.vegaprotocol.io/vega/core/metrics" 24 25 "golang.org/x/exp/maps" 26 ) 27 28 type snapMetrics struct { 29 timeTaken time.Duration 30 size int 31 } 32 33 type snapMetricsState struct { 34 namespaces map[string]snapMetrics 35 mtx sync.Mutex 36 } 37 38 func newSnapMetricsState() *snapMetricsState { 39 return &snapMetricsState{ 40 namespaces: map[string]snapMetrics{}, 41 } 42 } 43 44 func (s *snapMetricsState) Register( 45 namespace string, 46 timeTaken time.Duration, 47 size int, 48 ) { 49 s.mtx.Lock() 50 defer s.mtx.Unlock() 51 sm := s.namespaces[namespace] 52 sm.size += size 53 sm.timeTaken += timeTaken 54 s.namespaces[namespace] = sm 55 } 56 57 func (s *snapMetricsState) Report(blockHeight uint64) { 58 namespaces := maps.Keys(s.namespaces) 59 sort.Strings(namespaces) 60 61 for _, v := range namespaces { 62 stat := s.namespaces[v] 63 metrics.RegisterSnapshotNamespaces(v, stat.timeTaken, stat.size) 64 } 65 66 metrics.RegisterSnapshotBlockHeight(blockHeight) 67 }