...
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_"
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 {
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