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

Posted 运维小兵#杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滴滴夜莺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修复
 

以上是关于滴滴夜莺nightingale v2版本磁盘读写监控bug修复方法的主要内容,如果未能解决你的问题,请参考以下文章

部署开源夜莺运维监控平台V3版本

滴滴开源监控夜莺的架构设计思考

Nightingale——夜莺监控系统部署邮件告警系统

Nightingale——夜莺监控系统部署邮件告警系统

Nightingale——部署客户端采集其他服务器状态信息

Nightingale——部署客户端采集其他服务器状态信息