diff --git a/plugins/inputs/postgresql/README.md b/plugins/inputs/postgresql/README.md index ce0ae18d6..a0e245f81 100644 --- a/plugins/inputs/postgresql/README.md +++ b/plugins/inputs/postgresql/README.md @@ -1,6 +1,6 @@ # PostgreSQL plugin -This postgresql plugin provides metrics for your postgres database. It currently works with postgres versions 8.1+. It uses data from the built in _pg_stat_database_ view. The metrics recorded depend on your version of postgres. See table: +This postgresql plugin provides metrics for your postgres database. It currently works with postgres versions 8.1+. It uses data from the built in _pg_stat_database_ and pg_stat_bgwriter views. The metrics recorded depend on your version of postgres. See table: ``` pg version 9.2+ 9.1 8.3-9.0 8.1-8.2 7.4-8.0(unsupported) --- --- --- ------- ------- ------- @@ -27,4 +27,6 @@ stats_reset* x x _* value ignored and therefore not recorded._ + + More information about the meaning of these metrics can be found in the [PostgreSQL Documentation](http://www.postgresql.org/docs/9.2/static/monitoring-stats.html#PG-STAT-DATABASE-VIEW) diff --git a/plugins/inputs/postgresql/postgresql.go b/plugins/inputs/postgresql/postgresql.go index e65cbf3a2..6e1b3cceb 100644 --- a/plugins/inputs/postgresql/postgresql.go +++ b/plugins/inputs/postgresql/postgresql.go @@ -21,22 +21,22 @@ type Postgresql struct { var ignoredColumns = map[string]bool{"datid": true, "datname": true, "stats_reset": true} var sampleConfig = ` - # specify address via a url matching: - # postgres://[pqgotest[:password]]@localhost[/dbname]?sslmode=[disable|verify-ca|verify-full] - # or a simple string: - # host=localhost user=pqotest password=... sslmode=... dbname=app_production - # - # All connection parameters are optional. - # - # Without the dbname parameter, the driver will default to a database - # with the same name as the user. This dbname is just for instantiating a - # connection with the server and doesn't restrict the databases we are trying - # to grab metrics for. - # + ### specify address via a url matching: + ### postgres://[pqgotest[:password]]@localhost[/dbname]?sslmode=[disable|verify-ca|verify-full] + ### or a simple string: + ### host=localhost user=pqotest password=... sslmode=... dbname=app_production + ### + ### All connection parameters are optional. + ### + ### Without the dbname parameter, the driver will default to a database + ### with the same name as the user. This dbname is just for instantiating a + ### connection with the server and doesn't restrict the databases we are trying + ### to grab metrics for. + ### address = "host=localhost user=postgres sslmode=disable" - # A list of databases to pull metrics about. If not specified, metrics for all - # databases are gathered. + ### A list of databases to pull metrics about. If not specified, metrics for all + ### databases are gathered. # databases = ["app_production", "testing"] ` @@ -94,30 +94,29 @@ func (p *Postgresql) Gather(acc telegraf.Accumulator) error { return err } } + //return rows.Err() + query = `SELECT * FROM pg_stat_bgwriter` - query = `SELECT * FROM pg_stat_bgwriter` - - rows, err := db.Query(query) - if err != nil { - return err - } + bg_writer_row, err := db.Query(query) + if err != nil { + return err + } - defer rows.Close() + defer bg_writer_row.Close() - // grab the column information from the result - p.OrderedColumns, err = rows.Columns() - if err != nil { - return err - } + // grab the column information from the result + p.OrderedColumns, err = bg_writer_row.Columns() + if err != nil { + return err + } - for rows.Next() { - err = p.accRow(rows, acc) - if err != nil { - return err - } - } - - return rows.Err() + for bg_writer_row.Next() { + err = p.accRow(bg_writer_row, acc) + if err != nil { + return err + } + } + return bg_writer_row.Err() } type scanner interface { @@ -146,11 +145,14 @@ func (p *Postgresql) accRow(row scanner, acc telegraf.Accumulator) error { if err != nil { return err } - - // extract the database name from the column map - dbnameChars := (*columnMap["datname"]).([]uint8) - for i := 0; i < len(dbnameChars); i++ { - dbname.WriteString(string(dbnameChars[i])) + if columnMap["datname"] != nil { + // extract the database name from the column map + dbnameChars := (*columnMap["datname"]).([]uint8) + for i := 0; i < len(dbnameChars); i++ { + dbname.WriteString(string(dbnameChars[i])) + } + } else { + dbname.WriteString("postgres") } tags := map[string]string{"server": p.Address, "db": dbname.String()}