...

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

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

     1  package reaper
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  	"time"
     7  
     8  	"errors"
     9  
    10  	"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
    11  	"github.com/cybertec-postgresql/pgwatch/v3/internal/sources"
    12  )
    13  
    14  const (
    15  	recoPrefix                        = "reco_" // special handling for metrics with such prefix, data stored in RECO_METRIC_NAME
    16  	recoMetricName                    = "recommendations"
    17  	specialMetricChangeEvents         = "change_events"
    18  	specialMetricServerLogEventCounts = "server_log_event_counts"
    19  	specialMetricInstanceUp           = "instance_up"
    20  )
    21  
    22  var specialMetrics = map[string]bool{recoMetricName: true, specialMetricChangeEvents: true, specialMetricServerLogEventCounts: true}
    23  
    24  func GetAllRecoMetricsForVersion() (metrics.MetricDefs, error) {
    25  	mvpMap := make(metrics.MetricDefs)
    26  	metricDefs.RLock()
    27  	defer metricDefs.RUnlock()
    28  	for name, m := range metricDefs.MetricDefs {
    29  		if strings.HasPrefix(name, recoPrefix) {
    30  			mvpMap[name] = m
    31  		}
    32  	}
    33  	return mvpMap, nil
    34  }
    35  
    36  func GetRecommendations(ctx context.Context, dbUnique string, md *sources.SourceConn) (metrics.Measurements, error) {
    37  	retData := make(metrics.Measurements, 0)
    38  	startTimeEpochNs := time.Now().UnixNano()
    39  
    40  	recoMetrics, err := GetAllRecoMetricsForVersion()
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	for _, mvp := range recoMetrics {
    45  		data, e := QueryMeasurements(ctx, dbUnique, mvp.GetSQL(md.Version))
    46  		if err != nil {
    47  			err = errors.Join(err, e)
    48  			continue
    49  		}
    50  		for _, d := range data {
    51  			d[metrics.EpochColumnName] = startTimeEpochNs
    52  			d["major_ver"] = md.Version / 10
    53  			retData = append(retData, d)
    54  		}
    55  	}
    56  	if len(retData) == 0 { // insert a dummy entry minimally so that Grafana can show at least a dropdown
    57  		dummy := metrics.NewMeasurement(startTimeEpochNs)
    58  		dummy["tag_reco_topic"] = "dummy"
    59  		dummy["tag_object_name"] = "-"
    60  		dummy["recommendation"] = "no recommendations"
    61  		dummy["major_ver"] = md.Version / 10
    62  		retData = append(retData, dummy)
    63  	}
    64  	return retData, err
    65  }
    66