github.com/netdata/go.d.plugin@v0.58.1/modules/pgbouncer/charts.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package pgbouncer 4 5 import ( 6 "fmt" 7 "strings" 8 9 "github.com/netdata/go.d.plugin/agent/module" 10 ) 11 12 const ( 13 prioClientConnectionsUtilization = module.Priority + iota 14 prioDBClientConnections 15 prioDBServerConnections 16 prioDBServerConnectionsUtilization 17 prioDBClientsWaitTime 18 prioDBClientsWaitMaxTime 19 prioDBTransactions 20 prioDBTransactionsTime 21 prioDBTransactionsAvgTime 22 prioDBQueries 23 prioDBQueriesTime 24 prioDBQueryAvgTime 25 prioDBNetworkIO 26 ) 27 28 var ( 29 globalCharts = module.Charts{ 30 clientConnectionsUtilization.Copy(), 31 } 32 33 clientConnectionsUtilization = module.Chart{ 34 ID: "client_connections_utilization", 35 Title: "Client connections utilization", 36 Units: "percentage", 37 Fam: "client connections", 38 Ctx: "pgbouncer.client_connections_utilization", 39 Priority: prioClientConnectionsUtilization, 40 Dims: module.Dims{ 41 {ID: "cl_conns_utilization", Name: "used"}, 42 }, 43 } 44 ) 45 46 var ( 47 dbChartsTmpl = module.Charts{ 48 dbClientConnectionsTmpl.Copy(), 49 50 dbServerConnectionsUtilizationTmpl.Copy(), 51 dbServerConnectionsTmpl.Copy(), 52 53 dbClientsWaitTimeChartTmpl.Copy(), 54 dbClientMaxWaitTimeChartTmpl.Copy(), 55 56 dbTransactionsChartTmpl.Copy(), 57 dbTransactionsTimeChartTmpl.Copy(), 58 dbTransactionAvgTimeChartTmpl.Copy(), 59 60 dbQueriesChartTmpl.Copy(), 61 dbQueriesTimeChartTmpl.Copy(), 62 dbQueryAvgTimeChartTmpl.Copy(), 63 64 dbNetworkIOChartTmpl.Copy(), 65 } 66 67 dbClientConnectionsTmpl = module.Chart{ 68 ID: "db_%s_client_connections", 69 Title: "Database client connections", 70 Units: "connections", 71 Fam: "client connections", 72 Ctx: "pgbouncer.db_client_connections", 73 Priority: prioDBClientConnections, 74 Type: module.Stacked, 75 Dims: module.Dims{ 76 {ID: "db_%s_cl_active", Name: "active"}, 77 {ID: "db_%s_cl_waiting", Name: "waiting"}, 78 {ID: "db_%s_cl_cancel_req", Name: "cancel_req"}, 79 }, 80 } 81 82 dbServerConnectionsTmpl = module.Chart{ 83 ID: "db_%s_server_connections", 84 Title: "Database server connections", 85 Units: "connections", 86 Fam: "server connections", 87 Ctx: "pgbouncer.db_server_connections", 88 Priority: prioDBServerConnections, 89 Type: module.Stacked, 90 Dims: module.Dims{ 91 {ID: "db_%s_sv_active", Name: "active"}, 92 {ID: "db_%s_sv_idle", Name: "idle"}, 93 {ID: "db_%s_sv_used", Name: "used"}, 94 {ID: "db_%s_sv_tested", Name: "tested"}, 95 {ID: "db_%s_sv_login", Name: "login"}, 96 }, 97 } 98 99 dbServerConnectionsUtilizationTmpl = module.Chart{ 100 ID: "db_%s_server_connections_utilization", 101 Title: "Database server connections utilization", 102 Units: "percentage", 103 Fam: "server connections limit", 104 Ctx: "pgbouncer.db_server_connections_utilization", 105 Priority: prioDBServerConnectionsUtilization, 106 Dims: module.Dims{ 107 {ID: "db_%s_sv_conns_utilization", Name: "used"}, 108 }, 109 } 110 111 dbClientsWaitTimeChartTmpl = module.Chart{ 112 ID: "db_%s_clients_wait_time", 113 Title: "Database clients wait time", 114 Units: "seconds", 115 Fam: "clients wait time", 116 Ctx: "pgbouncer.db_clients_wait_time", 117 Priority: prioDBClientsWaitTime, 118 Dims: module.Dims{ 119 {ID: "db_%s_total_wait_time", Name: "time", Algo: module.Incremental, Div: 1e6}, 120 }, 121 } 122 dbClientMaxWaitTimeChartTmpl = module.Chart{ 123 ID: "db_%s_client_max_wait_time", 124 Title: "Database client max wait time", 125 Units: "seconds", 126 Fam: "client max wait time", 127 Ctx: "pgbouncer.db_client_max_wait_time", 128 Priority: prioDBClientsWaitMaxTime, 129 Dims: module.Dims{ 130 {ID: "db_%s_maxwait", Name: "time", Div: 1e6}, 131 }, 132 } 133 134 dbTransactionsChartTmpl = module.Chart{ 135 ID: "db_%s_transactions", 136 Title: "Database pooled SQL transactions", 137 Units: "transactions/s", 138 Fam: "transactions", 139 Ctx: "pgbouncer.db_transactions", 140 Priority: prioDBTransactions, 141 Dims: module.Dims{ 142 {ID: "db_%s_total_xact_count", Name: "transactions", Algo: module.Incremental}, 143 }, 144 } 145 dbTransactionsTimeChartTmpl = module.Chart{ 146 ID: "db_%s_transactions_time", 147 Title: "Database transactions time", 148 Units: "seconds", 149 Fam: "transactions time", 150 Ctx: "pgbouncer.db_transactions_time", 151 Priority: prioDBTransactionsTime, 152 Dims: module.Dims{ 153 {ID: "db_%s_total_xact_time", Name: "time", Algo: module.Incremental, Div: 1e6}, 154 }, 155 } 156 dbTransactionAvgTimeChartTmpl = module.Chart{ 157 ID: "db_%s_transactions_average_time", 158 Title: "Database transaction average time", 159 Units: "seconds", 160 Fam: "transaction avg time", 161 Ctx: "pgbouncer.db_transaction_avg_time", 162 Priority: prioDBTransactionsAvgTime, 163 Dims: module.Dims{ 164 {ID: "db_%s_avg_xact_time", Name: "time", Algo: module.Incremental, Div: 1e6}, 165 }, 166 } 167 168 dbQueriesChartTmpl = module.Chart{ 169 ID: "db_%s_queries", 170 Title: "Database pooled SQL queries", 171 Units: "queries/s", 172 Fam: "queries", 173 Ctx: "pgbouncer.db_queries", 174 Priority: prioDBQueries, 175 Dims: module.Dims{ 176 {ID: "db_%s_total_query_count", Name: "queries", Algo: module.Incremental}, 177 }, 178 } 179 dbQueriesTimeChartTmpl = module.Chart{ 180 ID: "db_%s_queries_time", 181 Title: "Database queries time", 182 Units: "seconds", 183 Fam: "queries time", 184 Ctx: "pgbouncer.db_queries_time", 185 Priority: prioDBQueriesTime, 186 Dims: module.Dims{ 187 {ID: "db_%s_total_query_time", Name: "time", Algo: module.Incremental, Div: 1e6}, 188 }, 189 } 190 dbQueryAvgTimeChartTmpl = module.Chart{ 191 ID: "db_%s_query_average_time", 192 Title: "Database query average time", 193 Units: "seconds", 194 Fam: "query avg time", 195 Ctx: "pgbouncer.db_query_avg_time", 196 Priority: prioDBQueryAvgTime, 197 Dims: module.Dims{ 198 {ID: "db_%s_avg_query_time", Name: "time", Algo: module.Incremental, Div: 1e6}, 199 }, 200 } 201 202 dbNetworkIOChartTmpl = module.Chart{ 203 ID: "db_%s_network_io", 204 Title: "Database traffic", 205 Units: "B/s", 206 Fam: "traffic", 207 Ctx: "pgbouncer.db_network_io", 208 Priority: prioDBNetworkIO, 209 Type: module.Area, 210 Dims: module.Dims{ 211 {ID: "db_%s_total_received", Name: "received", Algo: module.Incremental}, 212 {ID: "db_%s_total_sent", Name: "sent", Algo: module.Incremental, Mul: -1}, 213 }, 214 } 215 ) 216 217 func newDatabaseCharts(dbname, pgDBName string) *module.Charts { 218 charts := dbChartsTmpl.Copy() 219 for _, c := range *charts { 220 c.ID = fmt.Sprintf(c.ID, dbname) 221 c.Labels = []module.Label{ 222 {Key: "database", Value: dbname}, 223 {Key: "postgres_database", Value: pgDBName}, 224 } 225 for _, d := range c.Dims { 226 d.ID = fmt.Sprintf(d.ID, dbname) 227 } 228 } 229 return charts 230 } 231 232 func (p *PgBouncer) addNewDatabaseCharts(dbname, pgDBName string) { 233 charts := newDatabaseCharts(dbname, pgDBName) 234 if err := p.Charts().Add(*charts...); err != nil { 235 p.Warning(err) 236 } 237 } 238 239 func (p *PgBouncer) removeDatabaseCharts(dbname string) { 240 prefix := fmt.Sprintf("db_%s_", dbname) 241 for _, c := range *p.Charts() { 242 if strings.HasPrefix(c.ID, prefix) { 243 c.MarkRemove() 244 c.MarkNotCreated() 245 } 246 } 247 }