目录

    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. 运行服务
    • 创建数据存储目录
    mkdir /maildata
    
    • 以后台的方式运行 poste.io
    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 文件内容:

    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 分钟触发一次流水线,填入参数:

    */5 * * * *
    

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

    4. 测试拨测功能

    4.1 SUCCESS

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

    查看执行日志:

    4.2 FAILURE

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

    查看执行日志:

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