设为首页 收藏本站
查看: 1067|回复: 0

Nagios插件开发之监控服务器负载

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-30 09:16:37 | 显示全部楼层 |阅读模式
需求:   今天上午有一台存储服务器未读写,但由于是集群环境,并没有发现这个问题。后来偶然看到该服务器负载为0才发现不对劲,正常情况下应该为5。平时我们监控都是负载高于某个值,而从没想过负载太低也是问题。
   为防止后续再出现此情况,决心编写监控负载下限的nagios插件,当负载低于某个值时,则报警。

预期:该脚本应该能替代nagios插件包中的监控负载脚本,自带插件只能监控上限。无法监控下限,预期功能如下:
1、可设置下限的警告阈值,紧急阈值。
2、可设置上限的警告阈值,紧急阈值。
3、也可只设置上限或下限警告阈值。

执行效果:1、  语法错误输出帮助信息
[iyunv@hostb libexec]# shcheck_load_low.sh -LW 0.5,0.5,0.5,0.5  #传参数多时错误。
Option:
parament one
  --lower_limit_warn|-LW    ;set lower warning limit threshold value.
  --upper_limit_warn|-UW    ;set upper warning limit threshold value.
parament two
  --lower_limit_crit|-LC    ;set lower crit limit threshold value.
  --upper_limit_crit|-LC    ;set upper crit limit threshold value.
Example:
  check_load_low.sh -LW 0.5,0.5,0.5  -LC 0.1,0.1,0.1
  check_load_low.sh -UW 15,15,15  -UC 20,20,20
  check_load_low.sh -LW 1,1,1
  check_load_low.sh -UW 15,15,15

2、设置下限警告阈值、紧急阈值执行效果
[iyunv@hostb libexec]# shcheck_load_low.sh -LW 8,8,8 -LC 7,7,7
#同时低于警告阈值与紧急阈值,退出值为2
crit,load average:  4.93, 5.64, 5.96
[iyunv@hostb libexec]# echo $?
2
[iyunv@hostb libexec]# sh check_load_low.sh-LW 8,8,8 -LC 1,1,1  
#低于警告阈值高于紧急阈值,退出值为1
warn,load average:  4.82, 5.43, 5.85
[iyunv@hostb libexec]# echo $?
1
[iyunv@hostb libexec]# shcheck_load_low.sh -LW 1,1,1 -LC 0.5,0.5,0.5  
#负载高于警告,紧急阈值,则正常
OK,load average:  5.59, 5.54, 5.85
[iyunv@hostb libexec]# echo $?
0

3、  设置上限警告阈值、紧急阈值执行效果
[iyunv@hostb libexec]# shcheck_load_low.sh -UW 5,5,5 -UC 6,6,6
#高于警告值,低于紧急值则退出值为1
warn,load average:  5.28, 5.35, 5.73
[iyunv@hostb libexec]# echo $?
1
[iyunv@hostb libexec]# shcheck_load_low.sh -UW 4,4,4 -UC 5,5,5
#同时高于警告值、紧急值则退出值为2
crit,load average:  5.28, 5.35, 5.73
[iyunv@hostb libexec]# echo $?
2
[iyunv@hostb libexec]# shcheck_load_low.sh -UW 15,15,15 -UC 20,20,20
#同时低于警告值、紧急值则退出值为0
OK,load average:  5.20, 5.32, 5.68
[iyunv@hostb libexec]# echo $?
0

Shell脚本代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
[iyunv@hostb libexec]# cat check_load_low.sh
#!/bin/sh
  
#####获得当前cpu负载信息#####
load1=`uptime|awk -F: '{print $5}'|awk -F, '{print$1}'`
load5=`uptime|awk -F: '{print $5}'|awk -F, '{print$2}'`
load15=`uptime|awk -F: '{print $5}'|awk -F, '{print$3}'`
  
  
###定义帮助信息函数#####
help(){
echo "Option:"
echo "parament one"
echo " --lower_limit_warn|-LW    ;setlower warning limit threshold value."
echo " --upper_limit_warn|-UW    ;setupper warning limit threshold value."
echo "parament two"
echo " --lower_limit_crit|-LC    ;setlower crit limit threshold value."
echo " --upper_limit_crit|-LC    ;setupper crit limit threshold value."
echo "Example:"
echo "  $0 -LW 0.5,0.5,0.5  -LC 0.1,0.1,0.1"
echo "  $0 -UW 15,15,15  -UC 20,20,20"
echo "  $0 -LW 1,1,1"
echo "  $0 -UW 15,15,15 "
}
  
  
  
  
  
####获取第一个warn传参值,可以是上限阈值或下限阈值######
case $1 in
       --lower_limit_warn|-LW)
       load_warn=(`echo $2|sed 's/,/ /g'`)
       load1_warn=${load_warn[0]}
       load5_warn=${load_warn[1]}
       load15_warn=${load_warn[2]}
        ;;
       --upper_limit_warn|-UW)
       load_warn=(`echo $2|sed 's/,/ /g'`)
       load1_warn=${load_warn[0]}
       load5_warn=${load_warn[1]}
       load15_warn=${load_warn[2]}
        ;;
esac
  
#####获取crit传参值,可以是上限阈值或下限阈值######
case $3 in
       --lower_limit_crit|-LC)
       load_crit=(`echo $4|sed 's/,/ /g'`) #系统uptime输出中有逗号,用sed替换。
       load1_crit=${load_crit[0]}     #使用数组来分别取负载3个值
       load5_crit=${load_crit[1]}
       load15_crit=${load_crit[2]}
        ;;
       --upper_limit_crit|-UC)
       load_crit=(`echo $4|sed 's/,/ /g'`)
       load1_crit=${load_crit[0]}
       load5_crit=${load_crit[1]}
       load15_crit=${load_crit[2]}
        ;;
esac
  
  
#####定义下限告警比较函数########
lower_warn_compare(){
        #把阈值和当前系统值进行对比。
       load1_warn_compare=`echo "$load1 > $load1_warn"|bc`
       load5_warn_compare=`echo "$load5 > $load5_warn"|bc`
       load15_warn_compare=`echo "$load15 > $load15_warn"|bc`
        #如果系统值比阈值低,则比较变量值为1,便于后续调用
        if [[$load1_warn_compare == 0 ]];then
               lower_warn_compare=1
        elif[[ $load5_warn_compare == 0 ]];then
               lower_warn_compare=1
        elif[[ $load15_warn_compare == 0 ]];then
                lower_warn_compare=1
        else
               lower_warn_compare=0
  
        fi
  
}
  
####定义下限紧急比较函数####
lower_crit_compare(){
        #把阈值和当前系统值进行对比
       load1_crit_compare=`echo "$load1 > $load1_crit"|bc`
       load5_crit_compare=`echo "$load5 > $load5_crit"|bc`
       load15_crit_compare=`echo "$load15 > $load15_crit"|bc`
        #如果系统值比阈值低,则比较变量值为2,便于后续调用
        if [[$load1_crit_compare == 0 ]];then
               lower_crit_compare=2
        elif[[ $load5_crit_compare == 0 ]];then
               lower_crit_compare=2
        elif[[ $load15_crit_compare == 0 ]];then
               lower_crit_compare=2
        else
               lower_crit_compare=0
        fi
}
  
  
####定义上限告警比较函数###
upper_warn_compare(){
        #把阈值和当前系统值进行对比
       load1_warn_compare=`echo "$load1 > $load1_warn"|bc`
       load5_warn_compare=`echo "$load5 > $load5_warn"|bc`
       load15_warn_compare=`echo "$load15 > $load15_warn"|bc`
        #如果系统值比阈值高,则比较变量值为1,便于后续调用
        if [[$load1_warn_compare == 1 ]];then
               upper_warn_compare=1
        elif[[ $load5_warn_compare == 1 ]];then
               upper_warn_compare=1
        elif[[ $load15_warn_compare == 1 ]];then
               upper_warn_compare=1
        else
               upper_warn_compare=0
        fi
}
  
  
####定义上限紧急比较函数###
upper_crit_compare(){
        #把阈值和当前系统值进行对比
       load1_crit_compare=`echo "$load1 > $load1_crit"|bc`
       load5_crit_compare=`echo "$load5 > $load5_crit"|bc`
       load15_crit_compare=`echo "$load15 > $load15_crit"|bc`
  
        #如果系统值比阈值高,则比较变量值为2,便于后续调用
        if [[$load1_crit_compare == 1 ]];then
               upper_crit_compare=2
        elif [[$load5_crit_compare == 1 ]];then
               upper_crit_compare=2
        elif[[ $load15_crit_compare == 1 ]];then
               upper_crit_compare=2
        else
               upper_crit_compare=0
        fi
}
  
  
####如果系统参数数量不是2或4,则输出帮助信息###
if [[ $# == 2 || $# == 4 ]];then
    values2=(`echo $2|sed 's/,/ /g'`)
    values4=(`echo $4|sed 's/,/ /g'`)
     #如果紧急负载值为空,或是3个值则正常,否则输出帮助信息并退出
     if [[${values4[@]} == "" || ${#values4[@]} == 3 ]];then
        a=1
        else
        help
        exit2
     fi
  
     #如果警告负载值不是3个,则输出帮助信息并退出
     if [[${#values2[@]} != 3 ]];then
        help
        exit2   
     fi
  
else
   help
   exit 2
fi
  
  
####判断告警传参,执行相应的比较函数。
case $1 in
       --lower_limit_warn|-LW)
       lower_warn_compare
        ;;
       --upper_limit_warn|-UW)
       upper_warn_compare
        ;;
       *)    #如果输入与上述两点不匹配,则输出帮助信息
        help
        ;;
esac
  
####判断紧急传参,执行相应的比较函数。
case $3 in
       --lower_limit_crit|-LC)
       lower_crit_compare
        ;;
       --upper_limit_crit|-UC)
       upper_crit_compare
        ;;
       "")
        a=1
        ;;
        *)
        help
        ;;
esac
  
  
####执行成功后,输出负载信息###
####此处变量在上面函数中都有定义,如果该变量等于1或2,则代表负载超过或低于阈值。则退出值为相应的状态值。
if [[ $upper_crit_compare == 2  ]];then
        echo"crit,load average: $load1,$load5,$load15"
        exit2
elif [[ $lower_crit_compare == 2 ]];then
        echo"crit,load average: $load1,$load5,$load15"
        exit2
elif [[ $upper_warn_compare == 1 ]];then
        echo"warn,load average: $load1,$load5,$load15"
        exit1
elif [[ $lower_warn_compare == 1 ]];then
        echo"warn,load average: $load1,$load5,$load15"
        exit1
else
        echo"OK,load average: $load1,$load5,$load15"
        exit0
fi






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-19899-1-1.html 上篇帖子: nagios client shell 下篇帖子: ganglia运维监控解决方案及与nagios监控整合 服务器 监控 开发
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表