Please enable Javascript to view the contents

使用 Jenkins 进行服务拨测

 ·  ☕ 3 分钟

1. 为什么要拨测

对于系统中的一些关键服务,我们通常会配置监控服务。当故障发生时,能够尽快被检测到,发送通知给关注人。当故障发生后,能够有效地追溯故障过程。

拨测是监控系统中的一个重要环节,能够检测服务的网络质量,并提供实时告警。

在公有云上,云厂商通过广泛分布的拨测节点,提供拨测服务。那么在 Jenkins 上如何实现拨测功能呢?

2. 搭建邮件服务器

这里选择的是 Poste 邮件服务,邮件域名 mail.dev.chenshaowen.com。

  1. 域名配置
  • 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. 运行服务
  • 创建数据存储目录
1
mkdir /maildata
  • 以后台的方式运行 poste.io
 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
  1. 服务配置,设置 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 分钟触发一次流水线,填入参数:

1
*/5 * * * *

最后,点击【确认】,保存即可。

4. 测试拨测功能

4.1 SUCCESS

在流水线,直接使用预期的参数,进行测试。

查看执行日志:

4.2 FAILURE

这里有意地将状态码设置为 201,超时时间设置为 0 秒,以触发检查失败后的通知逻辑。

查看执行日志:

在邮件中,我们也可以看到告警邮件:


微信公众号
作者
微信公众号