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

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package postgres
     4  
     5  import "database/sql"
     6  
     7  func (p *Postgres) doQueryBloat() error {
     8  	if err := p.doDBQueryBloat(p.db); err != nil {
     9  		p.Warning(err)
    10  	}
    11  	for _, conn := range p.dbConns {
    12  		if conn.db == nil {
    13  			continue
    14  		}
    15  		if err := p.doDBQueryBloat(conn.db); err != nil {
    16  			p.Warning(err)
    17  		}
    18  	}
    19  	return nil
    20  }
    21  
    22  func (p *Postgres) doDBQueryBloat(db *sql.DB) error {
    23  	q := queryBloat()
    24  
    25  	var dbname, schema, table, iname string
    26  	var tableWasted, idxWasted int64
    27  	return p.doDBQuery(db, q, func(column, value string, rowEnd bool) {
    28  		switch column {
    29  		case "db":
    30  			dbname = value
    31  		case "schemaname":
    32  			schema = value
    33  		case "tablename":
    34  			table = value
    35  		case "wastedbytes":
    36  			tableWasted = parseFloat(value)
    37  		case "iname":
    38  			iname = value
    39  		case "wastedibytes":
    40  			idxWasted = parseFloat(value)
    41  		}
    42  		if !rowEnd {
    43  			return
    44  		}
    45  		if p.hasTableMetrics(table, dbname, schema) {
    46  			v := p.getTableMetrics(table, dbname, schema)
    47  			v.bloatSize = newInt(tableWasted)
    48  			v.bloatSizePerc = newInt(calcPercentage(tableWasted, v.totalSize))
    49  		}
    50  		if iname != "?" && p.hasIndexMetrics(iname, table, dbname, schema) {
    51  			v := p.getIndexMetrics(iname, table, dbname, schema)
    52  			v.bloatSize = newInt(idxWasted)
    53  			v.bloatSizePerc = newInt(calcPercentage(idxWasted, v.size))
    54  		}
    55  	})
    56  }