当前位置: 代码迷 >> 综合 >> Anemometer适应新版pt-query-digest需要的调整
  详细解决方案

Anemometer适应新版pt-query-digest需要的调整

热度:82   发布时间:2024-01-27 05:35:50.0

Anemometer作者已经停更了,pt-query-digest 3.0.11后续版本,生成的checksum包含英文字母,点击SQL的checksum进详情页提示:“Unknown checksum: ……”

说明:
老版本pt-query-digest生产的checksum存数字,anemometer为了展示美观(固定长度)等原因,将checksum转成16进制列表展示,进详情页后,再讲16进制转换成10进制查找具体SQL详情。这两次转换无法将有因为字母的checksum正确转换,因此详情页无法找到chencsum。

方案:
去掉checksum的两次转换,列表直接显示原checksum。

修改内容,去除转换

# vi conf/config.inc.php 
$conf['reports']['slow_query_log'] = array('callbacks'     => array('table' => array(//注释此行//'checksum' => function ($x) { return array(dec2hex($x), ''); }))# vi lib/Anemometer.php private function translate_checksum($checksum){else if (preg_match('/^[0-9A-Fa-f]+$/', $checksum)){//改为直接return $checnsum//return $this->bchexdec($checksum);  return $checksum;}

anemometer根据checksum查询时,默认该值为数字,因此where条件后面的变量$checksum未使用单引号,导致报错:Unknown?column ……

修改以下文件,$checksum要加单引号:

# vi lib/AnemometerModel.php 
$query = "SELECT `{$checksum_field_name}` FROM `{$this->fact_table}` WHERE `{$checksum_field_name}`='" . $this->mysqli->real_escape_string($checksum) . "'";$sql .= " WHERE `{$checksum_field_name}`='" . $this->mysqli->real_escape_string($checksum) . "'";$result = $this->mysqli->query("SELECT * FROM `{$this->fact_table}` WHERE `{$checksum_field_name}`='{$checksum}'");$sql = "SELECT * FROM `{$table}` WHERE `{$checksum_field_name}`='{$checksum}' ORDER BY `{$time_field_name}` DESC LIMIT {$limit} OFFSET {$offset}";

 

  相关解决方案