...
1 package reaper
2
3 import (
4 "maps"
5 "sync"
6 "time"
7
8 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
9 "github.com/cybertec-postgresql/pgwatch/v3/internal/sources"
10 "github.com/sirupsen/logrus"
11 )
12
13 const (
14 monitoredDbsDatastoreSyncIntervalSeconds = 600
15 monitoredDbsDatastoreSyncMetricName = "configured_dbs"
16
17 dbSizeCachingInterval = 30 * time.Minute
18 dbMetricJoinStr = "¤¤¤"
19
20 )
21
22 type ConcurrentMetricDefs struct {
23 *metrics.Metrics
24 sync.RWMutex
25 }
26
27 func NewConcurrentMetricDefs() *ConcurrentMetricDefs {
28 return &ConcurrentMetricDefs{
29 Metrics: &metrics.Metrics{
30 MetricDefs: make(metrics.MetricDefs),
31 PresetDefs: make(metrics.PresetDefs),
32 },
33 }
34 }
35
36 func (cmd *ConcurrentMetricDefs) GetMetricDef(name string) (m metrics.Metric, ok bool) {
37 cmd.RLock()
38 defer cmd.RUnlock()
39 m, ok = cmd.MetricDefs[name]
40 return
41 }
42
43 func (cmd *ConcurrentMetricDefs) GetPresetDef(name string) (m metrics.Preset, ok bool) {
44 cmd.RLock()
45 defer cmd.RUnlock()
46 m, ok = cmd.PresetDefs[name]
47 return
48 }
49
50 func (cmd *ConcurrentMetricDefs) GetPresetMetrics(name string) (m map[string]float64) {
51 cmd.RLock()
52 defer cmd.RUnlock()
53 return cmd.PresetDefs[name].Metrics
54 }
55
56 func (cmd *ConcurrentMetricDefs) Assign(newDefs *metrics.Metrics) {
57 cmd.Lock()
58 defer cmd.Unlock()
59 cmd.MetricDefs = maps.Clone(newDefs.MetricDefs)
60 cmd.PresetDefs = maps.Clone(newDefs.PresetDefs)
61 }
62
63 type MetricFetchConfig struct {
64 DBUniqueName string
65 DBUniqueNameOrig string
66 MetricName string
67 Source sources.Kind
68 Interval time.Duration
69 CreatedOn time.Time
70 StmtTimeoutOverride int64
71 }
72
73 type ChangeDetectionResults struct {
74 Created int
75 Altered int
76 Dropped int
77 }
78
79 type MonitoredDatabaseSettings struct {
80 LastCheckedOn time.Time
81 IsInRecovery bool
82 VersionStr string
83 Version int
84 RealDbname string
85 SystemIdentifier string
86 IsSuperuser bool
87 Extensions map[string]int
88 ExecEnv string
89 ApproxDBSizeB int64
90 }
91
92 type ExistingPartitionInfo struct {
93 StartTime time.Time
94 EndTime time.Time
95 }
96
97
98 func (r *Reaper) LoadMetrics() (err error) {
99 var newDefs *metrics.Metrics
100 if newDefs, err = r.MetricsReaderWriter.GetMetrics(); err != nil {
101 return
102 }
103 metricDefs.Assign(newDefs)
104 r.logger.
105 WithField("metrics", len(newDefs.MetricDefs)).
106 WithField("presets", len(newDefs.PresetDefs)).
107 Log(func() logrus.Level {
108 if len(newDefs.PresetDefs)*len(newDefs.MetricDefs) == 0 {
109 return logrus.WarnLevel
110 }
111 return logrus.InfoLevel
112 }(), "metrics and presets refreshed")
113 return
114 }
115