github.com/netdata/go.d.plugin@v0.58.1/modules/postgres/do_query_replication.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package postgres 4 5 import ( 6 "fmt" 7 ) 8 9 func (p *Postgres) doQueryReplicationMetrics() error { 10 if err := p.doQueryReplStandbyAppWALDelta(); err != nil { 11 return fmt.Errorf("querying replication standby app wal delta error: %v", err) 12 } 13 14 if p.pgVersion >= pgVersion10 { 15 if err := p.doQueryReplStandbyAppWALLag(); err != nil { 16 return fmt.Errorf("querying replication standby app wal lag error: %v", err) 17 } 18 } 19 20 if p.pgVersion >= pgVersion10 && p.isSuperUser() { 21 if err := p.doQueryReplSlotFiles(); err != nil { 22 return fmt.Errorf("querying replication slot files error: %v", err) 23 } 24 } 25 26 return nil 27 } 28 29 func (p *Postgres) doQueryReplStandbyAppWALDelta() error { 30 q := queryReplicationStandbyAppDelta(p.pgVersion) 31 32 var app string 33 return p.doQuery(q, func(column, value string, _ bool) { 34 switch column { 35 case "application_name": 36 app = value 37 p.getReplAppMetrics(app).updated = true 38 default: 39 // TODO: delta calculation was changed in https://github.com/netdata/go.d.plugin/pull/1039 40 // - 'replay_delta' (probably other deltas too?) can be negative 41 // - Also, WAL delta != WAL lag after that PR 42 v := parseInt(value) 43 if v < 0 { 44 v = 0 45 } 46 switch column { 47 case "sent_delta": 48 p.getReplAppMetrics(app).walSentDelta += v 49 case "write_delta": 50 p.getReplAppMetrics(app).walWriteDelta += v 51 case "flush_delta": 52 p.getReplAppMetrics(app).walFlushDelta += v 53 case "replay_delta": 54 p.getReplAppMetrics(app).walReplayDelta += v 55 } 56 } 57 }) 58 } 59 60 func (p *Postgres) doQueryReplStandbyAppWALLag() error { 61 q := queryReplicationStandbyAppLag() 62 63 var app string 64 return p.doQuery(q, func(column, value string, _ bool) { 65 switch column { 66 case "application_name": 67 app = value 68 p.getReplAppMetrics(app).updated = true 69 case "write_lag": 70 p.getReplAppMetrics(app).walWriteLag += parseInt(value) 71 case "flush_lag": 72 p.getReplAppMetrics(app).walFlushLag += parseInt(value) 73 case "replay_lag": 74 p.getReplAppMetrics(app).walReplayLag += parseInt(value) 75 } 76 }) 77 } 78 79 func (p *Postgres) doQueryReplSlotFiles() error { 80 q := queryReplicationSlotFiles(p.pgVersion) 81 82 var slot string 83 return p.doQuery(q, func(column, value string, _ bool) { 84 switch column { 85 case "slot_name": 86 slot = value 87 p.getReplSlotMetrics(slot).updated = true 88 case "replslot_wal_keep": 89 p.getReplSlotMetrics(slot).walKeep += parseInt(value) 90 case "replslot_files": 91 p.getReplSlotMetrics(slot).files += parseInt(value) 92 } 93 }) 94 }