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 阶段,但思路很有意思——把多个检测串起来,前一个的结果可以给后一个用。比如测试一个完整业务流程:
- 登录获取 token
- 用 token 访问受保护资源
- 验证数据正确性
- 退出登录
中间任何一步失败,整个流程就算失败。
数据存储
三种模式:
- 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