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  }