其他分享
首页 > 其他分享> > 滴滴夜莺nightingale v2版本磁盘读写监控bug修复方法

滴滴夜莺nightingale v2版本磁盘读写监控bug修复方法

作者:互联网

批量挂载nfs后,夜莺自动监控/mnt,发生大量反复的读写错误报警,经过测试 nfs可以正常读写

tags: mount=/mnt
当前值: disk.rw.error: 3
报警说明: disk.rw.error(all,180s) != 0

查看collector日志发现,偶有open /mnt/.fs-detect ,not fount file or dictionory remove /mnt/.fs-detect ,not fount file or dictionory 怀疑是读写逻辑有异常

查看collector源码 硬盘读写逻辑在src/modules/collector/sys/funcs/fsstat.go,发现disk.rw.error: 3 这个数值由来是这一段代码

file := filepath.Join(du.FsFile, ".fs-detect")
now := time.Now().Format("2006-01-02 15:04:05")
content := "FS-RW" + now
err = CheckFS(file, content)
if err != nil {
ret = append(ret, core.GaugeValue("disk.rw.error", 3, tags))
} else {
ret = append(ret, core.GaugeValue("disk.rw.error", 0, tags))
}

 

func CheckFS(file string, content string) error {
代码逻辑,此处省略。。。。
}

标红的代码读写文件名写死了,会造成多服务器挂载nfs读写冲突

 

解决方法:

修改源码,给文件名加上随机字符串

添加引用
"math/rand"

修改这一行,给添加随机字符串
file := filepath.Join(du.FsFile, ".fs-detect."+genRandStr())
now := time.Now().Format("2006-01-02 15:04:05")
content := "FS-RW" + now
err = CheckFS(file, content)
if err != nil {
ret = append(ret, core.GaugeValue("disk.rw.error", 3, tags))
} else {
ret = append(ret, core.GaugeValue("disk.rw.error", 0, tags))
}

增加下面的函数

func genRandStr() string {
const len = 5
var letters []byte = []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

randBytes := make([]byte, len)
if _, err := rand.Read(randBytes); err != nil {
return fmt.Sprintf("%d", rand.Int63())
}

for i := 0; i < len; i++ {
pos := randBytes[i] % 62
randBytes[i] = letters[pos]
}

return string(randBytes)
}

从新编译,替换二进制文件,重启collector 问题解决。 注意:仅限v2版本的bug修复  

标签:rw,读写,ret,v2,file,error,nightingale,disk,bug
来源: https://www.cnblogs.com/opsdemo/p/14823508.html