如何在Grafana中筛选执行时间超1秒的MySQL慢查询日志
解决Grafana中筛选MySQL慢查询日志(执行时间>1秒)的问题
问题背景
我们已将MySQL慢查询日志导入Grafana 9.3.6,需要筛选出执行时间超过1秒的日志。
示例慢查询日志
# User@Host: kermit[muppets] @ [99.99.99.99] Id: 54908918 # Schema: frogs Last_errno: 0 Killed: 0 # Query_time: 0.000218 Lock_time: 0.000081 Rows_sent: 1 Rows_examined: 1 Rows_affected: 0 Bytes_sent: 665 # Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_table_sizes: 0 # InnoDB_trx_id: 0 # QC_Hit: No Full_scan: No Full_join: No Tmp_table: No Tmp_table_on_disk: No # Filesort: No Filesort_on_disk: No Merge_passes: 0 # InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000 # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000 # InnoDB_pages_distinct: 9 # Log_slow_rate_type: query Log_slow_rate_limit: 1000 SET timestamp=1676569875; select id FROM characters WHERE name='monster';
当前进展
已写出能匹配Query_time字段的查询语句:
{service="db::muppets"} |~ `Query_time: (\d*\.\d*)`
但尝试用命名分组捕获后筛选时无结果返回:
{service="db::muppets"} |~ `Query_time: (?P<query_time>\d*\.\d*)` | query_time > 1
问题根源是捕获的query_time为文本类型,无法直接与数值进行比较,需要先转换类型。
解决方案
在Grafana的LogQL中,使用to_float()函数将字符串类型的时间值转换为数值类型,再执行筛选。提供两种可行写法:
写法一:先转换再比较
{service="db::muppets"} |~ `Query_time: (?P<query_time>\d*\.\d*)` | query_time = to_float(query_time) | query_time > 1
写法二:直接在比较时转换(更简洁)
{service="db::muppets"} |~ `Query_time: (?P<query_time>\d*\.\d*)` | to_float(query_time) > 1
说明
to_float()是LogQL内置的类型转换函数,可将字符串格式的浮点数转为数值类型,满足与数字1的大小比较需求。
内容的提问来源于stack exchange,提问作者Kirby
相关产品推荐
相关产品推荐

