编程 Gatus:Go 编写的服务健康监控面板,主动探测 + 30+ 告警渠道

2026-07-11 08:40:40 +0800 CST views 7

Gatus:Go 编写的服务健康监控面板,主动探测 + 30+ 告警渠道

Gatus 是一个开源的健康监控面板,用 Go 写的。核心思路很简单:定期探测你的服务,根据预定义的条件判断是否健康,出问题就告警。

支持的探测方式

  • HTTP/HTTPS(最常用)
  • ICMP(ping)
  • TCP/UDP/SCTP
  • DNS 查询
  • WebSocket
  • gRPC
  • SSH
  • TLS/STARTTLS
  • 域名过期时间、SSL 证书过期时间

为什么选它

传统的监控方案依赖"已有流量",意味着除非用户已经在经历问题,否则你收不到告警。而 Gatus 允许你为每个功能配置健康检查,在用户受影响之前就能发现问题。

一个简单的判断标准:如果负载均衡现在挂了,现有的告警能触发吗?如果答案是不能,那 Gatus 值得看看。

核心功能:灵活的条件判断

这是 Gatus 最强的地方。不光能检查 HTTP 状态码,还能检查:

  • 响应时间(比如要求 300ms 内返回)
  • 响应体内容(支持 JSONPath)
  • 目标 IP 地址
  • SSL 证书过期时间
  • 域名过期时间
  • DNS 解析结果

配置示例

endpoints:
  - name: website
    url: "https://example.com/health"
    interval: 5m
    conditions:
      - "[STATUS] == 200"
      - "[BODY].status == UP"
      - "[RESPONSE_TIME] < 300"

每 5 分钟检查一次,要求:状态码是 200、响应体 status 字段是 UP、响应时间 300ms 以内。

支持的条件写法

条件说明
[STATUS] == 200状态码等于 200
[STATUS] < 300状态码小于 300
[STATUS] == any(200, 429)状态码是 200 或 429
[RESPONSE_TIME] < 500响应时间小于 500ms
[BODY].user.name == john响应体里 user.name 等于 john
len([BODY].data) < 5响应体里 data 数组长度小于 5
[CERTIFICATE_EXPIRATION] > 48h证书过期时间超过 48 小时
[DOMAIN_EXPIRATION] > 720h域名过期时间超过 720 小时

告警渠道:多到离谱

Slack、Discord、Telegram、Mattermost、Teams、PagerDuty、Opsgenie、Twilio、短信、邮件、微信(企业微信 webhook)、钉钉、飞书……加起来 30 多种,基本覆盖了主流通讯工具和 On-call 平台。

alerting:
  slack:
    webhook-url: "https://hooks.slack.com/services/xxx"

endpoints:
  - name: api
    url: "https://api.example.com/health"
    alerts:
      - type: slack
        description: "API 健康检查失败"
        send-on-resolved: true

外部端点推送

除了 Gatus 主动去探测,还支持外部主动推送状态:

  • 内网里的服务,Gatus 访问不到,可以让内网 agent 推送状态到公网 Gatus
  • 不支持的协议,可以自己写脚本检测,然后推送结果
  • 需要自定义检测逻辑的,可以完全自己实现,只把 Gatus 当展示面板
external-endpoints:
  - name: internal-service
    group: core
    token: "your-secret-token"
    heartbeat:
      interval: 30m  # 30 分钟没收到推送就告警

外部用 HTTP POST 推送:

POST /api/v1/endpoints/{key}/external?success=true
Authorization: Bearer your-secret-token

Suites(工作流式监控)

还在 Alpha 阶段,但思路很有意思——把多个检测串起来,前一个的结果可以给后一个用。比如测试一个完整业务流程:

  1. 登录获取 token
  2. 用 token 访问受保护资源
  3. 验证数据正确性
  4. 退出登录

中间任何一步失败,整个流程就算失败。

数据存储

三种模式:

  • memory:内存存储,重启数据丢失(默认)
  • sqlite:SQLite 数据库,适合单机部署
  • postgres:PostgreSQL,适合生产环境

怎么部署

最简单的方式,Docker 一条命令:

docker run -p 8080:8080 --name gatus ghcr.io/twin/gatus:stable

挂载配置文件:

docker run -p 8080:8080 \
  -v $(pwd)/config:/config \
  ghcr.io/twin/gatus:stable

Kubernetes 里有官方 Helm Chart,也有 Terraform 模块。

完整配置示例

endpoints:
  - name: blog
    group: core
    url: "https://blog.example.com"
    interval: 5m
    conditions:
      - "[STATUS] == 200"
      - "[RESPONSE_TIME] < 1000"
    alerts:
      - type: slack
        description: "博客访问异常"

  - name: api
    group: core
    url: "https://api.example.com/health"
    interval: 1m
    conditions:
      - "[STATUS] == 200"
      - "[BODY].status == healthy"
      - "[CERTIFICATE_EXPIRATION] > 168h"  # 证书至少还有 7 天
    alerts:
      - type: pagerduty
        description: "API 健康检查失败"

storage:
  type: postgres
  path: "postgres://user:pass@localhost:5432/gatus"

web:
  address: 0.0.0.0
  port: 8080

配置文件支持环境变量替换,比如 url: "https://${DOMAIN}/health"。还能把配置拆成多个文件,Gatus 会自动合并。

资源消耗

Go 写的程序,资源占用很小。作者说在 Kubernetes 集群里跑着监控核心应用,占用可以忽略不计。有特殊需求可以调整并发数(concurrency 参数)控制资源使用。

谁在用

项目 README 里列了不少用户,包括一些公司用在生产环境。作者自己也用它监控核心应用:https://status.twin.sh/

总结

Gatus 的定位很清晰:主动探测式健康监控,而不是被动等待告警。

如果你需要:

  • 在用户发现问题之前发现问题
  • 监控内部服务(内网、特殊协议)
  • 比简单 HTTP 200 更复杂的健康判断
  • 出问题时才收到通知,不想盯着仪表盘

官网:https://gatus.io
GitHub:https://github.com/TwiN/gatus
文档:https://gatus.io/docs

推荐文章

12个非常有用的JavaScript技巧
2024-11-19 05:36:14 +0800 CST
Go语言SQL操作实战
2024-11-18 19:30:51 +0800 CST
程序员茄子在线接单