细节
-
错误
-
状态: Done">完成
-
高
-
解决方法: 固定
-
没有一个
-
没有一个
-
没有一个
描述
当使用pt-secure-collect时,某些输出由于使用了错误的正则表达式进行主机名检测而变得不可读。
例如:
top - 19:49:33 up 10天,16:11,1个用户,负载平均:主机名主机名0.17任务:127 total, 1运行,126睡眠,0停止,0僵尸%Cpu(s): 21.7 us, 34.8 sy, 0.0 ni, 43.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 3881748 total, 142512 free, 1898868 used, 1840368 buff/cache KiB Swap: 1572860 total, 1572820 free, 40 used。1602908 avail Mem PID USER PR NI VIRT RES SHR S %CPU % Mem TIME+ COMMAND 5304 vagrant 20 0 1983280 hostname 12272 S 6.2 35.8 456:hostnameprometheus 5313 root 20 0 142100 16952 5428 S 6.2 0.4 189:hostnamenode_expor+ 10559 mysql 20 0 1518964 221568 9976 S 6.2 5.7 10:hostnamemysqld
这是我们得到的2018_06_25_19_49_32-top的输出。例如,在“平均负载”部分,我们得到了两个“主机名”,而在RES和Time列中,我们得到了一个。在现实中,预期产出应该是:
top - 20:05:17 up 10天,16:27,1个用户,平均负载:0.01,0.15,0.19任务:115 total, 1运行,114睡眠,0停止,0僵尸%Cpu(s): 1.0 us, 0.3 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 3881748 total, 147324 free, 1892824 used, 1841600 buff/缓存KiB Swap: 1572860 total, 1572748 free, 112 used。1609372 avail Mem PID USER PR NI VIRT RES SHR S %CPU % Mem TIME+ COMMAND 5304 vagrant 20 0 1983280 1.327g 12272 S 2.3 35.8 456:34.90 prometheus 5313 root 20 0 142100 16952 5428 S 1.0 0.4 179:16.81 node_export . node_export . node_export . node_export . node_export
这是因为它将浮点数(在本例中)作为主机名。注意,在这种情况下,只有后跟另一个字符的浮点数才会被替换(参见下面的regex)。
使用的正则表达式是:
hostnameRE = regexp.MustCompile ((((a-zA-Z0-9) | [a-zA-Z0-9] [a-zA-Z0-9 \ -] * [a-zA-Z0-9]) \) + ([a-zA-Z0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] [a-zA-Z0-9]) {2,3} (?: \ W) ')
它又被用于:
func sanitizehostname (lines []string) {为i:= range lines {lines[i] =主机名。ReplaceAllStringFunc(lines[i], replaceHostname)}}
和替换函数:
func replaceHostname(s string)字符串{如果字符串。HasSuffix(年代,”:“){返回“<主机名>:“}返回“主机名”}
我还没有时间进一步检查正则表达式,但如果我没有弄错的话,以下将匹配0.01,例如:
([a-zA-Z0-9]) \) + ([a-zA-Z0-9]) {2,3} (?: \ W)
这是上面提到的正则表达式的子集。我们可以使用下面的URL来测试这种情况是否存在:
https://regex-golang.appspot.com/assets/html/index.html
如果我们使用我发送的最后一个正则表达式,以及下面的字符串
Top - 20:05:17 up 10天,16:27,1个用户,平均负载:0.01,0.15,0.19
您将看到匹配是上面所见的“hostname”所代替的。
如何繁殖:
以如下命令运行工具:
——mysql-user=“根”——mysql-password = " mysql-host = localhost
用任何你想要的密码进行加密。然后解密和解压缩输出,并检查生成的文件。在本例中,pt-stalk的' top '输出使用的是:2018_06_25_19_49_32-top。但这在许多其他文件中都可以看到,因此应该进行详尽的检查(grep -R 'hostname' *;检查所有生成的文件)。
我将优先级设置为“高”,因为它将使许多输出没有意义,这将不能让我们正确地评估服务器性能,并可能意味着我们因此错过了捕捉数据的行动窗口。
