@cryptotaxi247 / netdata-1 / commits / 9f681f10a

Add ProxySQL python plugin (#4112)

* Add proxysql python plugin * fix codacy issue * add proxysql to python.d.conf * add monitor for commands * add default config options for admin user * add commands histogram and improve queries * remove duplicated variable name * add proxysql plugin to python.d/Makefile * rename id variable * change default port from 3306 to 6032 * add proxysql section to the readme * Formatting * fix typo * change name of charts * use format() for concatination * don't make methods protected * format multiline containers * fix format placeholders * fix long lines * Add configuration notice * increase the version

Ali Borhani committed Oct 23, 2018 at 01:21 UTC 9f681f10af1128a93f14df6ad4061485300dbc37
7 files changed +617 -1
collectors/python.d.plugin/proxysql/Makefile.inc new
+13
@@ -0,0 +1,13 @@
1 +# SPDX-License-Identifier: GPL-3.0-or-later
2 +
3 +# THIS IS NOT A COMPLETE Makefile
4 +# IT IS INCLUDED BY ITS PARENT'S Makefile.am
5 +# IT IS REQUIRED TO REFERENCE ALL FILES RELATIVE TO THE PARENT
6 +
7 +# install these files
8 +dist_python_DATA += proxysql/proxysql.chart.py
9 +dist_pythonconfig_DATA += proxysql/proxysql.conf
10 +
11 +# do not install these files, but include them in the distribution
12 +dist_noinst_DATA += proxysql/README.md proxysql/Makefile.inc
13 +
collectors/python.d.plugin/proxysql/README.md new
+62
@@ -0,0 +1,62 @@
1 +# proxysql
2 +
3 +This module monitors proxysql backend and frontend performance metrics.
4 +
5 +It produces:
6 +
7 +1. **Connections (frontend)**
8 + * connected: number of frontend connections currently connected
9 + * aborted: number of frontend connections aborted due to invalid credential or max_connections reached
10 + * non_idle: number of frontend connections that are not currently idle
11 + * created: number of frontend connections created
12 +2. **Questions (frontend)**
13 + * questions: total number of queries sent from frontends
14 + * slow_queries: number of queries that ran for longer than the threshold in milliseconds defined in global variable `mysql-long_query_time`
15 +3. **Overall Bandwith (backends)**
16 + * in
17 + * out
18 +4. **Status (backends)**
19 + * Backends
20 + * `1=ONLINE`: backend server is fully operational
21 + * `2=SHUNNED`: backend sever is temporarily taken out of use because of either too many connection errors in a time that was too short, or replication lag exceeded the allowed threshold
22 + * `3=OFFLINE_SOFT`: when a server is put into OFFLINE_SOFT mode, new incoming connections aren't accepted anymore, while the existing connections are kept until they became inactive. In other words, connections are kept in use until the current transaction is completed. This allows to gracefully detach a backend
23 + * `4=OFFLINE_HARD`: when a server is put into OFFLINE_HARD mode, the existing connections are dropped, while new incoming connections aren't accepted either. This is equivalent to deleting the server from a hostgroup, or temporarily taking it out of the hostgroup for maintenance work
24 + * `-1`: Unknown status
25 +5. **Bandwith (backends)**
26 + * Backends
27 + * in
28 + * out
29 +6. **Queries (backends)**
30 + * Backends
31 + * queries
32 +7. **Latency (backends)**
33 + * Backends
34 + * ping time
35 +8. **Pool connections (backends)**
36 + * Backends
37 + * Used: The number of connections are currently used by ProxySQL for sending queries to the backend server.
38 + * Free: The number of connections are currently free.
39 + * Established/OK: The number of connections were established successfully.
40 + * Error: The number of connections weren't established successfully.
41 +9. **Commands**
42 + * Commands
43 + * Count
44 + * Duration (Total duration for each command)
45 +10. **Commands Histogram**
46 + * Commands
47 + * 100us, 500us, ..., 10s, inf: the total number of commands of the given type which executed within the specified time limit and the previous one.
48 +
49 +### configuration
50 +
51 +```yaml
52 +tcpipv4:
53 + name : 'local'
54 + user : 'stats'
55 + pass : 'stats'
56 + host : '127.0.0.1'
57 + port : '6032'
58 +```
59 +
60 +If no configuration is given, module will fail to run.
61 +
62 +---
collectors/python.d.plugin/proxysql/proxysql.chart.py new
+356
@@ -0,0 +1,356 @@
1 +# -*- coding: utf-8 -*-
2 +# Description: Proxysql netdata python.d module
3 +# Author: Ali Borhani (alibo)
4 +# SPDX-License-Identifier: GPL-3.0+
5 +
6 +from bases.FrameworkServices.MySQLService import MySQLService
7 +
8 +# default module values (can be overridden per job in `config`)
9 +# update_every = 3
10 +priority = 60000
11 +retries = 60
12 +
13 +
14 +def query(table, *params):
15 + return 'SELECT {params} FROM {table}'.format(table=table, params=', '.join(params))
16 +
17 +
18 +# https://github.com/sysown/proxysql/blob/master/doc/admin_tables.md#stats_mysql_global
19 +QUERY_GLOBAL = query(
20 + "stats_mysql_global",
21 + "Variable_Name",
22 + "Variable_Value"
23 +)
24 +
25 +# https://github.com/sysown/proxysql/blob/master/doc/admin_tables.md#stats_mysql_connection_pool
26 +QUERY_CONNECTION_POOL = query(
27 + "stats_mysql_connection_pool",
28 + "hostgroup",
29 + "srv_host",
30 + "srv_port",
31 + "status",
32 + "ConnUsed",
33 + "ConnFree",
34 + "ConnOK",
35 + "ConnERR",
36 + "Queries",
37 + "Bytes_data_sent",
38 + "Bytes_data_recv",
39 + "Latency_us"
40 +)
41 +
42 +# https://github.com/sysown/proxysql/blob/master/doc/admin_tables.md#stats_mysql_commands_counters
43 +QUERY_COMMANDS = query(
44 + "stats_mysql_commands_counters",
45 + "Command",
46 + "Total_Time_us",
47 + "Total_cnt",
48 + "cnt_100us",
49 + "cnt_500us",
50 + "cnt_1ms",
51 + "cnt_5ms",
52 + "cnt_10ms",
53 + "cnt_50ms",
54 + "cnt_100ms",
55 + "cnt_500ms",
56 + "cnt_1s",
57 + "cnt_5s",
58 + "cnt_10s",
59 + "cnt_INFs"
60 +)
61 +
62 +GLOBAL_STATS = [
63 + 'client_connections_aborted',
64 + 'client_connections_connected',
65 + 'client_connections_created',
66 + 'client_connections_non_idle',
67 + 'proxysql_uptime',
68 + 'questions',
69 + 'slow_queries'
70 +]
71 +
72 +CONNECTION_POOL_STATS = [
73 + 'status',
74 + 'connused',
75 + 'connfree',
76 + 'connok',
77 + 'connerr',
78 + 'queries',
79 + 'bytes_data_sent',
80 + 'bytes_data_recv',
81 + 'latency_us'
82 +]
83 +
84 +ORDER = [
85 + 'connections',
86 + 'active_transactions',
87 + 'questions',
88 + 'pool_overall_net',
89 + 'commands_count',
90 + 'commands_duration',
91 + 'pool_status',
92 + 'pool_net',
93 + 'pool_queries',
94 + 'pool_latency',
95 + 'pool_connection_used',
96 + 'pool_connection_free',
97 + 'pool_connection_ok',
98 + 'pool_connection_error'
99 +]
100 +
101 +HISTOGRAM_ORDER = [
102 + '100us',
103 + '500us',
104 + '1ms',
105 + '5ms',
106 + '10ms',
107 + '50ms',
108 + '100ms',
109 + '500ms',
110 + '1s',
111 + '5s',
112 + '10s',
113 + 'inf'
114 +]
115 +
116 +STATUS = {
117 + "ONLINE": 1,
118 + "SHUNNED": 2,
119 + "OFFLINE_SOFT": 3,
120 + "OFFLINE_HARD": 4
121 +}
122 +
123 +CHARTS = {
124 + 'pool_status': {
125 + 'options': [None, 'ProxySQL Backend Status', 'status', 'status', 'proxysql.pool_status', 'line'],
126 + 'lines': []
127 + },
128 + 'pool_net': {
129 + 'options': [None, 'ProxySQL Backend Bandwidth', 'kilobits/s', 'bandwidth', 'proxysql.pool_net', 'area'],
130 + 'lines': []
131 + },
132 + 'pool_overall_net': {
133 + 'options': [None, 'ProxySQL Backend Overall Bandwidth', 'kilobits/s', 'overall_bandwidth',
134 + 'proxysql.pool_overall_net', 'area'],
135 + 'lines': [
136 + ['bytes_data_recv', 'in', 'incremental', 8, 1024],
137 + ['bytes_data_sent', 'out', 'incremental', -8, 1024]
138 + ]
139 + },
140 + 'questions': {
141 + 'options': [None, 'ProxySQL Frontend Questions', 'questions/s', 'questions', 'proxysql.questions', 'line'],
142 + 'lines': [
143 + ['questions', 'questions', 'incremental'],
144 + ['slow_queries', 'slow_queries', 'incremental']
145 + ]
146 + },
147 + 'pool_queries': {
148 + 'options': [None, 'ProxySQL Backend Queries', 'queries/s', 'queries', 'proxysql.queries', 'line'],
149 + 'lines': []
150 + },
151 + 'active_transactions': {
152 + 'options': [None, 'ProxySQL Frontend Active Transactions', 'transactions/s', 'active_transactions',
153 + 'proxysql.active_transactions', 'line'],
154 + 'lines': [
155 + ['active_transactions', 'active_transactions', 'absolute']
156 + ]
157 + },
158 + 'pool_latency': {
159 + 'options': [None, 'ProxySQL Backend Latency', 'ms', 'latency', 'proxysql.latency', 'line'],
160 + 'lines': []
161 + },
162 + 'connections': {
163 + 'options': [None, 'ProxySQL Frontend Connections', 'connections/s', 'connections', 'proxysql.connections',
164 + 'line'],
165 + 'lines': [
166 + ['client_connections_connected', 'connected', 'absolute'],
167 + ['client_connections_created', 'created', 'incremental'],
168 + ['client_connections_aborted', 'aborted', 'incremental'],
169 + ['client_connections_non_idle', 'non_idle', 'absolute']
170 + ]
171 + },
172 + 'pool_connection_used': {
173 + 'options': [None, 'ProxySQL Used Connections', 'connections', 'pool_connections',
174 + 'proxysql.pool_used_connections', 'line'],
175 + 'lines': []
176 + },
177 + 'pool_connection_free': {
178 + 'options': [None, 'ProxySQL Free Connections', 'connections', 'pool_connections',
179 + 'proxysql.pool_free_connections', 'line'],
180 + 'lines': []
181 + },
182 + 'pool_connection_ok': {
183 + 'options': [None, 'ProxySQL Established Connections', 'connections', 'pool_connections',
184 + 'proxysql.pool_ok_connections', 'line'],
185 + 'lines': []
186 + },
187 + 'pool_connection_error': {
188 + 'options': [None, 'ProxySQL Error Connections', 'connections', 'pool_connections',
189 + 'proxysql.pool_error_connections', 'line'],
190 + 'lines': []
191 + },
192 + 'commands_count': {
193 + 'options': [None, 'ProxySQL Commands', 'commands', 'commands', 'proxysql.commands_count', 'line'],
194 + 'lines': []
195 + },
196 + 'commands_duration': {
197 + 'options': [None, 'ProxySQL Commands Duration', 'ms', 'commands', 'proxysql.commands_duration', 'line'],
198 + 'lines': []
199 + }
200 +}
201 +
202 +
203 +class Service(MySQLService):
204 + def __init__(self, configuration=None, name=None):
205 + MySQLService.__init__(self, configuration=configuration, name=name)
206 + self.order = ORDER
207 + self.definitions = CHARTS
208 + self.queries = dict(
209 + global_status=QUERY_GLOBAL,
210 + connection_pool_status=QUERY_CONNECTION_POOL,
211 + commands_status=QUERY_COMMANDS
212 + )
213 +
214 + def _get_data(self):
215 + raw_data = self._get_raw_data(description=True)
216 +
217 + if not raw_data:
218 + return None
219 +
220 + to_netdata = dict()
221 +
222 + if 'global_status' in raw_data:
223 + global_status = dict(raw_data['global_status'][0])
224 + for key in global_status:
225 + if key.lower() in GLOBAL_STATS:
226 + to_netdata[key.lower()] = global_status[key]
227 +
228 + if 'connection_pool_status' in raw_data:
229 +
230 + to_netdata['bytes_data_recv'] = 0
231 + to_netdata['bytes_data_sent'] = 0
232 +
233 + for record in raw_data['connection_pool_status'][0]:
234 + backend = self.generate_backend(record)
235 + name = self.generate_backend_name(backend)
236 +
237 + for key in backend:
238 + if key in CONNECTION_POOL_STATS:
239 + if key == 'status':
240 + backend[key] = self.convert_status(backend[key])
241 +
242 + if len(self.charts) > 0:
243 + if (name + '_status') not in self.charts['pool_status']:
244 + self.add_backend_dimensions(name)
245 +
246 + to_netdata["{0}_{1}".format(name, key)] = backend[key]
247 +
248 + if key == 'bytes_data_recv':
249 + to_netdata['bytes_data_recv'] += int(backend[key])
250 +
251 + if key == 'bytes_data_sent':
252 + to_netdata['bytes_data_sent'] += int(backend[key])
253 +
254 + if 'commands_status' in raw_data:
255 + for record in raw_data['commands_status'][0]:
256 + cmd = self.generate_command_stats(record)
257 + name = cmd['name']
258 +
259 + if len(self.charts) > 0:
260 + if (name + '_count') not in self.charts['commands_count']:
261 + self.add_command_dimensions(name)
262 + self.add_histogram_chart(cmd)
263 +
264 + to_netdata[name + '_count'] = cmd['count']
265 + to_netdata[name + '_duration'] = cmd['duration']
266 + for histogram in cmd['histogram']:
267 + dimId = 'commands_histogram_{0}_{1}'.format(name, histogram)
268 + to_netdata[dimId] = cmd['histogram'][histogram]
269 +
270 + return to_netdata or None
271 +
272 + def add_backend_dimensions(self, name):
273 + self.charts['pool_status'].add_dimension([name + '_status', name, 'absolute'])
274 + self.charts['pool_net'].add_dimension([name + '_bytes_data_recv', 'from_' + name, 'incremental', 8, 1024])
275 + self.charts['pool_net'].add_dimension([name + '_bytes_data_sent', 'to_' + name, 'incremental', -8, 1024])
276 + self.charts['pool_queries'].add_dimension([name + '_queries', name, 'incremental'])
277 + self.charts['pool_latency'].add_dimension([name + '_latency_us', name, 'absolute', 1, 1000])
278 + self.charts['pool_connection_used'].add_dimension([name + '_connused', name, 'absolute'])
279 + self.charts['pool_connection_free'].add_dimension([name + '_connfree', name, 'absolute'])
280 + self.charts['pool_connection_ok'].add_dimension([name + '_connok', name, 'incremental'])
281 + self.charts['pool_connection_error'].add_dimension([name + '_connerr', name, 'incremental'])
282 +
283 + def add_command_dimensions(self, cmd):
284 + self.charts['commands_count'].add_dimension([cmd + '_count', cmd, 'incremental'])
285 + self.charts['commands_duration'].add_dimension([cmd + '_duration', cmd, 'incremental', 1, 1000])
286 +
287 + def add_histogram_chart(self, cmd):
288 + chart = self.charts.add_chart(self.histogram_chart(cmd))
289 +
290 + for histogram in HISTOGRAM_ORDER:
291 + dimId = 'commands_histogram_{0}_{1}'.format(cmd['name'], histogram)
292 + chart.add_dimension([dimId, histogram, 'incremental'])
293 +
294 + @staticmethod
295 + def histogram_chart(cmd):
296 + return [
297 + 'commands_historgram_' + cmd['name'],
298 + None,
299 + 'ProxySQL {0} Command Histogram'.format(cmd['name'].title()),
300 + 'commands',
301 + 'commands_histogram',
302 + 'proxysql.commands_histogram_' + cmd['name'],
303 + 'stacked'
304 + ]
305 +
306 + @staticmethod
307 + def generate_backend(data):
308 + return {
309 + 'hostgroup': data[0],
310 + 'srv_host': data[1],
311 + 'srv_port': data[2],
312 + 'status': data[3],
313 + 'connused': data[4],
314 + 'connfree': data[5],
315 + 'connok': data[6],
316 + 'connerr': data[7],
317 + 'queries': data[8],
318 + 'bytes_data_sent': data[9],
319 + 'bytes_data_recv': data[10],
320 + 'latency_us': data[11]
321 + }
322 +
323 + @staticmethod
324 + def generate_command_stats(data):
325 + return {
326 + 'name': data[0].lower(),
327 + 'duration': data[1],
328 + 'count': data[2],
329 + 'histogram': {
330 + '100us': data[3],
331 + '500us': data[4],
332 + '1ms': data[5],
333 + '5ms': data[6],
334 + '10ms': data[7],
335 + '50ms': data[8],
336 + '100ms': data[9],
337 + '500ms': data[10],
338 + '1s': data[11],
339 + '5s': data[12],
340 + '10s': data[13],
341 + 'inf': data[14]
342 + }
343 + }
344 +
345 + @staticmethod
346 + def generate_backend_name(backend):
347 + hostgroup = backend['hostgroup'].replace(' ', '_').lower()
348 + host = backend['srv_host'].replace('.', '_')
349 +
350 + return "{0}_{1}_{2}".format(hostgroup, host, backend['srv_port'])
351 +
352 + @staticmethod
353 + def convert_status(status):
354 + if status in STATUS:
355 + return STATUS[status]
356 + return -1
collectors/python.d.plugin/proxysql/proxysql.conf new
+118
@@ -0,0 +1,118 @@
1 +# netdata python.d.plugin configuration for ProxySQL
2 +#
3 +# This file is in YaML format. Generally the format is:
4 +#
5 +# name: value
6 +#
7 +# There are 2 sections:
8 +# - global variables
9 +# - one or more JOBS
10 +#
11 +# JOBS allow you to collect values from multiple sources.
12 +# Each source will have its own set of charts.
13 +#
14 +# JOB parameters have to be indented (using spaces only, example below).
15 +
16 +# ----------------------------------------------------------------------
17 +# Global Variables
18 +# These variables set the defaults for all JOBs, however each JOB
19 +# may define its own, overriding the defaults.
20 +
21 +# update_every sets the default data collection frequency.
22 +# If unset, the python.d.plugin default is used.
23 +# update_every: 1
24 +
25 +# priority controls the order of charts at the netdata dashboard.
26 +# Lower numbers move the charts towards the top of the page.
27 +# If unset, the default for python.d.plugin is used.
28 +# priority: 60000
29 +
30 +# retries sets the number of retries to be made in case of failures.
31 +# If unset, the default for python.d.plugin is used.
32 +# Attempts to restore the service are made once every update_every
33 +# and only if the module has collected values in the past.
34 +# retries: 60
35 +
36 +# autodetection_retry sets the job re-check interval in seconds.
37 +# The job is not deleted if check fails.
38 +# Attempts to start the job are made once every autodetection_retry.
39 +# This feature is disabled by default.
40 +# autodetection_retry: 0
41 +
42 +# ----------------------------------------------------------------------
43 +# JOBS (data collection sources)
44 +#
45 +# The default JOBS share the same *name*. JOBS with the same name
46 +# are mutually exclusive. Only one of them will be allowed running at
47 +# any time. This allows autodetection to try several alternatives and
48 +# pick the one that works.
49 +#
50 +# Any number of jobs is supported.
51 +#
52 +# All python.d.plugin JOBS (for all its modules) support a set of
53 +# predefined parameters. These are:
54 +#
55 +# job_name:
56 +# name: myname # the JOB's name as it will appear at the
57 +# # dashboard (by default is the job_name)
58 +# # JOBs sharing a name are mutually exclusive
59 +# update_every: 1 # the JOB's data collection frequency
60 +# priority: 60000 # the JOB's order on the dashboard
61 +# retries: 60 # the JOB's number of restoration attempts
62 +# autodetection_retry: 0 # the JOB's re-check interval in seconds
63 +#
64 +# Additionally to the above, proxysql also supports the following:
65 +#
66 +# host: 'IP or HOSTNAME' # the host to connect to
67 +# port: PORT # the port to connect to
68 +#
69 +# in all cases, the following can also be set:
70 +#
71 +# user: 'username' # the proxysql username to use
72 +# pass: 'password' # the proxysql password to use
73 +#
74 +
75 +# AUTO-DETECTION JOBS
76 +# only one of them will run (they have the same name)
77 +
78 +tcp:
79 + name : 'local'
80 + user : 'stats'
81 + pass : 'stats'
82 + host : 'localhost'
83 + port : '6032'
84 +
85 +tcpipv4:
86 + name : 'local'
87 + user : 'stats'
88 + pass : 'stats'
89 + host : '127.0.0.1'
90 + port : '6032'
91 +
92 +tcpipv6:
93 + name : 'local'
94 + user : 'stats'
95 + pass : 'stats'
96 + host : '::1'
97 + port : '6032'
98 +
99 +tcp_admin:
100 + name : 'local'
101 + user : 'admin'
102 + pass : 'admin'
103 + host : 'localhost'
104 + port : '6032'
105 +
106 +tcpipv4_admin:
107 + name : 'local'
108 + user : 'admin'
109 + pass : 'admin'
110 + host : '127.0.0.1'
111 + port : '6032'
112 +
113 +tcpipv6_admin:
114 + name : 'local'
115 + user : 'admin'
116 + pass : 'admin'
117 + host : '::1'
118 + port : '6032'
collectors/python.d.plugin/python.d.conf
+1
@@ -77,6 +77,7 @@ nginx_log: no
77 # postfix: yes
78 # postgres: yes
79 # powerdns: yes
80 +# proxysql: yes
81 # puppet: yes
82 # rabbitmq: yes
83 # redis: yes
web/gui/dashboard_info.js
+66
@@ -2249,6 +2249,72 @@ netdataDashboard.context = {
2249
2250 'logind.seats': {
2251 info: 'Shows the number of active seats tracked by logind. Each seat corresponds to a combination of a display device and input device providing a physical presence for the system.'
2252 + },
2253 +
2254 + // ------------------------------------------------------------------------
2255 + // ProxySQL
2256 +
2257 + 'proxysql.pool_status': {
2258 + info: 'The status of the backend servers. ' +
2259 + '<code>1=ONLINE</code> backend server is fully operational, ' +
2260 + '<code>2=SHUNNED</code> backend sever is temporarily taken out of use because of either too many connection errors in a time that was too short, or replication lag exceeded the allowed threshold, ' +
2261 + '<code>3=OFFLINE_SOFT</code> when a server is put into OFFLINE_SOFT mode, new incoming connections aren\'t accepted anymore, while the existing connections are kept until they became inactive. In other words, connections are kept in use until the current transaction is completed. This allows to gracefully detach a backend, ' +
2262 + '<code>4=OFFLINE_HARD</code> when a server is put into OFFLINE_HARD mode, the existing connections are dropped, while new incoming connections aren\'t accepted either. This is equivalent to deleting the server from a hostgroup, or temporarily taking it out of the hostgroup for maintenance work, ' +
2263 + '<code>-1</code> Unknown status.'
2264 + },
2265 +
2266 + 'proxysql.pool_net': {
2267 + info: 'The amount of data sent to/received from the backend ' +
2268 + '(This does not include metadata (packets\' headers, OK/ERR packets, fields\' description, etc).'
2269 + },
2270 +
2271 + 'proxysql.pool_overall_net': {
2272 + info: 'The amount of data sent to/received from the all backends ' +
2273 + '(This does not include metadata (packets\' headers, OK/ERR packets, fields\' description, etc).'
2274 + },
2275 +
2276 + 'proxysql.questions': {
2277 + info: '<code>questions</code> total number of queries sent from frontends, ' +
2278 + '<code>slow_queries</code> number of queries that ran for longer than the threshold in milliseconds defined in global variable <code>mysql-long_query_time</code>. '
2279 + },
2280 +
2281 + 'proxysql.connections': {
2282 + info: '<code>aborted</code> number of frontend connections aborted due to invalid credential or max_connections reached, ' +
2283 + '<code>connected</code> number of frontend connections currently connected, ' +
2284 + '<code>created</code> number of frontend connections created, ' +
2285 + '<code>non_idle</code> number of frontend connections that are not currently idle. '
2286 + },
2287 +
2288 + 'proxysql.pool_latency': {
2289 + info: 'The currently ping time in microseconds, as reported from Monitor.'
2290 + },
2291 +
2292 + 'proxysql.queries': {
2293 + info: 'The number of queries routed towards this particular backend server.'
2294 + },
2295 +
2296 + 'proxysql.pool_used_connections': {
2297 + info: 'The number of connections are currently used by ProxySQL for sending queries to the backend server.'
2298 + },
2299 +
2300 + 'proxysql.pool_free_connections': {
2301 + info: 'The number of connections are currently free. They are kept open in order to minimize the time cost of sending a query to the backend server.'
2302 + },
2303 +
2304 + 'proxysql.pool_ok_connections': {
2305 + info: 'The number of connections were established successfully.'
2306 + },
2307 +
2308 + 'proxysql.pool_error_connections': {
2309 + info: 'The number of connections weren\'t established successfully.'
2310 + },
2311 +
2312 + 'proxysql.commands_count': {
2313 + info: 'The total number of commands of that type executed'
2314 + },
2315 +
2316 + 'proxysql.commands_duration': {
2317 + info: 'The total time spent executing commands of that type, in ms'
2318 }
2319
2320 // ------------------------------------------------------------------------
web/gui/index.html
+1 -1
@@ -4463,7 +4463,7 @@
4463 });
4464
4465 NETDATA.requiredJs.push({
4466 - url: NETDATA.serverStatic + 'dashboard_info.js?v20181003-1',
4466 + url: NETDATA.serverStatic + 'dashboard_info.js?v20181019-1',
4467 async: false,
4468 isAlreadyLoaded: function() { return false; }
4469 });