OneUptime 外部状态页监控(External Status Page Monitor)实战指南:自动追踪 AWS、GitHub、OpenAI 等第三方服务健康
OneUptime 外部状态页监控External Status Page Monitor实战指南自动追踪 AWS、GitHub、OpenAI 等第三方服务健康【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime本篇技术指南以 OneUptime 开源监控平台中的「外部状态页监控External Status Page Monitor」功能为核心完整讲解其工作原理、支持的状态页提供者类型、自动检测逻辑、创建步骤、配置项、监控指标与告警模板变量。读完本文你将掌握如何把 AWS、GCP、Azure、GitHub、OpenAI、Anthropic 等上游服务的官方状态页纳入 OneUptime 监控体系在第三方服务发生故障或性能降级时第一时间收到告警并将上游事故与自身事故进行关联分析。概述为什么需要监控外部状态页外部状态页监控的核心思想是通过周期性查询第三方服务的公开状态页来度量你所依赖的上游服务的健康程度。与直接探测服务端点不同状态页监控获取的是服务方自己对外公布的运行状态、组件健康度与事故信息能够提供更全面、更具权威性的视角。在 OneUptime 中使用外部状态页监控可以监控你的应用所依赖的第三方服务如云厂商、SaaS、API 提供方的可达性当上游提供方发生中断时及时获得告警而不是等用户反馈才发现问题跟踪单个组件的状态例如「AWS EC2 us-east-1」将监控范围收窄到某个组件分组例如 OpenAI 的「APIs」避免页面上其他无关事故干扰你的监控判断在性能降级degraded performance尚未影响到你的用户之前就提前察觉将你自己的事故与上游提供方的问题进行关联加速根因定位。从源码结构看这一功能贯穿 OneUptime 的「探测端Probe执行采集、服务端Server评估判定、告警模板渲染」三层体系下文将逐层展开。支持的提供者Provider类型OneUptime 支持通过以下方式监控外部状态页对应的枚举定义位于 ExternalStatusPageProviderType.ts提供者类型说明Auto默认自动检测状态页的格式模板Atlassian Statuspage由 Atlassian Statuspage 驱动的状态页JSON 类型 APIincident.io由 incident.io 驱动的状态页例如https://status.openai.comRSS提供 RSS 订阅源的状态页Atom提供 Atom 订阅源的状态页枚举源码中五种取值与文档完全对应AtlassianStatuspage Atlassian Statuspage、IncidentIo incident.io、RSS RSS、Atom Atom、Auto Auto。自动检测Auto的完整流程当提供者类型设置为Auto时OneUptime 会按照以下顺序自动识别状态页模板该逻辑实现于 Probe/Utils/Monitors/MonitorTypes/ExternalStatusPageMonitor.ts 的fetch()方法首先尝试 incident.io 的状态页 API访问/proxy/host端点例如对https://status.openai.com会请求https://status.openai.com/proxy/status.openai.com然后尝试 Atlassian Statuspage 的 JSON API依次访问/api/v2/status.json、/api/v2/components.json和/api/v2/incidents/unresolved.json如果以上都失败尝试将页面解析为 RSS 或 Atom 订阅源作为最后兜底执行一次基础的 HTTP 可达性检查4xx/5xx 会返回离线结果而非抛出异常。注意为什么 incident.io 必须先于 Atlassian 检测一些 incident.io 状态页如https://status.openai.com同时暴露了与 Atlassian 兼容的/api/v2/status.json端点但该兼容端点不提供组件分组和未解决事故数据。如果先做 Atlassian 检测会误判成功但拿到降级的数据而真正的 Atlassian 状态页会对 incident.io 的代理端点返回 404从而自然落入 Atlassian 分支。因此源码中强制先探测 incident.io确保拿到更丰富、具备分组感知的数据。这一顺序在源码注释中也有明确说明。创建外部状态页监控在 OneUptime 仪表盘中创建外部状态页监控的操作步骤如下在 OneUptime 仪表盘中进入Monitors监控器点击Create Monitor创建监控器选择监控器类型为External Status Page外部状态页输入要监控的状态页地址可选指定具体的提供者类型或保持Auto自动检测可选输入组件分组Component Group将监控范围限制到某个分组如「APIs」可选输入组件名称Component Name进一步过滤到单个组件若已设置分组则在分组内过滤按需配置监控指标Criteria。创建后配置会被持久化为MonitorStepExternalStatusPageMonitor结构。其序列化/反序列化逻辑定义于 MonitorStepExternalStatusPageMonitor.ts字段包括statusPageUrl、provider、componentGroupName、componentName、timeout、retries。配置选项详解状态页地址Status Page URL输入要监控的外部状态页地址。对于 Atlassian Statuspage 和 incident.io 驱动的站点通常填写根地址例如https://status.example.com对于 RSS/Atom 订阅源则直接填写订阅源的 URL。提供者类型Provider Type选择状态页的提供者类型。推荐使用Auto默认值让 OneUptime 自动识别模板如果你明确知道页面类型也可以手动指定Atlassian Statuspage、incident.io、RSS或Atom以跳过自动检测环节。组件分组过滤Component Group Filter如果状态页将组件组织为分组可以将监控器限制到某一个分组。例如在https://status.openai.com中输入APIs即可将监控范围限定为 OpenAI 的 API 服务。关键行为见源码buildScopedResponse()当设置了组件分组时「活跃事故数active incident count」和「整体状态overall status」只依据该分组内的组件计算——影响其他无关分组例如 ChatGPT的事故不会触发被限制到「APIs」分组的监控器。组件分组过滤仅对Atlassian Statuspage和incident.io提供者生效RSS/Atom 订阅源不暴露组件分组结构。组件名称过滤Component Name Filter如果状态页报告多个组件可以指定具体的组件名称以只监控该组件。例如只想监控 AWS us-east-1 区域的 EC2就输入EC2 us-east-1组件名称必须与状态页上显示的名称精确一致匹配为不区分大小写的子串匹配见源码matchesFilter()。当同时设置了组件分组时组件名称过滤会在分组内部应用从而精确定位一个较大分组中的单个组件。当两个过滤条件都未设置时所有范围内的组件都会被监控。高级选项超时Timeout等待状态页返回响应的最大时间毫秒默认值为10000 毫秒10 秒。该默认值在MonitorStepExternalStatusPageMonitorUtil.getDefault()中定义若检测到超时探测结果将标记isTimeout: truefailureCause会注明「请求尝试了 N 次后超时」。重试Retries首次尝试失败后重新发送请求的次数0 表示只尝试 1 次。默认值为3 次重试即最多共 4 次尝试探测端在每次重试之间会Sleep.sleep(1000)暂停 1 秒。需要特别说明的是源码中retries为 0 是合法值序列化时会被完整保留不会被默认值覆盖见MonitorStepExternalStatusPageMonitorUtil.fromJSON()中针对 retries 的专门处理。监控指标Criteria你可以配置监控指标来决定外部服务何时被视为「运行中Operational」或「宕机Down」。指标基于以下维度对应 CriteriaFilter.ts 中CheckOn枚举前缀均为ExternalStatusPage*Is Online是否在线—— 状态页是否可达并返回状态数据Overall Status整体状态—— 状态页的整体状态指示值例如operational、degraded_performance、partial_outage、major_outageComponent Status组件状态—— 范围内组件的状态遵循组件分组/组件名称过滤Active Incidents活跃事故数—— 状态页上当前活跃的事故数量设置过滤条件时仅统计分组/组件范围内的事故Response Time响应时间—— 获取状态页数据所花费的时长毫秒。指标的实际判定逻辑位于 ExternalStatusPageMonitorCriteria.ts它会根据checkOn字段分发到不同的比较器布尔比较在线状态、数字比较响应时间、活跃事故数、字符串比较整体状态、组件状态。其中组件状态判定会遍历componentStatuses数组任意一个组件命中阈值即视为条件满足并返回带组件名的详细结果。默认指标默认情况下OneUptime 依据对状态页真正重要的信号——活跃事故数与组件健康度——来判定而不仅仅是页面可达性当范围内没有活跃事故时监控器标记为Operational运行中当范围内至少存在一个活跃事故或范围内某个组件报告degraded_performance、partial_outage、major_outage或full_outage时监控器标记为Down宕机并创建一条事故Incident。由于活跃事故数与组件状态均遵循组件分组/组件名称过滤这些默认指标会自动只关注对你重要的组件。源码中还定义了状态严重程度排名getStatusRank()operational0、under_maintenance/maintenance1、degraded_performance/degraded2、partial_outage3、major_outage/full_outage/critical4整体状态取范围内最差组件的状态若所有组件均正常但范围内存在活跃事故则整体状态推导为degraded_performance。热门状态页地址速查以下为精选的、可直接用于监控的热门服务状态页地址服务状态页地址AWShttps://health.aws.amazon.com/health/statusGoogle Cloud Platformhttps://status.cloud.google.comMicrosoft Azurehttps://status.azure.comGitHubhttps://www.githubstatus.comOpenAIhttps://status.openai.comAnthropichttps://status.anthropic.comCloudflarehttps://www.cloudflarestatus.comDatadoghttps://status.datadoghq.comPagerDutyhttps://status.pagerduty.comTwiliohttps://status.twilio.comStripehttps://status.stripe.comSlackhttps://status.slack.comAtlassian (Jira、Confluence)https://status.atlassian.comVercelhttps://www.vercel-status.comNetlifyhttps://www.netlifystatus.comDigitalOceanhttps://status.digitalocean.comHerokuhttps://status.heroku.comMongoDB Atlashttps://status.cloud.mongodb.comFastlyhttps://status.fastly.comNew Relichttps://status.newrelic.comSentryhttps://status.sentry.ioCircleCIhttps://status.circleci.com提示上表中的大多数服务使用的是 Atlassian Statuspage 或 incident.io因此保持提供者类型为Auto即可被自动识别无需手动指定。事故与告警模板变量当由外部状态页监控器创建事故或发送告警时可以在模板中使用以下变量对应 MonitorTemplateUtil.ts 中ExternalStatusPage分支的模板数据组装逻辑变量说明{{isOnline}}状态页是否在线true/false{{responseTimeInMs}}响应时间毫秒{{failureCause}}失败原因如有{{overallStatus}}整体状态指示值{{activeIncidentCount}}活跃事故数设置了过滤条件时限定在过滤范围内{{componentStatuses}}组件状态的 JSON 数组每项包含name、status、description、groupName字段{{provider}}检测到的提供者类型Atlassian Statuspage、incident.io、RSS、Atom{{componentGroup}}监控器被限定到的组件分组如有{{componentName}}监控器被限定到的组件名称如有这些变量的数据结构与探测端返回的 ExternalStatusPageMonitorResponse.ts 一一对应isOnline、overallStatus、componentStatuses含name/status/description/groupName、activeIncidentCount、responseTimeInMs、failureCause、provider、componentGroupName、componentName以及rawBody、isTimeout、probeAttempts、totalAttempts等补充字段。其中probeAttempts记录了每次尝试的探测时间、响应时间与失败原因可用于排障。探测端实现细节与可靠性设计外部状态页的采集由 OneUptime 的 Probe探测端执行核心实现位于 Probe/Utils/Monitors/MonitorTypes/ExternalStatusPageMonitor.ts。除文档所述功能外源码中还体现了以下工程细节结构化解析Atlassian 分支会先拉取/api/v2/status.json获取页面级状态再拉取/api/v2/components.json解析组件及分组归属通过group_id关联分组名最后拉取/api/v2/incidents/unresolved.json获取未解决事故及其影响组件列表incident.io 分支则通过/proxy/host端点获取summary、structure、ongoing_incidents等结构化数据。安全防护fail-closed针对 XML 订阅源设定了严格的解析上限——响应体最大 512KB、最多 5000 个元素、最大深度 64 层防止攻击者构造的深层 XML 拖垮共享的探测进程同时探测请求经过 egress guard出口守卫约束禁止访问非预期目标。SSRF 与可达性校验当探测失败时若失败原因指向网络层如 DNS 解析失败、地址策略拒绝探测端会先调用OnlineCheck.canProbeMonitorWebsiteMonitors()确认探测端自身是否在线避免因探测端自身网络故障而把所有状态页误报为宕机而结构化数据非法如配置错误则直接 fail-closed。重试与超时模型每次尝试共享同一个执行上下文deadline 与响应体预算重试会创建新的尝试并释放旧上下文超时错误会被专门识别并标记isTimeout。相关行为有专门的测试覆盖如 ExternalStatusPageMonitorTimeout.test.ts 与 ExternalStatusPageMonitor.ssrf.test.ts。监控指标评估采集结果回传后由服务端的ExternalStatusPageMonitorCriteria结合「随时间评估EvaluateOverTime」机制进行判定支持基于历史样本的窗口型指标例如最近 N 分钟内的所有采样值并处理监控器刚启动、样本不足以覆盖窗口的边界情况。最佳实践默认使用 Auto 提供者类型——除非你明确知道状态页的模板格式自动检测对绝大多数状态页都能正确工作。只依赖部分提供方时收窄到组件分组——例如只关心 OpenAI 的「APIs」就限制到该分组避免无关事故产生噪音告警。监控具体组件——如果只依赖特定服务例如某个具体的 AWS 区域使用组件名称过滤精准监控。建立事故关联——当你的监控器发现问题且上游状态页也显示问题时关联分析能显著加快根因定位。与其他监控器组合使用——将外部状态页监控器与你自己部署的 API/网站监控器搭配可以获得上游依赖 自身服务的完整可观测视角自身监控负责发现症状外部状态页监控负责解释根因。通过本文的配置步骤与源码级原理说明你可以立即在 OneUptime 中把常用的第三方服务状态页纳入监控并借助组件分组过滤、默认指标与告警模板变量构建一套低噪音、高可解释性的上游依赖监控方案。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考