最近需要把ProxySQL加入到Prometheus的监控目标里,因此需要先整理一下ProxySQL提供的监控信息。

ProxySQL内置的统计信息

我们先通过管理接口登录进入ProxySQL:

1mysql -u admin -P 6032 -p -h 127.0.0.1
1SHOW DATABASES;
2+-----+---------+-------------------------------+
3| seq | name    | file                          |
4+-----+---------+-------------------------------+
5| 0   | main    |                               |
6| 2   | disk    | /var/lib/proxysql/proxysql.db |
7| 3   | stats   |                               |
8| 4   | monitor |                               |
9+-----+---------+-------------------------------+

其中stats库中包含ProxysQL运行时抓取的统计信息:

 1SHOW TABLES FROM stats;
 2+-----------------------------------+
 3| tables                            |
 4+-----------------------------------+
 5| global_variables                  |
 6| stats_mysql_commands_counters     |
 7| stats_mysql_connection_pool       |
 8| stats_mysql_connection_pool_reset |
 9| stats_mysql_global                |
10| stats_mysql_processlist           |
11| stats_mysql_query_digest          |
12| stats_mysql_query_digest_reset    |
13| stats_mysql_query_rules           |
14| stats_mysql_users                 |
15+-----------------------------------+
1610 rows in set (0.00 sec)

需要我们重点的关注的信息都在stats_mysql_global中:

 1SHOW MYSQL STATUS;(或select * from  stats_mysql_global;)
 2+------------------------------+----------------+
 3| Variable_Name                | Variable_Value |
 4+------------------------------+----------------+
 5| ProxySQL_Uptime              | 255245         |
 6| Active_Transactions          | 0              |
 7| Client_Connections_aborted   | 0              |
 8| Client_Connections_connected | 4              |
 9| Client_Connections_created   | 2025           |
10| Server_Connections_aborted   | 0              |
11| Server_Connections_connected | 11             |
12| Server_Connections_created   | 458            |
13| Client_Connections_non_idle  | 4              |
14| Queries_backends_bytes_recv  | 6348309        |
15| Queries_backends_bytes_sent  | 51245678       |
16| Query_Processor_time_nsec    | 532924901      |
17| Backend_query_time_nsec      | 12057118628    |
18| mysql_backend_buffers_bytes  | 141824         |
19| mysql_frontend_buffers_bytes | 262144         |
20| mysql_session_internal_bytes | 19264          |
21| Com_autocommit               | 230            |
22| Com_autocommit_filtered      | 230            |
23| Com_commit                   | 94             |
24| Com_commit_filtered          | 47             |
25| Com_rollback                 | 18             |
26| Com_rollback_filtered        | 3              |
27| Com_backend_change_user      | 813            |
28| Com_backend_init_db          | 78             |
29| Com_backend_set_names        | 214            |
30| Com_frontend_init_db         | 81             |
31| Com_frontend_set_names       | 98             |
32| Com_frontend_use_db          | 9              |
33| Com_stmt_prepare             | 5647           |
34| Com_stmt_execute             | 5647           |
35| Com_stmt_close               | 5647           |
36| Mirror_concurrency           | 0              |
37| Mirror_queue_length          | 0              |
38| Questions                    | 267223         |
39| Slow_queries                 | 44             |
40| Servers_table_version        | 15             |
41| MySQL_Thread_Workers         | 4              |
42| MySQL_Monitor_Workers        | 8              |
43| ConnPool_get_conn_immediate  | 22             |
44| ConnPool_get_conn_success    | 248710         |
45| ConnPool_get_conn_failure    | 308306         |
46| SQLite3_memory_bytes         | 1206488        |
47| ConnPool_memory_bytes        | 641680         |
48| Stmt_Active_Total            | 0              |
49| Stmt_Active_Unique           | 0              |
50| Stmt_Max_Stmt_id             | 35             |
51| Query_Cache_Memory_bytes     | 0              |
52| Query_Cache_count_GET        | 0              |
53| Query_Cache_count_GET_OK     | 0              |
54| Query_Cache_count_SET        | 0              |
55| Query_Cache_bytes_IN         | 0              |
56| Query_Cache_bytes_OUT        | 0              |
57| Query_Cache_Purged           | 0              |
58| Query_Cache_Entries          | 0              |
59+------------------------------+----------------+
6054 rows in set (0.00 sec)
  • 连接数相关的信息:
    • Client_Connections_connected
    • Server_Connections_connected
    • Active_Transactions
  • 内存相关的信息(我们不使用ProxySQL的Query Cache所以这里不关注Query Cache的信息)
    • ConnPool_memory_bytes
    • SQLite3_memory_bytes

stats_mysql_connection_pool表中包含连接池统计信息:

 1select * from stats_mysql_connection_pool \G
 2*************************** 1. row ***************************
 3      hostgroup: 2
 4       srv_host: 192.168.1.3
 5       srv_port: 3306
 6         status: ONLINE
 7       ConnUsed: 0
 8       ConnFree: 2
 9         ConnOK: 441
10        ConnERR: 0
11        Queries: 250492
12Bytes_data_sent: 50056378
13Bytes_data_recv: 6040259
14     Latency_us: 242
15*************************** 2. row ***************************
16......
  • status是后端DB的状态
  • Queries是对后端DB的请求数
  • ConnUsed是对后端DB的活跃连接数
  • Latency_us是对后端DB请求的网络延时

stats_mysql_processlist表中包含每个用户当前的连接信息:

 1select * from stats_mysql_processlist \G
 2*************************** 1. row ***************************
 3  ThreadID: 0
 4 SessionID: 2001
 5      user: testuser
 6        db: testdb
 7  cli_host: 192.168.1.3
 8  cli_port: 59042
 9 hostgroup: 2
10l_srv_host:
11l_srv_port:
12  srv_host:
13  srv_port:
14   command: Sleep
15   time_ms: 1556
16      info:
17*************************** 2. row ***************************
18......

stats_mysql_query_diges表中是对sql的统计信息:

 1 select * from stats_mysql_query_digest  \G
 2*************************** 1. row ***************************
 3  hostgroup: 2
 4 schemaname: testdb
 5   username: testuser
 6     digest: 0xB0288986D94B9DC2
 7digest_text: SELECT * FROM t_user;
 8 count_star: 1
 9 first_seen: 1501233427
10  last_seen: 1501233427
11   sum_time: 361
12   min_time: 361
13   max_time: 361
14*************************** 2. row ***************************
15......

Percona ProxySQL Exporter

有了上面这些统计信息,我们需要一个Prometheus Exporter,这样Prometheus就可以拉取监控数据了。 Percona ProxySQL Exporter是Percona提供的ProxySQL Exporter。 当前ProxySQL Exporter 1.1.0的版本支持从ProxySQL的stats_mysql_global和stats_mysql_connection_pool中收集统计信息。

ProxySQL Exporter也是Go语言写的,安装比较简单,这里是使用ansible编排的,简单贴一下我们环境中的一个ProxySQL节点上生成的systemd的单元文件:

 1[Unit]
 2Description=proxysql_exporter
 3After=network.target
 4[Service]
 5Type=simple
 6User=prometheus
 7Environment=DATA_SOURCE_NAME=stats:stats@tcp(127.0.0.1:6032)/
 8ExecStart=/home/prometheus/proxysql_exporter/proxysql_exporter \
 9 -web.listen-address=:42004
10Restart=on-failure
11[Install]
12WantedBy=multi-user.target
  • proxysql_exporter从环境变量DATA_SOURCE_NAME获取连接ProxySQL管理接口的dns信息,注意以stats用户连接
  • -web.listen-address设置proxysql_exporter的监听端口,默认为42004

接下来在Prometheus的配置文件中配置收集ProxySQL信息的Job和Instance,这里还是贴一下我们的配置文件片段,实际上这个片段也是有ansible编排生成的。

 1scrape_configs:
 2
 3  - job_name: 'proxysql'
 4    static_configs:
 5     - targets:
 6        - 192.168.1.3:42004
 7       labels:
 8         instance: proxysql1
 9     - targets:
10        - 192.168.1.4:42004
11       labels:
12         instance: proxysql2

重启Prometheus之后,Prometheus就可以从proxysql_exporter中收集ProxySQL的运行时信息了。

在监控图表上我们使用的Grafana,因此可以直接使用percona PMM项目中的ProxySQL Overview,将其入到Grafana即可。

prometheus_proxysql

参考