分布式网络延迟监控工具-smartping

上篇文章网络延迟监控-smokeping讲到smokeping这款网络延迟监控工具,开源且配置简单,适合用来监控各个节点到master的网络情况;但如果想监控各个节点之间的网络情况,有另外一款开源的工具可用smartping,这款工具即适合单点部署,也能分布式,适合监控整个网络集群的情况。

安装

smartping安装非常简单,官方提供二进制程序,直接运行即可,https://docs.smartping.org/install/。也可以通过源码编译安装,依赖本地安装go环境。启动之后,直接访问即可,http://127.0.0.1:8899. 默认密码:smartping

分布式部署

如果要监控多个节点之间的网络情况,就需要在每个节点上都安装smartping,这样每个节点都可以主动发起ping请求,来监测自身与其他节点的网络质量。若每个节点都要配置,那就非常麻烦了;这时候,可以留一个节点作为本地模式,其他节点都配置成云模式,其实就是master、slave模式,slave节点会自动从master节点同步配置,省去了繁琐的配置过程。
云配置地址:http://XX.XX.XX.XX:8899/api/config.json,也就是master的配置地址,密码默认为:smartping

解决邮件报警问题

smartping支持邮件发送报警的功能,但在配置邮箱信息时,发现原作者只支持了25端口,一般公司邮箱的smtp服务器都是加密的,如465、587端口等。本工具是开源的,直接修改下源码,再编译安装即可完成。

  1. 源码地址:https://github.com/smartping/smartping
  2. 本地安装go环境。
  3. 发送邮件的代码在src/funcs/alert.go中,作者源码如下:

    func SendMail(user, pwd, host, to, subject, body string) error {
        if len(strings.Split(host, ":")) == 1 {
            host = host + ":25"
        }
        auth := smtp.PlainAuth("", user, pwd, strings.Split(host, ":")[0])
        content_type := "Content-Type: text/html" + "; charset=UTF-8"
        msg := []byte("To: " + to + "\r\nFrom: " + user + "\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
        send_to := strings.Split(to, ";")
        err := smtp.SendMail(host, auth, user, send_to, msg)
        if err != nil {
            return err
        }
        return nil
    }

    可以看到源码中首先判断是否含有冒号,如果就把端口设置为25,并且使用PlainAuth的方式进行登录,在这里加上对其他端口的兼容即可。修改如下:

    func SendMail(user, pwd, host, to, subject, body string) error {
        if !strings.Contains(host, ":") {
            host += ":25" // 默认使用25端口
        }
        parts := strings.Split(host, ":")
        server := parts[0]
        port := parts[1]
    
        recipients := strings.Split(to, ";")
        msg := fmt.Sprintf("To: %s\r\nFrom: %s\r\nSubject: %s\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n%s",
    to, user, subject, body)
    
        if port == "465" {
            // 使用 TLS 方式连接
            conn, err := tls.Dial("tcp", host, &tls.Config{
            InsecureSkipVerify: true,
            ServerName:         server,
        })
        if err != nil {
            return fmt.Errorf("TLS dial error: %v", err)
        }
        client, err := smtp.NewClient(conn, server)
        if err != nil {
            return fmt.Errorf("SMTP client error: %v", err)
        }
        auth := smtp.PlainAuth("", user, pwd, server)
        if err = client.Auth(auth); err != nil {
            return fmt.Errorf("auth error: %v", err)
        }
        if err = client.Mail(user); err != nil {
            return err
        }
        for _, addr := range recipients {
            if err = client.Rcpt(strings.TrimSpace(addr)); err != nil {
            return err
            }
        }
        w, err := client.Data()
        if err != nil {
            return err
        }
        _, err = w.Write([]byte(msg))
        if err != nil {
            return err
        }
        w.Close()
        return client.Quit()
    } else {
        // 使用普通方式发送
        auth := smtp.PlainAuth("", user, pwd, server)
        return smtp.SendMail(host, auth, user, recipients, []byte(msg))
    }

    修改之后,重新编译,替换原来的二进制程序即可。
    上面代理依赖tls包,需要在alert.go中引入依赖:

    import (
            "bytes"
            "encoding/json"
            "fmt"
         "github.com/cihub/seelog"
            _ "github.com/mattn/go-sqlite3"
            "github.com/smartping/smartping/src/g"
            "github.com/smartping/smartping/src/nettools"
            "net/smtp"
         "strconv"
            "strings"
            "time"
            "crypto/tls"  //这是新增
    )
版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=1651