1.使用golang开发并监控hadoop篇(1)hdfs文件夹大小监控
2.使用golang开发并监控hadoop篇(2)hdfs使用情况和定时任务功能
3.使用golang开发并监控hadoop篇(3)监控hadoop的端口并整合到Prometheus
前面一片文章描写了怎么用go去监控hdfs的文件夹大小,这篇文章将为大家带来怎么监控hdfs使用情况和定时任务功能
hdfs磁盘空间监控这个是每天定时发送一次,所以这次结合定时任务一起说了。下图就是个大概情况,当使用百分比超过80就会出现橘黄色,超过90%就会出现深红色。
实现思路
通过执行下面命令获取hdfs集群的信息,然后对这些信息进行格式化处理。
hdfs dfsadmin -report | grep -E '^Name|DFS|Configured Capacity'
输出结果如下图:
- 由于前4行是集群的信息,不是dn节点的信息,所以我们需要判断下
- 将输出结果格式化成我们需要的格式(markdown)
- 每个dn节点信息占7行,我这里用了模运算,即%7 当余数等于0,1,2,4,5分别对应了 节点名,总空间,已用空间,可用空间,百分比
- 需要利用正则将每行括号里面的信息提取出来
- 格式化后通过钉钉发送到报警群就可以了。
格式化函数
// 提取每行中被小括号括住的信息
var rgx = regexp.MustCompile(`\((.*?)\)`)
// s即hdfs dfsadmin -report | grep -E '^Name|DFS|Configured Capacity' 的输出
func FormatDiskInfo(s string) string {
l := strings.Split(s, "\n")
rs := "## hdfs集群状况\n\n"
for i, r := range l {
// 提取每行中被小括号括住的信息
_s := rgx.FindStringSubmatch(r)
if r == "" {
continue
}
if i < 4 {
switch i {
case 0:
rs += "- 总空间: " + _s[1] + "\n"
case 1:
rs += "- 可用空间:" + _s[1] + "\n"
case 2:
rs += "- 已用空间:" + _s[1] + "\n"
case 3:
__s := strings.Split(r, " ")
rs += "- 已用百分比:" + DiskNotice(__s[2]) + "\n\n"
}
} else {
switch (i - 4) % 7 {
case 0:
rs += "## " + _s[1] + "状态\n\n"
case 1:
rs += "- 总空间: " + _s[1] + "\n"
case 4:
rs += "- 可用空间:" + _s[1] + "\n"
case 2:
rs += "- 已用空间:" + _s[1] + "\n"
case 5:
__s := strings.Split(r, " ")
rs += "- 已用百分比:" + DiskNotice(__s[2]) + "\n\n"
}
}
}
return rs
}
定时任务
本来也是可以用系统的定时任务,但是由于咱们这毕竟是一个程序,而不是一个小脚本,一旦监控项越来越多,使用系统的crond修改起来也不方便,所以就直接在程序里面启动一个定时任务来维护。
实现思路
- 我们通过一个变量来控制是否启用了定时任务
- 在配置监控项的时候需要加上在那个时间段去执行
监控有第三方的包,不需要我们自己再辛苦的去实现了。
go get -u github.com/robfig/cron"
go代码部分