github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/cmd/u2u/launcher/monitoring/prometheus.go (about) 1 package monitoring 2 3 import ( 4 "os" 5 "path/filepath" 6 "sync" 7 "sync/atomic" 8 "time" 9 10 "github.com/unicornultrafoundation/go-u2u/log" 11 "github.com/unicornultrafoundation/go-u2u/metrics" 12 13 "github.com/unicornultrafoundation/go-u2u/monitoring/prometheus" 14 ) 15 16 var once sync.Once 17 18 func SetupPrometheus(endpoint string) { 19 prometheus.SetNamespace("u2u") 20 prometheus.PrometheusListener(endpoint, nil) 21 } 22 23 func SetDataDir(datadir string) { 24 once.Do(func() { 25 go measureDbDir("db_size", datadir) 26 }) 27 } 28 29 func measureDbDir(name, datadir string) { 30 var ( 31 dbSize int64 32 gauge metrics.Gauge 33 rescan = (len(datadir) > 0 && datadir != "inmemory") 34 ) 35 for { 36 time.Sleep(time.Second) 37 38 if rescan { 39 size := sizeOfDir(datadir) 40 atomic.StoreInt64(&dbSize, size) 41 } 42 43 if gauge == nil { 44 gauge = metrics.NewRegisteredFunctionalGauge(name, nil, func() int64 { 45 return atomic.LoadInt64(&dbSize) 46 }) 47 } 48 49 if !rescan { 50 break 51 } 52 } 53 } 54 55 func sizeOfDir(dir string) (size int64) { 56 err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 57 if err != nil { 58 log.Debug("datadir walk", "path", path, "err", err) 59 return filepath.SkipDir 60 } 61 62 if info.IsDir() { 63 return nil 64 } 65 66 dst, err := filepath.EvalSymlinks(path) 67 if err == nil && dst != path { 68 size += sizeOfDir(dst) 69 } else { 70 size += info.Size() 71 } 72 73 return nil 74 }) 75 76 if err != nil { 77 log.Debug("datadir walk", "path", dir, "err", err) 78 } 79 80 return 81 }