1. 为什么要拨测
对于系统中的一些关键服务,我们通常会配置监控服务。当故障发生时,能够尽快被检测到,发送通知给关注人。当故障发生后,能够有效地追溯故障过程。
拨测是监控系统中的一个重要环节,能够检测服务的网络质量,并提供实时告警。
在公有云上,云厂商通过广泛分布的拨测节点,提供拨测服务。那么在 Jenkins 上如何实现拨测功能呢?
2. 搭建邮件服务器
这里选择的是 Poste 邮件服务,邮件域名 mail.dev.chenshaowen.com。
- 域名配置
- mail.dev.chenshaowen.com -> A 记录 -> 主机 IP
- mail.dev.chenshaowen.com -> TXT 记录 -> v=spf1 +all
- _dmarc.mail.dev.chenshaowen.com -> TXT 记录 -> v=DMARC1;p=none
- 运行服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| docker run -d \
-p 25:25 \
-p 80:80 \
-p 110:110 \
-p 143:143 \
-p 443:443 \
-p 587:587 \
-p 993:993 \
-p 995:995 \
-v /etc/localtime:/etc/localtime:ro \
-v /maildata:/data \
--name "mailserver" \
-h "mail.dev.chenshaowen.com" \
-t analogic/poste.io
|
- 服务配置,设置 IP 白名单
打开页面 https://mail.dev.chenshaowen.com:443 ,创建邮件账户。进入 Poste 的主页可以看到如下页面:
这里需要将 Jenkins 运行的主机 IP 加入到白名单中,否则会有 550 报错。
除此,在 /webmail/ 路由下,用户可以正常使用邮箱功能。
3. 使用 Jenkins 进行拨测
快速部署 Jenkins 可以参考 Docker Compose 脚本。
主要使用的功能包括:
3.1 开启邮件通知
在 Jenkins 的【系统管理】->【系统配置】->【邮件通知】中,配置邮件通知服务,如下图:
填入服务相关信息之后,建议发送测试邮件,确保邮件功能正常。最后,保存即可。
3.2 新建一个流水线
这里的拨测,主要分为服务状态码和响应时间两部分,分别由两个并行的 Stage 构成。
测试的原理是,通过 curl
命令获取服务链接的状态码和响应时间,然后与预期值比较。如果满足触发条件,则发送异常通知邮件。
下面是 Jenkinsfile 文件内容:
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
| pipeline {
agent any
parameters {
string(name: 'LINK', defaultValue: 'https://www.chenshaowen.com/', description: '待拨测链接')
string(name: 'HTTP_CODE', defaultValue: '200', description: '预期状态码')
string(name: 'TIME_TOTAL', defaultValue: '1', description: '超时时间,单位:秒')
string(name: 'EMAIL', defaultValue: '[email protected]', description: '异常时,邮件通知人')
}
stages {
stage('default') {
parallel {
stage('状态测试') {
steps {
script {
try{
sh '''
export _HTTP_CODE=$(curl --connect-timeout 120 -s -o /dev/null -w \'%{http_code}\' $LINK)
if [ "$_HTTP_CODE" != "$HTTP_CODE" ]
then
exit -1
fi
'''
}catch(err){
currentBuild.result = 'FAILURE'
mail(subject: "$LINK 访问状态码错误", body: "消息来自 DevOps 流水线,请检查相关服务是否异常。", to: "$EMAIL")
}
}
}
}
stage('超时测试') {
steps {
script {
try{
sh '''
_TIME_TOTAL=$(curl --connect-timeout 120 -s -o /dev/null -w \'%{time_total}\' $LINK)
TIME_TOTAL=`echo $TIME_TOTAL| awk '{print int($0)}'`
_TIME_TOTAL=`echo $_TIME_TOTAL| awk '{print int($0)}'`
if [ $_TIME_TOTAL -ge $TIME_TOTAL ]
then
exit -1
fi
'''
}catch(err){
currentBuild.result = 'FAILURE'
mail(subject: "$LINK 访问超时", body: "消息来自 DevOps 流水线,请检查相关服务是否异常。", to: "$EMAIL")
}
}
}
}
}
}
}
}
|
新建一个【流水线】任务,点击【配置】,在【流水线】的脚本内容中粘贴上面的 Jenkinsfile 内容,保存即可。
3.3 定时构建
成功创建拨测流水线之后,只能人工触发。拨测需要的是, 24 小时无间断地监控。这时,就需要使用到定时构建功能。
在流水线页面,点击【配置】,找到【构建触发器】。勾选定时构建,设置每 5 分钟触发一次流水线,填入参数:
最后,点击【确认】,保存即可。
4. 测试拨测功能
4.1 SUCCESS
在流水线,直接使用预期的参数,进行测试。
查看执行日志:
4.2 FAILURE
这里有意地将状态码设置为 201,超时时间设置为 0 秒,以触发检查失败后的通知逻辑。
查看执行日志:
在邮件中,我们也可以看到告警邮件: