Skip to content

Commit 778028d

Browse files
authored
[*] exclude MetricDef from MeasurementEnvelope (#787)
Sink doesn't need to know all information about metric so passing the whole definition is an overkill. This will decrease a memory consumption. Instead implement `MetricsDefiner` interface for sinks that needs metric specific information, e.g. gauges for Prometheus
1 parent 8834830 commit 778028d

File tree

6 files changed

+31
-7
lines changed

6 files changed

+31
-7
lines changed

internal/metrics/types.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ type MeasurementEnvelope struct {
152152
MetricName string
153153
CustomTags map[string]string
154154
Data Measurements
155-
MetricDef Metric
156155
RealDbname string
157156
SystemIdentifier string
158157
}

internal/reaper/file.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,12 @@ func (r *Reaper) FetchStatsDirectlyFromOS(ctx context.Context, md *sources.Sourc
6666
if err != nil {
6767
return nil, err
6868
}
69-
m, _ := metricDefs.GetMetricDef(metricName)
7069
return &metrics.MeasurementEnvelope{
7170
DBName: md.Name,
7271
SourceType: string(md.Kind),
7372
MetricName: metricName,
7473
CustomTags: md.CustomTags,
7574
Data: data,
76-
MetricDef: m,
7775
RealDbname: md.RealDbname,
7876
SystemIdentifier: md.SystemIdentifier,
7977
}, nil

internal/reaper/metric.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
9+
"github.com/cybertec-postgresql/pgwatch/v3/internal/sinks"
910
"github.com/sirupsen/logrus"
1011
)
1112

@@ -77,6 +78,9 @@ func (r *Reaper) LoadMetrics() (err error) {
7778
return
7879
}
7980
metricDefs.Assign(newDefs)
81+
if definer, ok := r.SinksWriter.(sinks.MetricsDefiner); ok {
82+
err = definer.DefineMetrics(newDefs)
83+
}
8084
r.logger.
8185
WithField("metrics", len(newDefs.MetricDefs)).
8286
WithField("presets", len(newDefs.PresetDefs)).

internal/reaper/reaper.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ func (r *Reaper) FetchMetric(ctx context.Context, md *sources.SourceConn, metric
500500
return nil, err
501501
}
502502
if metricName == specialMetricInstanceUp {
503-
l.WithError(err).Debugf("[%s:%s] failed to fetch metrics. marking instance as not up", md.Name, metricName)
503+
l.WithError(err).Debugf("failed to fetch metrics. marking instance as not up")
504504
data = make(metrics.Measurements, 1)
505505
data[0] = metrics.NewMeasurement(time.Now().UnixNano())
506506
data[0]["is_up"] = 0 // should be updated if the "instance_up" metric definition is changed
@@ -521,7 +521,6 @@ send_to_storageChannel:
521521
MetricName: cmp.Or(metric.StorageName, metricName),
522522
Data: data,
523523
CustomTags: md.CustomTags,
524-
MetricDef: metric,
525524
RealDbname: md.RealDbname,
526525
SystemIdentifier: md.SystemIdentifier}, nil
527526
}

internal/sinks/multiwriter.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ type Writer interface {
1616
Write(msgs metrics.MeasurementEnvelope) error
1717
}
1818

19+
// MetricDefiner is an interface for passing metric definitions to a sink.
20+
type MetricsDefiner interface {
21+
DefineMetrics(metric *metrics.Metrics) error
22+
}
23+
1924
// MultiWriter ensures the simultaneous storage of data in several storages.
2025
type MultiWriter struct {
2126
writers []Writer
@@ -62,6 +67,15 @@ func (mw *MultiWriter) AddWriter(w Writer) {
6267
mw.Unlock()
6368
}
6469

70+
func (mw *MultiWriter) DefineMetrics(metrics *metrics.Metrics) (err error) {
71+
for _, w := range mw.writers {
72+
if definer, ok := w.(MetricsDefiner); ok {
73+
err = errors.Join(err, definer.DefineMetrics(metrics))
74+
}
75+
}
76+
return nil
77+
}
78+
6579
func (mw *MultiWriter) SyncMetric(dbUnique, metricName string, op SyncOp) (err error) {
6680
for _, w := range mw.writers {
6781
err = errors.Join(err, w.SyncMetric(dbUnique, metricName, op))

internal/sinks/prometheus.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type PrometheusWriter struct {
2424
lastScrapeErrors prometheus.Gauge
2525
totalScrapes, totalScrapeFailures prometheus.Counter
2626
PrometheusNamespace string
27+
gauges map[string]([]string) // map of metric names to their gauge names, used for Prometheus gauge metrics
2728
}
2829

2930
const promInstanceUpStateMetric = "instance_up"
@@ -77,6 +78,14 @@ func NewPrometheusWriter(ctx context.Context, connstr string) (promw *Prometheus
7778
return
7879
}
7980

81+
func (promw *PrometheusWriter) DefineMetrics(metrics *metrics.Metrics) (err error) {
82+
promw.gauges = make(map[string]([]string))
83+
for name, m := range metrics.MetricDefs {
84+
promw.gauges[name] = m.Gauges
85+
}
86+
return nil
87+
}
88+
8089
func (promw *PrometheusWriter) Write(msg metrics.MeasurementEnvelope) error {
8190
if len(msg.Data) == 0 { // no batching in async prom mode, so using 0 indexing ok
8291
return nil
@@ -194,6 +203,8 @@ func (promw *PrometheusWriter) MetricStoreMessageToPromMetrics(msg metrics.Measu
194203
return promMetrics
195204
}
196205

206+
gauges := promw.gauges[msg.MetricName]
207+
197208
epochTime = time.Unix(0, msg.Data.GetEpoch())
198209

199210
if epochTime.Before(time.Now().Add(-promScrapingStalenessHardDropLimit)) {
@@ -247,8 +258,7 @@ func (promw *PrometheusWriter) MetricStoreMessageToPromMetrics(msg metrics.Measu
247258
for field, value := range fields {
248259
fieldPromDataType := prometheus.CounterValue
249260
if msg.MetricName == promInstanceUpStateMetric ||
250-
len(msg.MetricDef.Gauges) > 0 &&
251-
(msg.MetricDef.Gauges[0] == "*" || slices.Contains(msg.MetricDef.Gauges, field)) {
261+
len(gauges) > 0 && (gauges[0] == "*" || slices.Contains(gauges, field)) {
252262
fieldPromDataType = prometheus.GaugeValue
253263
}
254264
var desc *prometheus.Desc

0 commit comments

Comments
 (0)