...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/reaper/metric.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/reaper

     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              // write actively monitored DBs listing to metrics store after so many seconds
    15  	monitoredDbsDatastoreSyncMetricName      = "configured_dbs" // FYI - for Postgres datastore there's also the admin.all_unique_dbnames table with all recent DB unique names with some metric data
    16  
    17  	dbSizeCachingInterval = 30 * time.Minute
    18  	dbMetricJoinStr       = "¤¤¤" // just some unlikely string for a DB name to avoid using maps of maps for DB+metric data
    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 { // for passing around DDL/index/config change detection results
    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 // if true and no helpers are installed, use superuser SQL version of metric if available
    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  // LoadMetrics loads metric definitions from the reader
    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