github.com/netdata/go.d.plugin@v0.58.1/modules/postgres/do_query_tables.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package postgres
     4  
     5  import (
     6  	"database/sql"
     7  	"strings"
     8  )
     9  
    10  func (p *Postgres) doQueryTablesMetrics() error {
    11  	if err := p.doQueryStatUserTable(); err != nil {
    12  		return err
    13  	}
    14  	if err := p.doQueryStatIOUserTables(); err != nil {
    15  		return err
    16  	}
    17  
    18  	return nil
    19  }
    20  
    21  func (p *Postgres) doQueryStatUserTable() error {
    22  	if err := p.doDBQueryStatUserTables(p.db); err != nil {
    23  		p.Warning(err)
    24  	}
    25  	for _, conn := range p.dbConns {
    26  		if conn.db == nil {
    27  			continue
    28  		}
    29  		if err := p.doDBQueryStatUserTables(conn.db); err != nil {
    30  			p.Warning(err)
    31  		}
    32  	}
    33  	return nil
    34  }
    35  
    36  func (p *Postgres) doQueryStatIOUserTables() error {
    37  	if err := p.doDBQueryStatIOUserTables(p.db); err != nil {
    38  		p.Warning(err)
    39  	}
    40  	for _, conn := range p.dbConns {
    41  		if conn.db == nil {
    42  			continue
    43  		}
    44  		if err := p.doDBQueryStatIOUserTables(conn.db); err != nil {
    45  			p.Warning(err)
    46  		}
    47  	}
    48  	return nil
    49  }
    50  
    51  func (p *Postgres) doDBQueryStatUserTables(db *sql.DB) error {
    52  	q := queryStatUserTables()
    53  
    54  	var dbname, schema, name string
    55  	return p.doDBQuery(db, q, func(column, value string, _ bool) {
    56  		if value == "" && strings.HasPrefix(column, "last_") {
    57  			value = "-1"
    58  		}
    59  		switch column {
    60  		case "datname":
    61  			dbname = value
    62  		case "schemaname":
    63  			schema = value
    64  		case "relname":
    65  			name = value
    66  			p.getTableMetrics(name, dbname, schema).updated = true
    67  		case "parent_relname":
    68  			p.getTableMetrics(name, dbname, schema).parentName = value
    69  		case "seq_scan":
    70  			p.getTableMetrics(name, dbname, schema).seqScan = parseInt(value)
    71  		case "seq_tup_read":
    72  			p.getTableMetrics(name, dbname, schema).seqTupRead = parseInt(value)
    73  		case "idx_scan":
    74  			p.getTableMetrics(name, dbname, schema).idxScan = parseInt(value)
    75  		case "idx_tup_fetch":
    76  			p.getTableMetrics(name, dbname, schema).idxTupFetch = parseInt(value)
    77  		case "n_tup_ins":
    78  			p.getTableMetrics(name, dbname, schema).nTupIns = parseInt(value)
    79  		case "n_tup_upd":
    80  			p.getTableMetrics(name, dbname, schema).nTupUpd.last = parseInt(value)
    81  		case "n_tup_del":
    82  			p.getTableMetrics(name, dbname, schema).nTupDel = parseInt(value)
    83  		case "n_tup_hot_upd":
    84  			p.getTableMetrics(name, dbname, schema).nTupHotUpd.last = parseInt(value)
    85  		case "n_live_tup":
    86  			p.getTableMetrics(name, dbname, schema).nLiveTup = parseInt(value)
    87  		case "n_dead_tup":
    88  			p.getTableMetrics(name, dbname, schema).nDeadTup = parseInt(value)
    89  		case "last_vacuum":
    90  			p.getTableMetrics(name, dbname, schema).lastVacuumAgo = parseFloat(value)
    91  		case "last_autovacuum":
    92  			p.getTableMetrics(name, dbname, schema).lastAutoVacuumAgo = parseFloat(value)
    93  		case "last_analyze":
    94  			p.getTableMetrics(name, dbname, schema).lastAnalyzeAgo = parseFloat(value)
    95  		case "last_autoanalyze":
    96  			p.getTableMetrics(name, dbname, schema).lastAutoAnalyzeAgo = parseFloat(value)
    97  		case "vacuum_count":
    98  			p.getTableMetrics(name, dbname, schema).vacuumCount = parseInt(value)
    99  		case "autovacuum_count":
   100  			p.getTableMetrics(name, dbname, schema).autovacuumCount = parseInt(value)
   101  		case "analyze_count":
   102  			p.getTableMetrics(name, dbname, schema).analyzeCount = parseInt(value)
   103  		case "autoanalyze_count":
   104  			p.getTableMetrics(name, dbname, schema).autoAnalyzeCount = parseInt(value)
   105  		case "total_relation_size":
   106  			p.getTableMetrics(name, dbname, schema).totalSize = parseInt(value)
   107  		}
   108  	})
   109  }
   110  
   111  func (p *Postgres) doDBQueryStatIOUserTables(db *sql.DB) error {
   112  	q := queryStatIOUserTables()
   113  
   114  	var dbname, schema, name string
   115  	return p.doDBQuery(db, q, func(column, value string, rowEnd bool) {
   116  		if value == "" && column != "parent_relname" {
   117  			value = "-1"
   118  		}
   119  		switch column {
   120  		case "datname":
   121  			dbname = value
   122  		case "schemaname":
   123  			schema = value
   124  		case "relname":
   125  			name = value
   126  			p.getTableMetrics(name, dbname, schema).updated = true
   127  		case "parent_relname":
   128  			p.getTableMetrics(name, dbname, schema).parentName = value
   129  		case "heap_blks_read_bytes":
   130  			p.getTableMetrics(name, dbname, schema).heapBlksRead.last = parseInt(value)
   131  		case "heap_blks_hit_bytes":
   132  			p.getTableMetrics(name, dbname, schema).heapBlksHit.last = parseInt(value)
   133  		case "idx_blks_read_bytes":
   134  			p.getTableMetrics(name, dbname, schema).idxBlksRead.last = parseInt(value)
   135  		case "idx_blks_hit_bytes":
   136  			p.getTableMetrics(name, dbname, schema).idxBlksHit.last = parseInt(value)
   137  		case "toast_blks_read_bytes":
   138  			p.getTableMetrics(name, dbname, schema).toastBlksRead.last = parseInt(value)
   139  		case "toast_blks_hit_bytes":
   140  			p.getTableMetrics(name, dbname, schema).toastBlksHit.last = parseInt(value)
   141  		case "tidx_blks_read_bytes":
   142  			p.getTableMetrics(name, dbname, schema).tidxBlksRead.last = parseInt(value)
   143  		case "tidx_blks_hit_bytes":
   144  			p.getTableMetrics(name, dbname, schema).tidxBlksHit.last = parseInt(value)
   145  		}
   146  	})
   147  }