Skip to content

Commit b82ae3b

Browse files
authored
[*] use pgx.Rows directly in DetectConfigurationChanges() (#775)
This will decrease memory usage. Previously `QueryMeasurements()` returned a long slice of `map[string]any` creating pressure on heap.
1 parent 3f89184 commit b82ae3b

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

internal/reaper/database.go

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ func DetectTableChanges(ctx context.Context, md *sources.SourceConn, storageCh c
155155
for _, dr := range data {
156156
objIdent := dr["tag_table"].(string)
157157
prevHash, ok := hostState["table_hashes"][objIdent]
158-
//log.Debug("inspecting table:", objIdent, "hash:", prev_hash)
159158
if ok { // we have existing state
160159
if prevHash != dr["md5"].(string) {
161160
log.GetLogger(ctx).Info("detected DDL change in table:", dr["tag_table"])
@@ -373,52 +372,60 @@ func DetectConfigurationChanges(ctx context.Context, md *sources.SourceConn, sto
373372
var firstRun bool
374373
var changeCounts ChangeDetectionResults
375374

376-
log.GetLogger(ctx).Debugf("[%s][%s] checking for configuration changes...", md.Name, specialMetricChangeEvents)
375+
logger := log.GetLogger(ctx).WithField("source", md.Name).WithField("metric", specialMetricChangeEvents)
376+
377377
if _, ok := hostState["configuration_hashes"]; !ok {
378378
firstRun = true
379379
hostState["configuration_hashes"] = make(map[string]string)
380380
}
381381

382382
mvp, ok := metricDefs.GetMetricDef("configuration_hashes")
383383
if !ok {
384-
log.GetLogger(ctx).Errorf("[%s][%s] could not get configuration_hashes sql", md.Name, specialMetricChangeEvents)
384+
logger.Error("could not get configuration_hashes sql")
385385
return changeCounts
386386
}
387387

388-
data, err := QueryMeasurements(ctx, md, mvp.GetSQL(int(md.Version)))
388+
rows, err := md.Conn.Query(ctx, mvp.GetSQL(md.Version))
389389
if err != nil {
390-
log.GetLogger(ctx).Errorf("[%s][%s] could not read configuration_hashes from monitored host: %v", md.Name, specialMetricChangeEvents, err)
390+
logger.Error("could not read configuration_hashes from monitored host: ", err)
391391
return changeCounts
392392
}
393-
394-
for _, dr := range data {
395-
objIdent := dr["tag_setting"].(string)
396-
objValue := dr["value"].(string)
393+
defer rows.Close()
394+
var (
395+
objIdent, objValue string
396+
epoch int64
397+
)
398+
for rows.Next() {
399+
if rows.Scan(&epoch, &objIdent, &objValue) != nil {
400+
return changeCounts
401+
}
397402
prevРash, ok := hostState["configuration_hashes"][objIdent]
398403
if ok { // we have existing state
399404
if prevРash != objValue {
400-
if objIdent == "connection_ID" {
401-
continue // ignore some weird Azure managed PG service setting
402-
}
403-
log.GetLogger(ctx).Warningf("[%s][%s] detected settings change: %s = %s (prev: %s)",
404-
md.Name, specialMetricChangeEvents, objIdent, objValue, prevРash)
405-
dr["event"] = "alter"
406-
detectedChanges = append(detectedChanges, dr)
405+
logger.Warningf("detected settings change: %s = %s (prev: %s)", objIdent, objValue, prevРash)
406+
detectedChanges = append(detectedChanges, metrics.Measurement{
407+
metrics.EpochColumnName: epoch,
408+
"tag_setting": objIdent,
409+
"value": objValue,
410+
"event": "alter"})
407411
hostState["configuration_hashes"][objIdent] = objValue
408412
changeCounts.Altered++
409413
}
410414
} else { // check for new, delete not relevant here (pg_upgrade)
411-
if !firstRun {
412-
log.GetLogger(ctx).Warningf("[%s][%s] detected new setting: %s", md.Name, specialMetricChangeEvents, objIdent)
413-
dr["event"] = "create"
414-
detectedChanges = append(detectedChanges, dr)
415-
changeCounts.Created++
416-
}
417415
hostState["configuration_hashes"][objIdent] = objValue
416+
if firstRun {
417+
continue
418+
}
419+
logger.Warning("detected new setting: ", objIdent)
420+
detectedChanges = append(detectedChanges, metrics.Measurement{
421+
metrics.EpochColumnName: epoch,
422+
"tag_setting": objIdent,
423+
"value": objValue,
424+
"event": "create"})
425+
changeCounts.Created++
418426
}
419427
}
420428

421-
log.GetLogger(ctx).Debugf("[%s][%s] detected %d configuration changes", md.Name, specialMetricChangeEvents, len(detectedChanges))
422429
if len(detectedChanges) > 0 {
423430
storageCh <- metrics.MeasurementEnvelope{
424431
DBName: md.Name,
@@ -427,7 +434,6 @@ func DetectConfigurationChanges(ctx context.Context, md *sources.SourceConn, sto
427434
CustomTags: md.CustomTags,
428435
}
429436
}
430-
431437
return changeCounts
432438
}
433439

0 commit comments

Comments
 (0)