HTTP、TCP 以及数据库可用性检测服务:CyberTect 1.0.0版本正式发布

来源: 投稿
作者: 粘土帽子
2021-11-20

Cyber Tect

Build Status提供常用的HTTP接口、TCP端口、DNS域名解析、Ping以及各常用数据库的定时检测告警。

启动程序

建议直接使用已打包好的docker镜像启动项目,启动脚本如下:

docker run -d --restart=always \
  -p 7001:7001 \
  -e GO_ENV=production \
  -e DATABASE_URI=postgres://vicanso:A123456@127.0.0.1:5432/cybertect \
  -e MAIL_URI=smtp://tree.xie@outlook.com:pass@smtp.office365.com:587 \
  -e DETECTOR_INTERVAL=1m \
  -e DETECTOR_EXPIRED=30d \
  --name=cybertect \
  vicanso/cybertect
  • GO_ENV 设置为正式环境
  • DATABASE_URI 数据库连接地址
  • MAIL_URI 用于发送告警邮件的SMTP设置
  • DETECTOR_INTERVAL 检测间隔,默认为1m(1分钟一次)
  • DETECTOR_EXPIRED 检测结果过期时间,默认为30天(30d),过期后的数据会自动清除。若不希望清除检测结果,则设置为负数则可,如:-1d

数据存储

检测配置等数据暂仅支持存储至postgres与mysql,仅需要启动时通过环境变量(DATABASE_URI)指定数据库连接串时指定则可,连接串格式如下:

  • postgres: postgres://root:pass@127.0.0.1:5432/cybertect?maxIdleConns=5&maxIdleTime=30m&maxOpenConns=100
  • mysql: mysql://root:pass@tcp(127.0.0.1:3306)/cybertect?timeout=30s&parseTime=true&maxIdleConns=5&maxIdleTime=30m&maxOpenConns=100

postgres

用户信息及检测配置、结果等数据保存在postgres中,若无现成的postgres可使用以下脚本启动实例:

docker pull postgres:14-alpine

docker run -d --restart=always \
  -v $PWD/data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=A123456 \
  -p 5432:5432 \
  --name=postgres \
  postgres:14-alpine

docker exec -it postgres sh

psql -c "CREATE DATABASE cybertect;" -U postgres
psql -c "CREATE USER vicanso WITH PASSWORD 'A123456';" -U postgres
psql -c "GRANT ALL PRIVILEGES ON DATABASE cybertect to vicanso;" -U postgres

项目启动

项目连接数据库使用ent框架,相关代码动态生成,因此使用前需要先执行:

make install && make generate

启动程序:

go run main.go 

HTTP检测

HTTP检测通过指定检测URL,定时调用判断返回的HTTP状态码是否>=200且<400,如果是则认为成功,否则失败(对于https还检测期证书是否差不多过期,如果要过期则认为检测失败),失败时通过email发送告警邮箱。配置如下:

  • 名称 检测配置名称
  • 状态 是否启用状态
  • 超时 设置超时时长,单位为秒
  • 用户列表 可以编辑该配置的用户
  • 告警接收 选择接收告警邮件的用户
  • IP列表 指定URL中域名对应的解析,如果域名解析的IP为多个,可以配置多个IP地址,以,分隔。如果不需要指定(配置的检测地址为IP形式或直接通过DNS解析),则配置为0.0.0.0
  • 检测地址 配置检测的http(s)访问地址则可
  • 检测脚本 可配置基于响应数据的检测脚本(javascript),如果响应类型的json,则resp为Object,否则为String
  • 配置描述 检测配置描述

检测脚本示例(响应数据为json):

if (!resp || resp.code != "123") {
  throw new Error("信息异常");
}

完成配置之后,系统会定时执行检测配置,相关检测结果可在列表中查询并可查询每次检测的详情,包括HTTP(s)请求完整链路的时间(tcp连接、tls连接等)。

DNS检测

DNS检测域名在指定DNS服务器的解析记录是否与期望的IP列表一致,主要用于检测是否有DNS劫持,支持IPV4与IPV6的DNS解析。配置如下:

  • 名称 检测配置名称
  • 状态 是否启用状态
  • 超时 设置超时时长,单位为秒
  • 用户列表 可以编辑该配置的用户
  • 告警接收 选择接收告警邮件的用户
  • 域名 检测域名
  • IP列表 域名对应的IP地址列表,如果DNS解析的IP不在此列表中,则失败
  • DNS DNS服务器列表
  • 配置描述 检测配置描述

TCP检测

TCP检测指定的多个地址的端口监听状态(相关服务),如redis集群等,主要用于简单的服务是否可用的检测。配置如下:

  • 名称 检测配置名称
  • 状态 是否启用状态
  • 超时 设置超时时长,单位为秒
  • 用户列表 可以编辑该配置的用户
  • 告警接收 选择接收告警邮件的用户
  • 地址列表 检测的地址列表
  • 超时 设置超时时长,单位为秒
  • 配置描述 检测配置描述

Ping检测

Ping检测用于检测网络的连通性,主要用于测试简单的网络连通、机器是否在线等最基本的检测。配置如下:

  • 名称 检测配置名称
  • 状态 是否启用状态
  • 超时 设置超时时长,单位为秒
  • 用户列表 可以编辑该配置的用户
  • 告警接收 选择接收告警邮件的用户
  • IP列表 检测的IP列表
  • 配置描述 检测配置描述

Database检测

Database检测用于测试数据库连通性,主要用于简单的测试数据库是否可正常连接,现支持以下数据库:redispostgresmysql以及mongodb

Redis

Redis数据库支持三种模式,数据库驱动使用go-redis,数据库连接串格式如下:

  • 单实例redis://[:pass@]host:port/,密码选项根据数据库是否有设置密码而添加。
  • Sentinelredis://[:pass@]host1,port1,host2:port2/?master=master[&sentinelPassword=sentinelPassword],密码选项根据数据库是否有设置密码而添加,sentinel必须指定master,若不指定master则会判断为cluster模式。
  • Clusterredis://[:pass@]host1,port1,host2:port2,host3:port3/,密码选项根据数据库是否有设置密码而添加。

Postgres

postgres连接串格式如下:postgres://[jack:secret@]foo.example.com:5432[,...bar.example.com:5432]/mydb,数据库驱动使用pgx模块。

Mysql

mysql连接串格式如下:mysql://[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN],数据库驱动使用mysql模块。

Mongodb

mongodb连接串格式如下:mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]],数据库驱动使用mongodb模块。

个人信息设置

告警信息使用Email发送,因此需要设置个人邮箱后才可接收到告警信息。

展开阅读全文
28 收藏
分享
加载中
精彩评论
好东西。但是为啥不做成支持主流cpu平台架构的单个静态二进制文件?
2021-11-20 12:09
2
举报
太棒了太棒了,正好需要类似的监控
2021-11-25 10:11
1
举报
因为程序选择一台服务器来部署,通过配置去检测各网络服务,因此暂时仅提供了docker镜像,如果有需要可以先直接编译,后续版本我增加各主流平台的二进制版本
2021-11-20 14:51
1
举报
最新评论 (8)
aqu
可以考虑增加一下钉(我哪里重复了?)钉机器人或企业微信机器人报警
2021-11-26 09:43
0
回复
举报
有初始化配置功能吗,不想启动后,在页面设置
2021-11-25 13:45
0
回复
举报
太棒了太棒了,正好需要类似的监控
2021-11-25 10:11
1
回复
举报
希望增加ssl证书过期检测
2021-11-22 13:37
0
回复
举报
您好,请问Java怎么自己实现TCP?
2021-11-20 18:40
0
回复
举报
好东西。但是为啥不做成支持主流cpu平台架构的单个静态二进制文件?
2021-11-20 12:09
2
回复
举报
因为程序选择一台服务器来部署,通过配置去检测各网络服务,因此暂时仅提供了docker镜像,如果有需要可以先直接编译,后续版本我增加各主流平台的二进制版本
2021-11-20 14:51
1
回复
举报
mark
2021-11-20 11:55
0
回复
举报
更多评论
8 评论
28 收藏
分享
返回顶部
顶部