2021-03-31
使用 Loki 收集 MySQL 慢日志
最近使用了 Loki + Promtail
组合来处理日志集中收集、搜索等功能,体验不错,现在想要把多台机器的 MySQL
慢日志统一收集到 Loki
中,然后在 Grafana
页面中查询慢日志,并且可以通过 Grafana
,添加针对 MySQL
慢日志报警功能。
MySQL
慢日志格式如下:
- 第一行以
# Time:
开始表示慢S QL 的时间 - 第二行说明执行慢 SQL 的用户
- 第三行展示了查询时间、锁时间、发送行数、检查行数 4 个指标
- 第四行表示慢 SQL 的时间戳
- 第五行开始就是慢 SQL
root@dev01 /v/l/mysql# tail -f dev01-slow.log
# Time: 2021-03-29T14:18:26.974751Z
# User@Host: root[root] @ localhost [] Id: 35
# Query_time: 35.953718 Lock_time: 0.000100 Rows_sent: 0 Rows_examined: 10000000
SET timestamp=1617027506;
update t_user set c_city_id=c_city_id*2 where id >= 1;
修改 promtail-local-config.yaml 配置,目前使用的 promtail 2.2 版本支持多行解析,修改后的配置如下:
# 忽略其他配置,只留 scrape_configs 中 mysql 相关日志抓取配置
scrape_configs:
- job_name: mysql_slow
static_configs:
- labels:
job: mysqlslow
__path__: /var/lib/mysql/dev01-slow.log
server: dev01
pipeline_stages:
- multiline:
firstline: '# Time:.*'
max_wait_time: 3s
Loki 查询结果如下
最终效果
然后可以很方便地在 Grafana
中查询多台机器的 MySQL
慢日志,以下是查询机器在 dev01
上,且查询时间大于 1s,且检查行数在大于 1000 的慢日志,由于 Query_time
和 Rows_examined
并没有解析成标签(如 server
),所以这里只使用正则匹配查询。在 Loki 的最佳实践
中,标签尽量使用静态的,也就是写在配置文件中的,或者动态标签使用唯一性比较低的,和 MySQL
建索引规则的实践相反。