summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/proxysql/charts.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/proxysql/charts.go726
1 files changed, 726 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/proxysql/charts.go b/src/go/collectors/go.d.plugin/modules/proxysql/charts.go
new file mode 100644
index 000000000..34e012740
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/proxysql/charts.go
@@ -0,0 +1,726 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package proxysql
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+)
+
+// TODO: check https://github.com/ProxySQL/proxysql-grafana-prometheus/blob/main/grafana/provisioning/dashboards/ProxySQL-Host-Statistics.json
+
+const (
+ prioClientConnectionsCount = module.Priority + iota
+ prioClientConnectionsRate
+ prioServerConnectionsCount
+ prioServerConnectionsRate
+ prioBackendsTraffic
+ prioFrontendsTraffic
+ prioActiveTransactionsCount
+ prioQuestionsRate
+ prioSlowQueriesRate
+ prioQueriesRate
+ prioBackendStatementsCount
+ prioBackendStatementsRate
+ prioFrontendStatementsCount
+ prioFrontendStatementsRate
+ prioCachedStatementsCount
+ prioQueryCacheEntriesCount
+ prioQueryCacheIO
+ prioQueryCacheRequestsRate
+ prioQueryCacheMemoryUsed
+ prioMySQLMonitorWorkersCount
+ prioMySQLMonitorWorkersRate
+ prioMySQLMonitorConnectChecksRate
+ prioMySQLMonitorPingChecksRate
+ prioMySQLMonitorReadOnlyChecksRate
+ prioMySQLMonitorReplicationLagChecksRate
+ prioJemallocMemoryUsed
+ prioMemoryUsed
+ prioMySQLCommandExecutionsRate
+ prioMySQLCommandExecutionTime
+ prioMySQLCommandExecutionDurationHistogram
+ prioMySQLUserConnectionsUtilization
+ prioMySQLUserConnectionsCount
+ prioBackendStatus
+ prioBackendConnectionsUsage
+ prioBackendConnectionsRate
+ prioBackendQueriesRateRate
+ prioBackendTraffic
+ prioBackendLatency
+ prioUptime
+)
+
+var (
+ baseCharts = module.Charts{
+ clientConnectionsCountChart.Copy(),
+ clientConnectionsRateChart.Copy(),
+ serverConnectionsCountChart.Copy(),
+ serverConnectionsRateChart.Copy(),
+ backendsTrafficChart.Copy(),
+ frontendsTrafficChart.Copy(),
+ activeTransactionsCountChart.Copy(),
+ questionsRateChart.Copy(),
+ slowQueriesRateChart.Copy(),
+ queriesRateChart.Copy(),
+ backendStatementsCountChart.Copy(),
+ backendStatementsRateChart.Copy(),
+ clientStatementsCountChart.Copy(),
+ clientStatementsRateChart.Copy(),
+ cachedStatementsCountChart.Copy(),
+ queryCacheEntriesCountChart.Copy(),
+ queryCacheIOChart.Copy(),
+ queryCacheRequestsRateChart.Copy(),
+ queryCacheMemoryUsedChart.Copy(),
+ mySQLMonitorWorkersCountChart.Copy(),
+ mySQLMonitorWorkersRateChart.Copy(),
+ mySQLMonitorConnectChecksRateChart.Copy(),
+ mySQLMonitorPingChecksRateChart.Copy(),
+ mySQLMonitorReadOnlyChecksRateChart.Copy(),
+ mySQLMonitorReplicationLagChecksRateChart.Copy(),
+ jemallocMemoryUsedChart.Copy(),
+ memoryUsedCountChart.Copy(),
+ uptimeChart.Copy(),
+ }
+
+ clientConnectionsCountChart = module.Chart{
+ ID: "client_connections_count",
+ Title: "Client connections",
+ Units: "connections",
+ Fam: "connections",
+ Ctx: "proxysql.client_connections_count",
+ Priority: prioClientConnectionsCount,
+ Dims: module.Dims{
+ {ID: "Client_Connections_connected", Name: "connected"},
+ {ID: "Client_Connections_non_idle", Name: "non_idle"},
+ {ID: "Client_Connections_hostgroup_locked", Name: "hostgroup_locked"},
+ },
+ }
+ clientConnectionsRateChart = module.Chart{
+ ID: "client_connections_rate",
+ Title: "Client connections rate",
+ Units: "connections/s",
+ Fam: "connections",
+ Ctx: "proxysql.client_connections_rate",
+ Priority: prioClientConnectionsRate,
+ Dims: module.Dims{
+ {ID: "Client_Connections_created", Name: "created", Algo: module.Incremental},
+ {ID: "Client_Connections_aborted", Name: "aborted", Algo: module.Incremental},
+ },
+ }
+
+ serverConnectionsCountChart = module.Chart{
+ ID: "server_connections_count",
+ Title: "Server connections",
+ Units: "connections",
+ Fam: "connections",
+ Ctx: "proxysql.server_connections_count",
+ Priority: prioServerConnectionsCount,
+ Dims: module.Dims{
+ {ID: "Server_Connections_connected", Name: "connected"},
+ },
+ }
+ serverConnectionsRateChart = module.Chart{
+ ID: "server_connections_rate",
+ Title: "Server connections rate",
+ Units: "connections/s",
+ Fam: "connections",
+ Ctx: "proxysql.server_connections_rate",
+ Priority: prioServerConnectionsRate,
+ Dims: module.Dims{
+ {ID: "Server_Connections_created", Name: "created", Algo: module.Incremental},
+ {ID: "Server_Connections_aborted", Name: "aborted", Algo: module.Incremental},
+ {ID: "Server_Connections_delayed", Name: "delayed", Algo: module.Incremental},
+ },
+ }
+
+ backendsTrafficChart = module.Chart{
+ ID: "backends_traffic",
+ Title: "Backends traffic",
+ Units: "B/s",
+ Fam: "traffic",
+ Ctx: "proxysql.backends_traffic",
+ Priority: prioBackendsTraffic,
+ Dims: module.Dims{
+ {ID: "Queries_backends_bytes_recv", Name: "recv", Algo: module.Incremental},
+ {ID: "Queries_backends_bytes_sent", Name: "sent", Algo: module.Incremental},
+ },
+ }
+ frontendsTrafficChart = module.Chart{
+ ID: "clients_traffic",
+ Title: "Clients traffic",
+ Units: "B/s",
+ Fam: "traffic",
+ Ctx: "proxysql.clients_traffic",
+ Priority: prioFrontendsTraffic,
+ Dims: module.Dims{
+ {ID: "Queries_frontends_bytes_recv", Name: "recv", Algo: module.Incremental},
+ {ID: "Queries_frontends_bytes_sent", Name: "sent", Algo: module.Incremental},
+ },
+ }
+
+ activeTransactionsCountChart = module.Chart{
+ ID: "active_transactions_count",
+ Title: "Client connections that are currently processing a transaction",
+ Units: "transactions",
+ Fam: "transactions",
+ Ctx: "proxysql.active_transactions_count",
+ Priority: prioActiveTransactionsCount,
+ Dims: module.Dims{
+ {ID: "Active_Transactions", Name: "active"},
+ },
+ }
+ questionsRateChart = module.Chart{
+ ID: "questions_rate",
+ Title: "Client requests / statements executed",
+ Units: "questions/s",
+ Fam: "queries",
+ Ctx: "proxysql.questions_rate",
+ Priority: prioQuestionsRate,
+ Dims: module.Dims{
+ {ID: "Questions", Name: "questions", Algo: module.Incremental},
+ },
+ }
+ slowQueriesRateChart = module.Chart{
+ ID: "slow_queries_rate",
+ Title: "Slow queries",
+ Units: "queries/s",
+ Fam: "queries",
+ Ctx: "proxysql.slow_queries_rate",
+ Priority: prioSlowQueriesRate,
+ Dims: module.Dims{
+ {ID: "Slow_queries", Name: "slow", Algo: module.Incremental},
+ },
+ }
+ queriesRateChart = module.Chart{
+ ID: "queries_rate",
+ Title: "Queries rate",
+ Units: "queries/s",
+ Fam: "queries",
+ Ctx: "proxysql.queries_rate",
+ Priority: prioQueriesRate,
+ Type: module.Stacked,
+ Dims: module.Dims{
+ {ID: "Com_autocommit", Name: "autocommit", Algo: module.Incremental},
+ {ID: "Com_autocommit_filtered", Name: "autocommit_filtered", Algo: module.Incremental},
+ {ID: "Com_commit", Name: "commit", Algo: module.Incremental},
+ {ID: "Com_commit_filtered", Name: "commit_filtered", Algo: module.Incremental},
+ {ID: "Com_rollback", Name: "rollback", Algo: module.Incremental},
+ {ID: "Com_rollback_filtered", Name: "rollback_filtered", Algo: module.Incremental},
+ {ID: "Com_backend_change_user", Name: "backend_change_user", Algo: module.Incremental},
+ {ID: "Com_backend_init_db", Name: "backend_init_db", Algo: module.Incremental},
+ {ID: "Com_backend_set_names", Name: "backend_set_names", Algo: module.Incremental},
+ {ID: "Com_frontend_init_db", Name: "frontend_init_db", Algo: module.Incremental},
+ {ID: "Com_frontend_set_names", Name: "frontend_set_names", Algo: module.Incremental},
+ {ID: "Com_frontend_use_db", Name: "frontend_use_db", Algo: module.Incremental},
+ },
+ }
+
+ backendStatementsCountChart = module.Chart{
+ ID: "backend_statements_count",
+ Title: "Statements available across all backend connections",
+ Units: "statements",
+ Fam: "statements",
+ Ctx: "proxysql.backend_statements_count",
+ Priority: prioBackendStatementsCount,
+ Dims: module.Dims{
+ {ID: "Stmt_Server_Active_Total", Name: "total"},
+ {ID: "Stmt_Server_Active_Unique", Name: "unique"},
+ },
+ }
+ backendStatementsRateChart = module.Chart{
+ ID: "backend_statements_rate",
+ Title: "Statements executed against the backends",
+ Units: "statements/s",
+ Fam: "statements",
+ Ctx: "proxysql.backend_statements_rate",
+ Priority: prioBackendStatementsRate,
+ Type: module.Stacked,
+ Dims: module.Dims{
+ {ID: "Com_backend_stmt_prepare", Name: "prepare", Algo: module.Incremental},
+ {ID: "Com_backend_stmt_execute", Name: "execute", Algo: module.Incremental},
+ {ID: "Com_backend_stmt_close", Name: "close", Algo: module.Incremental},
+ },
+ }
+ clientStatementsCountChart = module.Chart{
+ ID: "client_statements_count",
+ Title: "Statements that are in use by clients",
+ Units: "statements",
+ Fam: "statements",
+ Ctx: "proxysql.client_statements_count",
+ Priority: prioFrontendStatementsCount,
+ Dims: module.Dims{
+ {ID: "Stmt_Client_Active_Total", Name: "total"},
+ {ID: "Stmt_Client_Active_Unique", Name: "unique"},
+ },
+ }
+ clientStatementsRateChart = module.Chart{
+ ID: "client_statements_rate",
+ Title: "Statements executed by clients",
+ Units: "statements/s",
+ Fam: "statements",
+ Ctx: "proxysql.client_statements_rate",
+ Priority: prioFrontendStatementsRate,
+ Type: module.Stacked,
+ Dims: module.Dims{
+ {ID: "Com_frontend_stmt_prepare", Name: "prepare", Algo: module.Incremental},
+ {ID: "Com_frontend_stmt_execute", Name: "execute", Algo: module.Incremental},
+ {ID: "Com_frontend_stmt_close", Name: "close", Algo: module.Incremental},
+ },
+ }
+ cachedStatementsCountChart = module.Chart{
+ ID: "cached_statements_count",
+ Title: "Global prepared statements",
+ Units: "statements",
+ Fam: "statements",
+ Ctx: "proxysql.cached_statements_count",
+ Priority: prioCachedStatementsCount,
+ Dims: module.Dims{
+ {ID: "Stmt_Cached", Name: "cached"},
+ },
+ }
+
+ queryCacheEntriesCountChart = module.Chart{
+ ID: "query_cache_entries_count",
+ Title: "Query Cache entries",
+ Units: "entries",
+ Fam: "query cache",
+ Ctx: "proxysql.query_cache_entries_count",
+ Priority: prioQueryCacheEntriesCount,
+ Dims: module.Dims{
+ {ID: "Query_Cache_Entries", Name: "entries"},
+ },
+ }
+ queryCacheMemoryUsedChart = module.Chart{
+ ID: "query_cache_memory_used",
+ Title: "Query Cache memory used",
+ Units: "B",
+ Fam: "query cache",
+ Ctx: "proxysql.query_cache_memory_used",
+ Priority: prioQueryCacheMemoryUsed,
+ Dims: module.Dims{
+ {ID: "Query_Cache_Memory_bytes", Name: "used"},
+ },
+ }
+ queryCacheIOChart = module.Chart{
+ ID: "query_cache_io",
+ Title: "Query Cache I/O",
+ Units: "B/s",
+ Fam: "query cache",
+ Ctx: "proxysql.query_cache_io",
+ Priority: prioQueryCacheIO,
+ Dims: module.Dims{
+ {ID: "Query_Cache_bytes_IN", Name: "in", Algo: module.Incremental},
+ {ID: "Query_Cache_bytes_OUT", Name: "out", Algo: module.Incremental},
+ },
+ }
+ queryCacheRequestsRateChart = module.Chart{
+ ID: "query_cache_requests_rate",
+ Title: "Query Cache requests",
+ Units: "requests/s",
+ Fam: "query cache",
+ Ctx: "proxysql.query_cache_requests_rate",
+ Priority: prioQueryCacheRequestsRate,
+ Dims: module.Dims{
+ {ID: "Query_Cache_count_GET", Name: "read", Algo: module.Incremental},
+ {ID: "Query_Cache_count_SET", Name: "write", Algo: module.Incremental},
+ {ID: "Query_Cache_count_GET_OK", Name: "read_success", Algo: module.Incremental},
+ },
+ }
+
+ mySQLMonitorWorkersCountChart = module.Chart{
+ ID: "mysql_monitor_workers_count",
+ Title: "MySQL monitor workers",
+ Units: "threads",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_workers_count",
+ Priority: prioMySQLMonitorWorkersCount,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_Workers", Name: "workers"},
+ {ID: "MySQL_Monitor_Workers_Aux", Name: "auxiliary"},
+ },
+ }
+ mySQLMonitorWorkersRateChart = module.Chart{
+ ID: "mysql_monitor_workers_rate",
+ Title: "MySQL monitor workers rate",
+ Units: "workers/s",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_workers_rate",
+ Priority: prioMySQLMonitorWorkersRate,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_Workers_Started", Name: "started", Algo: module.Incremental},
+ },
+ }
+ mySQLMonitorConnectChecksRateChart = module.Chart{
+ ID: "mysql_monitor_connect_checks_rate",
+ Title: "MySQL monitor connect checks",
+ Units: "checks/s",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_connect_checks_rate",
+ Priority: prioMySQLMonitorConnectChecksRate,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_connect_check_OK", Name: "succeed", Algo: module.Incremental},
+ {ID: "MySQL_Monitor_connect_check_ERR", Name: "failed", Algo: module.Incremental},
+ },
+ }
+ mySQLMonitorPingChecksRateChart = module.Chart{
+ ID: "mysql_monitor_ping_checks_rate",
+ Title: "MySQL monitor ping checks",
+ Units: "checks/s",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_ping_checks_rate",
+ Priority: prioMySQLMonitorPingChecksRate,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_ping_check_OK", Name: "succeed", Algo: module.Incremental},
+ {ID: "MySQL_Monitor_ping_check_ERR", Name: "failed", Algo: module.Incremental},
+ },
+ }
+ mySQLMonitorReadOnlyChecksRateChart = module.Chart{
+ ID: "mysql_monitor_read_only_checks_rate",
+ Title: "MySQL monitor read only checks",
+ Units: "checks/s",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_read_only_checks_rate",
+ Priority: prioMySQLMonitorReadOnlyChecksRate,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_read_only_check_OK", Name: "succeed", Algo: module.Incremental},
+ {ID: "MySQL_Monitor_read_only_check_ERR", Name: "failed", Algo: module.Incremental},
+ },
+ }
+ mySQLMonitorReplicationLagChecksRateChart = module.Chart{
+ ID: "mysql_monitor_replication_lag_checks_rate",
+ Title: "MySQL monitor replication lag checks",
+ Units: "checks/s",
+ Fam: "monitor",
+ Ctx: "proxysql.mysql_monitor_replication_lag_checks_rate",
+ Priority: prioMySQLMonitorReplicationLagChecksRate,
+ Dims: module.Dims{
+ {ID: "MySQL_Monitor_replication_lag_check_OK", Name: "succeed", Algo: module.Incremental},
+ {ID: "MySQL_Monitor_replication_lag_check_ERR", Name: "failed", Algo: module.Incremental},
+ },
+ }
+
+ jemallocMemoryUsedChart = module.Chart{
+ ID: "jemalloc_memory_used",
+ Title: "Jemalloc used memory",
+ Units: "bytes",
+ Fam: "memory",
+ Ctx: "proxysql.jemalloc_memory_used",
+ Type: module.Stacked,
+ Priority: prioJemallocMemoryUsed,
+ Dims: module.Dims{
+ {ID: "jemalloc_active", Name: "active"},
+ {ID: "jemalloc_allocated", Name: "allocated"},
+ {ID: "jemalloc_mapped", Name: "mapped"},
+ {ID: "jemalloc_metadata", Name: "metadata"},
+ {ID: "jemalloc_resident", Name: "resident"},
+ {ID: "jemalloc_retained", Name: "retained"},
+ },
+ }
+ memoryUsedCountChart = module.Chart{
+ ID: "memory_used",
+ Title: "Memory used",
+ Units: "bytes",
+ Fam: "memory",
+ Ctx: "proxysql.memory_used",
+ Priority: prioMemoryUsed,
+ Type: module.Stacked,
+ Dims: module.Dims{
+ {ID: "Auth_memory", Name: "auth"},
+ {ID: "SQLite3_memory_bytes", Name: "sqlite3"},
+ {ID: "query_digest_memory", Name: "query_digest"},
+ {ID: "mysql_query_rules_memory", Name: "query_rules"},
+ {ID: "mysql_firewall_users_table", Name: "firewall_users_table"},
+ {ID: "mysql_firewall_users_config", Name: "firewall_users_config"},
+ {ID: "mysql_firewall_rules_table", Name: "firewall_rules_table"},
+ {ID: "mysql_firewall_rules_config", Name: "firewall_rules_config"},
+ {ID: "stack_memory_mysql_threads", Name: "mysql_threads"},
+ {ID: "stack_memory_admin_threads", Name: "admin_threads"},
+ {ID: "stack_memory_cluster_threads", Name: "cluster_threads"},
+ },
+ }
+ uptimeChart = module.Chart{
+ ID: "proxysql_uptime",
+ Title: "Uptime",
+ Units: "seconds",
+ Fam: "uptime",
+ Ctx: "proxysql.uptime",
+ Priority: prioUptime,
+ Dims: module.Dims{
+ {ID: "ProxySQL_Uptime", Name: "uptime"},
+ },
+ }
+)
+
+var (
+ mySQLCommandChartsTmpl = module.Charts{
+ mySQLCommandExecutionRateChartTmpl.Copy(),
+ mySQLCommandExecutionTimeChartTmpl.Copy(),
+ mySQLCommandExecutionDurationHistogramChartTmpl.Copy(),
+ }
+
+ mySQLCommandExecutionRateChartTmpl = module.Chart{
+ ID: "mysql_command_%s_execution_rate",
+ Title: "MySQL command execution",
+ Units: "commands/s",
+ Fam: "command exec",
+ Ctx: "proxysql.mysql_command_execution_rate",
+ Priority: prioMySQLCommandExecutionsRate,
+ Dims: module.Dims{
+ {ID: "mysql_command_%s_Total_cnt", Name: "commands", Algo: module.Incremental},
+ },
+ }
+ mySQLCommandExecutionTimeChartTmpl = module.Chart{
+ ID: "mysql_command_%s_execution_time",
+ Title: "MySQL command execution time",
+ Units: "microseconds",
+ Fam: "command exec time",
+ Ctx: "proxysql.mysql_command_execution_time",
+ Priority: prioMySQLCommandExecutionTime,
+ Dims: module.Dims{
+ {ID: "mysql_command_%s_Total_Time_us", Name: "time", Algo: module.Incremental},
+ },
+ }
+ mySQLCommandExecutionDurationHistogramChartTmpl = module.Chart{
+ ID: "mysql_command_%s_execution_duration",
+ Title: "MySQL command execution duration histogram",
+ Units: "commands/s",
+ Fam: "command exec duration",
+ Ctx: "proxysql.mysql_command_execution_duration",
+ Type: module.Stacked,
+ Priority: prioMySQLCommandExecutionDurationHistogram,
+ Dims: module.Dims{
+ {ID: "mysql_command_%s_cnt_100us", Name: "100us", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_500us", Name: "500us", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_1ms", Name: "1ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_5ms", Name: "5ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_10ms", Name: "10ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_50ms", Name: "50ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_100ms", Name: "100ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_500ms", Name: "500ms", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_1s", Name: "1s", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_5s", Name: "5s", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_10s", Name: "10s", Algo: module.Incremental},
+ {ID: "mysql_command_%s_cnt_INFs", Name: "+Inf", Algo: module.Incremental},
+ },
+ }
+)
+
+func newMySQLCommandCountersCharts(command string) *module.Charts {
+ charts := mySQLCommandChartsTmpl.Copy()
+
+ for _, chart := range *charts {
+ chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(command))
+ chart.Labels = []module.Label{{Key: "command", Value: command}}
+ for _, dim := range chart.Dims {
+ dim.ID = fmt.Sprintf(dim.ID, command)
+ }
+ }
+
+ return charts
+}
+
+func (p *ProxySQL) addMySQLCommandCountersCharts(command string) {
+ charts := newMySQLCommandCountersCharts(command)
+
+ if err := p.Charts().Add(*charts...); err != nil {
+ p.Warning(err)
+ }
+}
+
+func (p *ProxySQL) removeMySQLCommandCountersCharts(command string) {
+ prefix := "mysql_command_" + strings.ToLower(command)
+
+ for _, chart := range *p.Charts() {
+ if strings.HasPrefix(chart.ID, prefix) {
+ chart.MarkRemove()
+ chart.MarkNotCreated()
+ }
+ }
+}
+
+var (
+ mySQLUserChartsTmpl = module.Charts{
+ mySQLUserConnectionsUtilizationChartTmpl.Copy(),
+ mySQLUserConnectionsCountChartTmpl.Copy(),
+ }
+
+ mySQLUserConnectionsUtilizationChartTmpl = module.Chart{
+ ID: "mysql_user_%s_connections_utilization",
+ Title: "MySQL user connections utilization",
+ Units: "percentage",
+ Fam: "user conns",
+ Ctx: "proxysql.mysql_user_connections_utilization",
+ Priority: prioMySQLUserConnectionsUtilization,
+ Dims: module.Dims{
+ {ID: "mysql_user_%s_frontend_connections_utilization", Name: "used"},
+ },
+ }
+ mySQLUserConnectionsCountChartTmpl = module.Chart{
+ ID: "mysql_user_%s_connections_count",
+ Title: "MySQL user connections used",
+ Units: "connections",
+ Fam: "user conns",
+ Ctx: "proxysql.mysql_user_connections_count",
+ Priority: prioMySQLUserConnectionsCount,
+ Dims: module.Dims{
+ {ID: "mysql_user_%s_frontend_connections", Name: "used"},
+ },
+ }
+)
+
+func newMySQLUserCharts(username string) *module.Charts {
+ charts := mySQLUserChartsTmpl.Copy()
+
+ for _, chart := range *charts {
+ chart.ID = fmt.Sprintf(chart.ID, username)
+ chart.Labels = []module.Label{{Key: "user", Value: username}}
+ for _, dim := range chart.Dims {
+ dim.ID = fmt.Sprintf(dim.ID, username)
+ }
+ }
+
+ return charts
+}
+
+func (p *ProxySQL) addMySQLUsersCharts(username string) {
+ charts := newMySQLUserCharts(username)
+
+ if err := p.Charts().Add(*charts...); err != nil {
+ p.Warning(err)
+ }
+}
+
+func (p *ProxySQL) removeMySQLUserCharts(user string) {
+ prefix := "mysql_user_" + user
+
+ for _, chart := range *p.Charts() {
+ if strings.HasPrefix(chart.ID, prefix) {
+ chart.MarkRemove()
+ chart.MarkNotCreated()
+ }
+ }
+}
+
+var (
+ backendChartsTmpl = module.Charts{
+ backendStatusChartTmpl.Copy(),
+ backendConnectionsUsageChartTmpl.Copy(),
+ backendConnectionsRateChartTmpl.Copy(),
+ backendQueriesRateRateChartTmpl.Copy(),
+ backendTrafficChartTmpl.Copy(),
+ backendLatencyChartTmpl.Copy(),
+ }
+
+ backendStatusChartTmpl = module.Chart{
+ ID: "backend_%s_status",
+ Title: "Backend status",
+ Units: "status",
+ Fam: "backend status",
+ Ctx: "proxysql.backend_status",
+ Priority: prioBackendStatus,
+ Dims: module.Dims{
+ {ID: "backend_%s_status_ONLINE", Name: "online"},
+ {ID: "backend_%s_status_SHUNNED", Name: "shunned"},
+ {ID: "backend_%s_status_OFFLINE_SOFT", Name: "offline_soft"},
+ {ID: "backend_%s_status_OFFLINE_HARD", Name: "offline_hard"},
+ },
+ }
+ backendConnectionsUsageChartTmpl = module.Chart{
+ ID: "backend_%s_connections_usage",
+ Title: "Backend connections usage",
+ Units: "connections",
+ Fam: "backend conns usage",
+ Ctx: "proxysql.backend_connections_usage",
+ Type: module.Stacked,
+ Priority: prioBackendConnectionsUsage,
+ Dims: module.Dims{
+ {ID: "backend_%s_ConnFree", Name: "free"},
+ {ID: "backend_%s_ConnUsed", Name: "used"},
+ },
+ }
+ backendConnectionsRateChartTmpl = module.Chart{
+ ID: "backend_%s_connections_rate",
+ Title: "Backend connections established",
+ Units: "connections/s",
+ Fam: "backend conns established",
+ Ctx: "proxysql.backend_connections_rate",
+ Priority: prioBackendConnectionsRate,
+ Dims: module.Dims{
+ {ID: "backend_%s_ConnOK", Name: "succeed", Algo: module.Incremental},
+ {ID: "backend_%s_ConnERR", Name: "failed", Algo: module.Incremental},
+ },
+ }
+ backendQueriesRateRateChartTmpl = module.Chart{
+ ID: "backend_%s_queries_rate",
+ Title: "Backend queries",
+ Units: "queries/s",
+ Fam: "backend queries",
+ Ctx: "proxysql.backend_queries_rate",
+ Priority: prioBackendQueriesRateRate,
+ Dims: module.Dims{
+ {ID: "backend_%s_Queries", Name: "queries", Algo: module.Incremental},
+ },
+ }
+ backendTrafficChartTmpl = module.Chart{
+ ID: "backend_%s_traffic",
+ Title: "Backend traffic",
+ Units: "B/s",
+ Fam: "backend traffic",
+ Ctx: "proxysql.backend_traffic",
+ Priority: prioBackendTraffic,
+ Dims: module.Dims{
+ {ID: "backend_%s_Bytes_data_recv", Name: "recv", Algo: module.Incremental},
+ {ID: "backend_%s_Bytes_data_sent", Name: "sent", Algo: module.Incremental},
+ },
+ }
+ backendLatencyChartTmpl = module.Chart{
+ ID: "backend_%s_latency",
+ Title: "Backend latency",
+ Units: "microseconds",
+ Fam: "backend latency",
+ Ctx: "proxysql.backend_latency",
+ Priority: prioBackendLatency,
+ Dims: module.Dims{
+ {ID: "backend_%s_Latency_us", Name: "latency"},
+ },
+ }
+)
+
+func newBackendCharts(hg, host, port string) *module.Charts {
+ charts := backendChartsTmpl.Copy()
+
+ for _, chart := range *charts {
+ chart.ID = fmt.Sprintf(chart.ID, backendID(hg, host, port))
+ chart.Labels = []module.Label{
+ {Key: "host", Value: host},
+ {Key: "port", Value: port},
+ }
+ for _, dim := range chart.Dims {
+ dim.ID = fmt.Sprintf(dim.ID, backendID(hg, host, port))
+ }
+ }
+
+ return charts
+}
+
+func (p *ProxySQL) addBackendCharts(hg, host, port string) {
+ charts := newBackendCharts(hg, host, port)
+
+ if err := p.Charts().Add(*charts...); err != nil {
+ p.Warning(err)
+ }
+}
+
+func (p *ProxySQL) removeBackendCharts(hg, host, port string) {
+ prefix := "backend_" + backendID(hg, host, port)
+
+ for _, chart := range *p.Charts() {
+ if strings.HasPrefix(chart.ID, prefix) {
+ chart.MarkRemove()
+ chart.MarkNotCreated()
+ }
+ }
+}