一、简介
Exporter返回的样本数据,主要由三个部分组成:样本的一般注释信息(HELP),样本的类型注释信息(TYPE)和样本。Prometheus会对Exporter响应的内容逐行解析:
如果当前行以# HELP开始,Prometheus将会按照以下规则对内容进行解析,得到当前的指标名称以及相应的说明信息:
# HELP <metrics_name> <doc_string>
如果当前行以# TYPE开始,Prometheus会按照以下规则对内容进行解析,得到当前的指标名称以及指标类型:
# TYPE <metrics_name> <metrics_type>
Exporter响应的HTTP头信息,可指定规范版本等:
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 2906
Content-Type: text/plain; version=0.0.4
Date: Sat, 17 Mar 2018 08:47:06 GMT
二、CAdvisor Exporter
CAdvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行CAdvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。
在本地运行CAdvisor也非常简单,直接运行一下命令即可:
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
通过访问http://localhost:8080可以查看,当前主机上容器的运行状态,如下所示:
多主机情况下不方便,默认只保存2分钟监控数据。但是CAdvisor内置了对prometheus的支持:
访问http://localhost:8080/metrics
下面表格中列举了一些CAdvisor中获取到的典型监控指标:
指标名称 | 类型 | 含义 |
---|---|---|
container_cpu_load_average_10s | gauge过去10秒容器CPU的平均负载container_cpu_usage_seconds_totalcounter容器在每个CPU内核上的累积占用时间 (单位:秒) | |
container_cpu_system_seconds_total | counter | System CPU累积占用时间(单位:秒) |
container_cpu_user_seconds_total | counter | User CPU累积占用时间(单位:秒) |
container_fs_usage_bytes | gauge | 容器中文件系统的使用量(单位:字节) |
container_fs_limit_bytes | gauge | 容器可以使用的文件系统总量(单位:字节) |
container_fs_reads_bytes_total | counter | 容器累积读取数据的总量(单位:字节) |
container_fs_writes_bytes_total | counter容器累积写入数据的总量(单位:字节) | |
container_memory_max_usage_bytes | gauge | 容器的最大内存使用量(单位:字节) |
container_memory_usage_bytes | gauge | 容器当前的内存使用量(单位:字节) |
container_spec_memory_limit_bytes | gauge | 容器的内存使用量限制 |
machine_memory_bytes | gauge | 当前主机的内存总量 |
container_network_receive_bytes_total | counter | 容器网络累积接收数据总量(单位:字节) |
container_network_transmit_bytes_total | counter | 容器网络累积传输数据总量(单位:字节) |
与prometheus集成:
修改prometheus.yml,将CAdvisor添加监控数据采集任务目标当中:
重启prometheus:
[root@prometheus ~]# docker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml prom/prometheus
prometheus UI界面查看:
当能够正常采集到cAdvisor的样本数据后,可以通过以下表达式计算容器的CPU使用率:
sum(irate(container_cpu_usage_seconds_total{image!=""}[1m])) without (cpu)
查询容器内存使用量(单位:字节):
container_memory_usage_bytes{image!=""}
查询容器网络接收量速率(单位:字节/秒):
sum(rate(container_network_receive_bytes_total{image!=""}[1m])) without (interface)
查询容器网络传输量速率(单位:字节/秒):
sum(rate(container_network_transmit_bytes_total{image!=""}[1m])) without (interface)
查询容器文件系统读取速率(单位:字节/秒):
sum(rate(container_fs_reads_bytes_total{image!=""}[1m])) without (device)
查询容器文件系统写入速率(单位:字节/秒):
sum(rate(container_fs_writes_bytes_total{image!=""}[1m])) without (device)
三、部署Mysql Exporter
1、安装mysql
[root@prometheus mysql]# yum install mariadb-server -y
[root@prometheus mysql]# systemctl start mariadb
[root@prometheus mysql]# systemctl enable mariadb
[root@prometheus mysql]# mysql_secure_installation
[root@prometheus mysql]# mysql -uroot -pwestos
MariaDB [(none)]> CREATE USER 'exporter'@'%' IDENTIFIED BY 'westos';
MariaDB [(none)]> GRANT PROCESS,REPLICATION CLIENT ON *.* TO 'exporter'@'%';
MariaDB [(none)]> GRANT SELECT ON performance_schema.* TO 'exporter'@'%';
2、docker安装mysqld-exporter
[root@prometheus mysql]# docker pull prom/mysqld-exporter
[root@prometheus mysql]# docker run -d -p 9104:9104 -e DATA_SOURCE_NAME="exporter:westos@(10.0.2.41:3306)/" prom/mysqld-exporter
注意:我设置的数据库密码是westos
监控的是所有数据库,可在后面指定/mysql只监控mysql数据库。
3、浏览器查看mysqld_exporter是否正常连接到mysql
http://localhost:9104/metrics
4、结合prometheus
修改prometheus.yml
5、重启prometheus
[root@prometheus mysql]# docker run -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml -v prom/prometheus
6、浏览器访问:http://localhost:9090/classic/targets
7、监控数据库吞吐量
在MySQL内部通过一个名为Questions的计数器,当客户端发送一个查询语句后,其值就会+1。
MySQLD Exporter中返回的样本数据中通过mysql_global_status_questions反映当前Questions计数器的大小:
通过以下PromQL可以查看当前MySQL实例查询速率的变化情况,查询数量的突变往往暗示着可能发生了某些严重的问题,因此用于用户应该关注并且设置响应的告警规则,以及时获取该指标的变化情况:
rate(mysql_global_status_questions[2m])
用户可以通过以下PromQL查看当前MySQL实例写操作速率的变化情况:
sum(rate(mysql_global_status_commands_total{command=~"insert|update|delete"}[2m])) without (command)
8、连接情况
在MySQL中通过全局设置max_connections限制了当前服务器允许的最大客户端连接数量。一旦可用连接数被用尽,新的客户端连接都会被直接拒绝。 因此当监控MySQL运行状态时,需要时刻关注MySQL服务器的连接情况。用户可以通过以下指令查看当前MySQL服务的max_connections配置:
MySQL默认的最大链接数为151。临时调整最大连接数,可以通过以下指令进行设置:
SET GLOBAL max_connections = 200;
如果想永久化设置,则需要通过修改MySQL配置文件my.cnf,添加以下内容:
max_connections = 200
通过Global Status中的Threads_connected、Aborted_connects、Connection_errors_max_connections以及Threads_running可以查看当前MySQL实例的连接情况。
例如,通过以下指令可以直接当前MySQL实例的连接数:
当所有可用连接都被占用时,如果一个客户端尝试连接至MySQL,会出现“Too many connections(连接数过多)”错误,同时Connection_errors_max_connections的值也会增加。为了防止出现此类情况,你应该监控可用连接的数量,并确保其值保持在max_connections限制以内。同时如果Aborted_connects的数量不断增加时,说明客户端尝试连接到MySQL都失败了。此时可以通过Connection_errors_max_connections以及Connection_errors_internal分析连接失败的问题原因。
Innodb_buffer_pool_read_requests记录了正常从缓冲池读取数据的请求数量。
mysql> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_read_requests";
当缓冲池无法满足时,MySQL只能从磁盘中读取数据。Innodb_buffer_pool_reads即记录了从磁盘读取数据的请求数量。
mysql> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_reads";
通过以下PromQL可以得到各个MySQL实例的缓冲池利用率。一般来说还需要结合Innodb_buffer_pool_reads的增长率情况来结合判断缓冲池大小是否合理:
(sum(mysql_global_status_buffer_pool_pages) by (instance) - sum(mysql_global_status_buffer_pool_pages{state="free"}) by (instance)) / sum(mysql_global_status_buffer_pool_pages) by (instance)
9、监控查询性能——慢查询
MySQL还提供了一个Slow_queries的计数器,当查询的执行时间超过long_query_time的值后,计数器就会+1,其默认值为10秒,可以通过以下指令在MySQL中查询当前long_query_time的设置:
mysql> SHOW VARIABLES LIKE 'long_query_time';
mysql> SHOW GLOBAL STATUS LIKE "Slow_queries"; #查看当前慢查询个数
通过监控Slow_queries的增长率,可以反映出当前MySQL服务器的性能状态,可以通过以下PromQL查询Slow_queries的增长情况:
rate(mysql_global_status_slow_queries[2m])