Varobj

2021-03-31

使用 Loki 收集 MySQL 慢日志



最近使用了 Loki + Promtail 组合来处理日志集中收集、搜索等功能,体验不错,现在想要把多台机器的 MySQL 慢日志统一收集到 Loki 中,然后在 Grafana 页面中查询慢日志,并且可以通过 Grafana ,添加针对 MySQL 慢日志报警功能。

MySQL 慢日志格式如下:

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 查询结果如下

images

最终效果

然后可以很方便地在 Grafana 中查询多台机器的 MySQL 慢日志,以下是查询机器在 dev01 上,且查询时间大于 1s,且检查行数在大于 1000 的慢日志,由于 Query_timeRows_examined 并没有解析成标签(如 server),所以这里只使用正则匹配查询。在 Loki 的最佳实践 中,标签尽量使用静态的,也就是写在配置文件中的,或者动态标签使用唯一性比较低的,和 MySQL 建索引规则的实践相反。

images