ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Gatus服务健康监控:基于Docker与config.yaml的轻量级实时探测方案

Gatus服务健康监控:基于Docker与config.yaml的轻量级实时探测方案 1. 项目概述Gatus不是另一个告警工具而是服务健康状态的“实时仪表盘”你有没有遇到过这样的情况凌晨三点手机突然震动打开一看是网站挂了的告警登录服务器发现Nginx进程还在但上游API全超时查日志发现是某个依赖服务DNS解析失败而这个故障已经持续了47分钟——可监控系统直到超时阈值被连续触发3次才发告警。这不是个别现象而是很多团队在用PrometheusAlertmanager或Zabbix做“事后补救式监控”时的真实写照。Gatus解决的恰恰是这个断层它不关心CPU用了85%还是92%也不统计过去一小时的平均响应时间它只问一个问题——“此刻用户点击‘提交订单’按钮能不能成功”Gatus是一个用Go编写的轻量级、开箱即用的服务健康检查工具核心定位非常清晰面向终端用户体验的主动式健康探测器。它不像传统监控那样埋点、采集、聚合、告警而是模拟真实用户行为——发起HTTP请求、验证状态码、校验响应体JSON字段、比对响应时间、甚至执行自定义脚本——然后把结果以极简方式可视化。它的配置文件就叫config.yaml没有数据库、不依赖外部存储、不强制要求Docker但Docker确实是它最自然的运行环境。我第一次在客户现场部署Gatus从下载二进制到看到首页仪表盘只用了6分23秒中间还顺手给运维同事演示了怎么用curl -X POST http://localhost:8080/health手动触发一次探测。关键词里反复出现的Linux、Docker、config.yaml其实勾勒出一条极简落地路径你在任意一台Linux服务器物理机、虚拟机、云主机甚至树莓派上装好Docker拉取官方镜像挂载一个写好的config.yamldocker run启动——整个监控系统就活了。它不抢夺你的现有监控栈而是作为前端“守门人”把那些“服务看似在线实则不可用”的灰色地带揪出来。比如我们曾用它发现某支付网关在TLS握手阶段偶发失败返回HTTP 000而传统基于HTTP 200的探针完全无法捕获也用它在灰度发布时自动对比新旧版本接口的响应结构差异提前拦截字段缺失导致的前端报错。这不是运维工具这是开发、测试、产品都能看懂的健康语言。2. 核心设计逻辑为什么Gatus选择“配置即代码”而非“界面即一切”2.1 拒绝GUI陷阱配置文件才是最可靠的监控契约很多监控工具起步就堆Web界面结果三年后团队发现没人记得当初在界面上点过哪些开关告警规则散落在数据库不同表里迁移环境时要导出导入一堆JSON更别说审计变更历史了。Gatus反其道而行之——所有监控逻辑、探测规则、告警渠道、分组策略全部收敛到单个config.yaml文件中。这不是为了炫技而是基于三个硬性事实第一配置必须可版本化。我们把config.yaml直接放进Git仓库和业务代码同分支管理。每次修改都走PR流程附带说明“为何调整超时阈值至3s因CDN缓存策略变更”。上线前CI流水线会用gatus validate命令校验语法避免手误写错缩进导致整个监控失效。这比任何后台操作日志都可靠。第二配置必须可复现。客户A的生产环境和客户B的测试环境只需交换两个yaml文件就能100%复现监控策略。我们曾用同一份配置在本地Docker Desktop、阿里云ECS、AWS EC2上分别验证结果完全一致——因为Gatus根本不读取宿主机环境变量或配置文件路径它只认-c /path/to/config.yaml这个参数。第三配置必须可推理。打开一个典型Gatus配置你能立刻读懂业务语义endpoints: - name: 用户登录服务 url: https://api.example.com/v1/login interval: 30s conditions: - [STATUS] 200 - [RESPONSE_TIME] 1500 - [BODY].data.token ! null这里没有“指标名xxx”、“标签xxx”的抽象映射[BODY].data.token就是真实的JSON路径。当开发说“登录接口返回token字段为空”测试能直接定位到这行条件删掉! null改成 test_token做回归验证。这种直白性是GUI拖拽永远做不到的。提示Gatus的条件表达式引擎基于gojsonq支持嵌套JSON、数组索引、类型判断[TYPE] string、正则匹配[BODY].message ~ success。别小看这个设计——它让非Go工程师也能安全地编写复杂断言而不用学Prometheus的PromQL。2.2 Docker不是可选项而是架构基因Gatus官方镜像体积仅12MBAlpine基础启动后内存占用稳定在15MB左右。我们做过压测单实例每秒可并发执行200个HTTP探测含TLS握手、JSON解析、条件校验CPU峰值不超过0.3核。这意味着什么你可以把它当成“监控领域的nginx”——一个容器一个端口一个配置文件承载所有探测任务。为什么Docker是刚需因为Gatus的探测模型天然需要隔离性。比如你要同时监控内网服务需访问10.0.0.0/8网段外网服务需走公网出口本地调试服务localhost:3000如果用二进制部署这些网络策略得靠宿主机iptables或路由表硬配稍有不慎就互相干扰。而Docker天生提供网络命名空间隔离# 监控内网服务连接到自定义bridge网络 docker run -d --network internal-net -v $(pwd)/config-internal.yaml:/config.yaml gatusio/gatus # 监控外网服务默认使用host网络或nat docker run -d --network host -v $(pwd)/config-external.yaml:/config.yaml gatusio/gatus更关键的是Docker Compose让多环境配置变得极其简单。我们为每个客户生成标准docker-compose.ymlversion: 3.8 services: gatus: image: gatusio/gatus:v2.8.0 ports: - 8080:8080 volumes: - ./config.yaml:/config.yaml environment: - GATUS_ENVIRONMENTprod restart: unless-stopped运维同事只需改两处image标签升级版本号volumes指向客户专属配置。连docker-compose up -d都不用记我们做成一键脚本./deploy.sh里面就三行命令。这种确定性是手工部署二进制永远达不到的。2.3 Linux不是运行平台而是能力放大器Gatus本身不调用Linux特有系统调用但它深度受益于Linux生态。举几个真实案例信号处理优雅退出当执行docker stop gatus时Docker向容器内主进程发送SIGTERM。Gatus捕获该信号后会等待当前所有探测周期完成再关闭HTTP服务——确保最后一刻的健康状态被记录。这依赖Linux信号机制Windows容器无法保证同等可靠性。文件描述符复用Gatus默认启用HTTP Keep-Alive单个TCP连接可复用数百次请求。在Linux上它通过setsockopt(SO_REUSEPORT)优化端口复用避免TIME_WAIT堆积。我们曾观测到在高频率探测100ms间隔下Linux宿主机的netstat -an | grep :443 | wc -l稳定在200连接而Windows WSL2环境会飙升到2000并触发连接拒绝。日志与systemd集成虽然Gatus自带日志输出但我们更倾向用journalctl -u docker-gatus查看日志。因为Docker服务在Linux上由systemd托管journald自动关联容器日志与宿主机上下文如OOM killer事件、磁盘满警告。某次客户服务器磁盘爆满journalctl里一条gatus failed to write config: no space left on device日志比监控告警早17分钟暴露问题。所以当你看到热搜词里“linux常用命令大全”“linux杀毒软件”时请明白Gatus不需要你精通iptables或ebpf但它要求你理解ps aux | grep gatus、docker logs -f gatus、tail -f /var/log/syslog | grep gatus这些基础命令如何协同工作。这才是Linux赋予Gatus的真正力量——不是命令本身而是命令背后形成的可观测性闭环。3. 实操详解从零构建一个可落地的网站监控体系3.1 环境准备三步确认Linux/Docker就绪别跳过这一步。我们见过太多故障源于基础环境偏差。按顺序执行以下检查第一步验证Linux内核与Docker兼容性Gatus对内核版本无特殊要求2.6.32即可但Docker依赖cgroups v1/v2。在较新发行版Ubuntu 22.04/CentOS 8上先确认cgroups状态# 查看cgroups版本v1或v2 cat /proc/1/cgroup | head -1 # 若输出类似0::/system.slice/docker.service说明是cgroups v1 # 若输出0::/docker/且包含unified字样则为cgroups v2cgroups v2需额外配置。若为v2编辑/etc/default/grub在GRUB_CMDLINE_LINUX行末添加systemd.unified_cgroup_hierarchy0然后sudo update-grub sudo reboot。这是Docker官方推荐的兼容方案避免后续容器启动失败。第二步Docker安装验证避开常见坑热搜词里“docker desktop failed to start because virtualisation support wasn’t detected”暴露了Windows用户痛点但Linux上更常见的是权限问题。执行# 检查Docker守护进程状态 sudo systemctl status docker # 验证普通用户能否执行docker命令避免总加sudo sudo usermod -aG docker $USER newgrp docker # 切换组无需重启 docker run hello-world # 必须看到Hello from Docker!才算成功注意newgrp docker命令在某些shell如zsh中可能不生效此时需重新登录终端或执行exec su -l $USER。这是新手最容易卡住的环节——他们以为usermod执行完就立即生效实际需要会话重载。第三步Gatus镜像拉取与基础启动不要用:latest标签Gatus版本迭代快:latest可能引入不兼容变更。查最新稳定版截至2024年v2.8.0是主流# 拉取指定版本镜像国内用户建议加阿里云镜像加速 docker pull registry.cn-hangzhou.aliyuncs.com/gatusio/gatus:v2.8.0 # 创建配置目录并生成最小config.yaml mkdir -p ~/gatus/config cat ~/gatus/config/config.yaml EOF web: port: 8080 endpoints: - name: 示例服务 url: https://httpbin.org/get interval: 60s conditions: - [STATUS] 200 EOF # 启动容器-d后台运行--restartalways确保开机自启 docker run -d \ --name gatus \ --restartalways \ -p 8080:8080 \ -v ~/gatus/config:/config \ registry.cn-hangzhou.aliyuncs.com/gatusio/gatus:v2.8.0启动后浏览器访问http://你的服务器IP:8080应该看到绿色状态条和“示例服务”卡片。如果页面空白执行docker logs gatus查看错误——90%的情况是config.yaml路径挂载错误或语法错误。注意-v ~/gatus/config:/config中的/config是容器内固定路径不能改成/etc/gatus或其他。这是Gatus硬编码的配置加载路径文档里没明说但源码cmd/gatus/main.go第42行明确写了flag.String(config, /config/config.yaml, Path to the configuration file)。3.2 config.yaml深度解析超越基础HTTP探测的12种实战技巧Gatus的config.yaml表面简单实则暗藏玄机。下面拆解真实项目中高频使用的配置模式技巧1多层级分组与状态聚合单个endpoint只能代表一个URL但业务服务往往由多个组件构成。用group实现逻辑聚合groups: - name: 支付网关 endpoints: - name: 支付下单 url: https://pay.example.com/api/v1/order - name: 支付回调 url: https://pay.example.com/api/v1/callback - name: 余额查询 url: https://pay.example.com/api/v1/balanceGatus会为整个组计算“健康分”组内所有endpoint状态为green才显示green任一red则组状态为red。这比单独监控每个URL更有业务意义——即使余额查询慢只要下单和回调正常支付主链路仍算可用。技巧2动态URL与环境变量注入避免为不同环境维护多份config.yaml。利用Gatus的环境变量替换endpoints: - name: 用户中心API url: ${USER_API_URL}/v1/profile interval: 30s conditions: - [STATUS] 200启动时传入环境变量docker run -d \ -e USER_API_URLhttps://user-prod.example.com \ -v ~/gatus/config:/config \ gatusio/gatus:v2.8.0注意环境变量名必须大写且${VAR}语法只在url、method、body等字符串字段生效interval等数值字段不支持。技巧3POST请求与JSON Payload构造监控登录接口不能只GET需模拟真实请求体- name: 用户登录 url: https://api.example.com/v1/auth/login method: POST headers: Content-Type: application/json body: | { username: test_user, password: test_pass } conditions: - [STATUS] 200 - [BODY].token ! null - [BODY].expires_in 3600body: |表示YAML块字面量保留换行和缩进。Gatus会自动设置Content-Length头无需手动计算。技巧4响应时间分段告警单纯“1500ms”不够精细。用latency条件实现阶梯告警conditions: - [LATENCY] 500 # 绿色毫秒级响应 - [LATENCY] 500 [LATENCY] 1200 # 黄色可接受但需关注 - [LATENCY] 1200 # 红色性能瓶颈Gatus会在UI上用不同颜色区块显示各区间占比比单一阈值更直观。技巧5自定义脚本探测突破HTTP局限当需要验证数据库连通性、Redis键存在性、甚至SSH登录时用script类型- name: MySQL主库连通性 type: script command: mysql -h db-master -u healthcheck -ppass123 -e SELECT 1 | grep -q 1 interval: 60s conditions: - [EXIT_CODE] 0注意脚本必须在容器内可执行。若用mysql命令需自定义镜像安装MySQL客户端或改用curl调用数据库代理API。技巧6TLS证书过期预警Gatus内置SSL证书检查- name: 主站HTTPS证书 url: https://example.com conditions: - [CERTIFICATE_EXPIRATION] 7d # 距离过期大于7天 - [CERTIFICATE_EXPIRATION] 30d # 距离过期小于30天黄色预警[CERTIFICATE_EXPIRATION]返回剩余天数单位为天。这对Lets Encrypt自动续签场景特别有用——提前15天告警留足人工介入时间。技巧7响应体结构变更检测API字段增减常引发前端崩溃。用JSON Schema校验- name: 商品列表接口 url: https://api.example.com/v1/products conditions: - [BODY].items[0].id ! null - [BODY].items[0].price 0 - [LENGTH([BODY].items)] 0[LENGTH(...)]获取数组长度[BODY].items[0]访问首元素。这比写正则更安全且支持嵌套路径。技巧8失败重试与降级策略网络抖动不应立即触发告警。配置max-failures和failures-before-alert- name: 第三方天气API url: https://weather-api.com/forecast interval: 120s max-failures: 3 # 连续失败3次才标记red failures-before-alert: 1 # 第1次失败就发告警因无降级方案技巧9HTTP Basic Auth与Bearer Token带认证的API- name: 管理后台API url: https://admin.example.com/api/status headers: Authorization: Bearer ${ADMIN_TOKEN}Token从环境变量注入避免硬编码。技巧10自定义HTTP状态码映射某些服务用401表示“未登录”但业务上这是正常状态。用status-codes覆盖- name: OAuth授权端点 url: https://auth.example.com/oauth/authorize status-codes: - 200 - 302 - 401 # 将401视为healthy技巧11响应体内容模糊匹配验证HTML页面是否包含特定文本- name: 官网首页 url: https://example.com conditions: - [BODY] ~ \欢迎来到.*官网\~是正则匹配操作符支持Perl兼容语法。技巧12条件组合与逻辑运算复杂业务规则- name: 订单创建成功率 url: https://api.example.com/v1/orders method: POST body: {product_id:test} conditions: - [STATUS] 201 || [STATUS] 200 # 接受200或201 - [BODY].order_id ! null || [BODY].error_code RATE_LIMIT # 允许限流错误3.3 告警集成不止邮件更要打通研发工作流Gatus原生支持Webhook、Email、Slack、Discord、Telegram。但真正提升效率的是与研发工具链的深度集成Slack告警模板定制默认Slack消息太简陋。在config.yaml中定义slacknotifications: slack: webhook-url: https://hooks.slack.com/services/XXX/YYY/ZZZ channel: #alerts username: Gatus Monitor icon-emoji: :rotating_light: template: | *{{ .Endpoint.Name }}* is {{ .Status }} ({{ .Duration }}) URL: {{ .Endpoint.URL }} Last error: {{ .LastError }} Details: {{ .Details }} Dashboard: http://gatus.example.com{{ .Endpoint.Name }}等是Go模板语法.Status值为healthy/unhealthy/degraded。这样一条消息包含所有关键信息开发者无需跳转就能判断问题范围。企业微信机器人集成国内刚需Gatus不原生支持企微但Webhook可适配。创建企微机器人后配置notifications: webhook: url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyYOUR_KEY method: POST headers: Content-Type: application/json body: | { msgtype: text, text: { content: 【Gatus告警】{{ .Endpoint.Name }} {{ .Status }}\nURL: {{ .Endpoint.URL }}\n错误: {{ .LastError }}\n详情: {{ .Details }} } }注意企微Webhook要求Content-Type: application/json且body必须是JSON格式不能是纯文本。与Jira Service Management联动当告警持续超过5分钟自动创建Jira工单- name: 支付服务异常 url: https://pay.example.com/health interval: 30s conditions: - [STATUS] 200 notifications: - type: webhook url: https://your-jira-domain.atlassian.net/rest/servicedeskapi/request method: POST headers: Authorization: Basic YOUR_BASE64_CREDENTIALS Content-Type: application/json body: | { serviceDeskId: 1, requestTypeId: 2, requestFieldValues: { summary: Gatus告警{{ .Endpoint.Name }} {{ .Status }}, description: URL: {{ .Endpoint.URL }}\nLast error: {{ .LastError }} } }这需要Jira管理员预先配置Service Desk和Request Type ID。静默期与值班轮转避免半夜打扰。用schedule配置notifications: email: to: opsexample.com schedule: - cron: 0 9-18 * * 1-5 # 工作日9-18点发邮件 - cron: 0 0-8,19-23 * * * # 其他时间只发企业微信Gatus支持标准cron语法0 0-8,19-23 * * *表示每天0点到8点、19点到23点。4. 故障排查与避坑指南那些文档不会写的血泪经验4.1 配置加载失败的5种真相Gatus启动失败时docker logs gatus常显示failed to load configuration。别急着重写yaml按优先级排查1. 缩进空格 vs TabYAML严格要求缩进用空格禁用Tab。用cat -A config.yaml查看隐藏字符# 正确缩进显示为· - name: test$ ··url: http://example.com$ # 错误缩进显示为^I即Tab - name: test$ ^Iurl: http://example.com$ # 此处会报错解决方案在VS Code中开启“显示空白字符”或用sed -i s/\t/ /g config.yaml批量替换Tab为空格。2. 中文标点混入复制粘贴时中文逗号、冒号、引号会破坏语法。用iconv -f utf8 -t ascii//translit config.yaml检测非ASCII字符或直接用vim config.yaml执行:set list显示所有字符。3. 条件表达式语法错误[BODY].data.token ! null看似正确但若响应体是{data:null}[BODY].data.token会报错“field not found”。应改为[BODY].data ! null [BODY].data.token ! null。Gatus条件引擎不支持短路求值必须显式判断父字段存在。4. 网络策略阻断容器内无法访问目标URL。先进入容器调试docker exec -it gatus sh # 安装curlAlpine镜像需apk add curl apk add curl curl -v https://target-service.com # 观察DNS解析、TLS握手、HTTP状态常见原因容器网络模式错误应为bridge而非host、DNS配置错误/etc/resolv.conf被覆盖、防火墙拦截iptables -L -t nat检查DNAT规则。5. 文件挂载权限问题Linux上Docker容器以非root用户运行UID 1001若config.yaml属主是root容器内无法读取。执行sudo chown 1001:1001 ~/gatus/config/config.yaml # 或更安全用docker run的--user参数指定用户 docker run -u 1001:1001 -v ~/gatus/config:/config gatusio/gatus4.2 UI访问异常的3个隐形杀手页面打不开或显示空白90%不是Gatus问题而是基础设施配置杀手1反向代理配置遗漏WebSocket若用Nginx代理Gatusproxy_pass http://localhost:8080必须启用WebSocket支持location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; }缺少Upgrade和Connection头会导致UI实时状态更新失效页面卡在加载中。杀手2SELinux强制访问控制CentOS/RHEL默认启用SELinux挂载的config.yaml可能被拒绝访问。临时关闭验证sudo setenforce 0 # 0permissive, 1enforcing docker restart gatus若恢复正常则需永久放行sudo semanage fcontext -a -t container_file_t /home/youruser/gatus/config(/.*)? sudo restorecon -R /home/youruser/gatus/config杀手3浏览器缓存污染Gatus UI资源JS/CSS有强缓存。修改配置后前端可能仍加载旧版本。强制刷新CtrlF5Windows或CmdShiftRMac或在开发者工具Network面板勾选“Disable cache”。4.3 性能瓶颈的2个反直觉根源Gatus资源占用低但大规模部署时仍可能卡顿根源1DNS解析阻塞Gatus默认使用宿主机DNS。若DNS服务器响应慢2s每个探测都会阻塞。解决方案在Docker启动时指定DNSdocker run --dns 114.114.114.114 --dns 8.8.8.8 \ -v ~/gatus/config:/config gatusio/gatus或在config.yaml中为endpoint配置dns字段- name: API服务 url: https://api.example.com dns: 114.114.114.114根源2TLS握手耗时过高大量HTTPS探测时TLS握手成为瓶颈。启用TLS会话复用web: port: 8080 tls: enabled: true cert-file: /config/tls.crt key-file: /config/tls.key # 启用session ticket减少握手开销 session-ticket: true同时确保config.yaml中所有HTTPS endpoint的url域名与TLS证书域名一致避免SNI不匹配导致握手失败。4.4 安全加固的4个必要动作Gatus默认配置存在安全风险生产环境必须调整动作1禁用默认Web UI暴露Gatus UI默认监听0.0.0.0:8080应限制为内网IPweb: port: 8080 address: 127.0.0.1 # 只监听localhost然后用Nginx反向代理并配置Basic Authlocation / { auth_basic Gatus Admin; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8080; }动作2配置读取权限最小化挂载config.yaml时避免挂载整个目录# 错误挂载整个config目录可能泄露其他文件 -v ~/gatus/config:/config # 正确只挂载必要文件 -v ~/gatus/config/config.yaml:/config/config.yaml动作3禁用危险条件表达式Gatus条件引擎理论上可执行任意Go代码但官方禁止[EXEC]等危险操作。确保不使用未文档化的表达式定期审查config.yaml中所有[...]字段。动作4升级策略自动化Gatus版本更新频繁手动升级易遗漏。用Watchtower自动更新docker run -d \ --name watchtower \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --interval 300 \ --label-enable \ --cleanup然后在Gatus容器启动时加labeldocker run -d \ --labelcom.centurylinklabs.watchtower.enabletrue \ --name gatus \ -v ~/gatus/config:/config \ gatusio/gatus:v2.8.0Watchtower每5分钟检查镜像更新自动重启容器。5. 进阶实践让Gatus从监控工具进化为质量门禁5.1 CI/CD流水线中的健康验证Gatus不只是线上监控更是部署前的质量卡点。在GitLab CI中加入健康检查stages: - deploy - verify verify-health: stage: verify image: curlimages/curl:latest before_script: - apk add jq script: - | # 等待新服务启动最多60秒 timeout 60 sh -c while ! curl -sf http://new-service:8080/health; do sleep 2; done # 调用Gatus API获取健康状态 HEALTH$(curl -s http://gatus:8080/api/v1/endpoints/new-service | jq -r .status) if [ $HEALTH ! healthy ]; then echo Health check failed: $HEALTH exit 1 fi after_script: - curl -X POST http://gatus:8080/api/v1/endpoints/new-service/trigger # 手动触发探测这确保新版本上线后必须通过Gatus的端到端健康验证才能进入下一阶段。比单纯检查进程是否存在更可靠。5.2 多区域冗余监控架构单点Gatus实例存在单点故障。构建跨区域探测网络graph LR A[北京Gatus] --|上报| C[中央Dashboard] B[上海Gatus] --|上报| C C -- D[企业微信告警] C -- E[数据可视化]每个区域部署独立Gatus实例配置webhook通知中央服务notifications: webhook: url: https://central-monitor.example.com/api/report method: POST body: | { region: beijing, endpoint: {{ .Endpoint.Name }}, status: {{ .Status }}, duration: {{ .Duration }} }中央服务聚合所有区域数据生成全局健康视图。这样即使北京机房断网上海Gatus仍能独立告警且中央服务可识别区域性故障。5.3 与OpenTelemetry生态融合Gatus不采集指标但可作为OpenTelemetry Collector的健康信号源。配置OTel Collector接收Gatus Webhookreceivers: webhook: endpoint: /v1/webhook/gatus exporters: prometheus: endpoint: 0.0.0.0:9090 service: pipelines: metrics: receivers: [webhook] exporters: [prometheus]Gatus发送的Webhook JSON被OTel Collector转换为Prometheus指标如gatus_endpoint_status{regionbeijing,endpointlogin} 0。这样Gatus的布尔型健康状态就融入了团队已有的指标监控体系。5.4 自定义指标导出器开发Gatus原生不支持Prometheus Exporter但可通过其API实现。写一个Python脚本定时拉取import requests import time from prometheus_client import Gauge, start_http_server # 定义指标 gatus_health Gauge(gatus_endpoint_health, Health status of endpoint, [name, url]) gatus_latency Gauge(gatus_endpoint_latency_ms, Latency in milliseconds, [name]) def fetch_gatus_metrics(): try: resp requests.get(http://gatus:8080/api/v1/endpoints) data resp.json() for ep in data[endpoints]: gatus_health.labels(nameep[name], urlep[url]).set(1 if ep[status] healthy else 0) gatus_latency.labels(nameep[name]).set(ep[duration]) except Exception as e: print(fFailed to fetch metrics: {e}) if __name__ __main__: start_http_server(8000) # Prometheus exporter端口 while True: fetch_gatus_metrics() time.sleep(30) # 每30秒同步一次
返回列表