ARTICLE DETAIL

资讯详情

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

OneUptime 公开状态页 API 全解:overview、uptime、incidents、维护与公告五大端点的调用方法与源码实现

OneUptime 公开状态页 API 全解:overview、uptime、incidents、维护与公告五大端点的调用方法与源码实现 OneUptime 公开状态页 API 全解overview、uptime、incidents、维护与公告五大端点的调用方法与源码实现【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime本文以 OneUptime 官方文档 Offentlig statussides API丹麦语英文对应版位于 App/FeatureSet/Docs/Content/en/status-pages/public-api.md为主体系统讲解 OneUptime 状态页Status Page对外暴露的公开状态页 API如何通过https://oneuptime.com/status-page-api/*获取某个状态页的总览快照、资源可用性uptime、事件Incidents、计划内维护Scheduled Maintenance与公告Announcements。读完后你可以直接使用 curl 拉取任意公开状态页的机器可读数据并能结合 Common/Server/API/StatusPageAPI.ts 的源码理解鉴权、域名解析、缓存与响应字段的生产机制。一、API 总体设计路由、域名解析与访问控制公开状态页 API 统一挂在/status-page-api前缀下。从源码结构看这个前缀由 Common/ServiceRoute.ts 中的StatusPageApiRoutenew Route(/status-page-api)定义前端侧的 App/FeatureSet/Frontend/RouteReservations.ts 也保留了该路径。所有端点共享一个核心机制URL 参数既可以是 statusPageId也可以是状态页绑定的自定义域名。在 Common/Server/API/StatusPageAPI.ts 中可以看到统一的解析器resolveStatusPageIdOrThrow它委托StatusPageService.resolveStatusPageIdOrNull完成“自定义域名 → statusPageId”的解析带 TTL 缓存每个域名每个缓存周期只查一次数据库解析失败则抛出NotFoundException(Status Page not found)。请求进入后端服务前的最后一环是 Nginx 层的路由重写。在 Nginx/default.conf.template 中location /status-page-api/ { ... rewrite ^/status-page-api/(.*)$ /api/status-page/$1 break; }即外部的/status-page-api/xxx被重写为内部服务路径/api/status-page/xxx并保留原始 Host 头见 Nginx/Tests/NginxConfig.test.js 中“/status-page-api/ must replace the upstream Host with nginxs $host”的断言。这正是自定义域名可以直接调用 API 的原因。此外源码注释还说明了一个重要细节列表类响应overview、incidents、announcements 等在 GET 变体上会显式设置No-Cache 响应头Response.setNoCacheHeaders(res)因为这些接口可能承载私有页面的数据不能进入共享缓存。端点速查表功能文档路径文档原文写法源码注册路径方法总览/status-page-api/overview/:statusPageId/api/status-page/overview/:statusPageIdOrDomainPOST / GET可用性/status-page-api/uptime/:statusPageId/api/status-page/uptime/:statusPageIdPOST事件/status-page-api/incidents/:statusPageId/api/status-page/incidents/:statusPageIdOrDomainPOST / GET计划内维护/status-page-api/scheduled-maintenance/:statusPageId/api/status-page/scheduled-maintenance-events/:statusPageIdOrDomainPOST / GET公告/status-page-api/announcements/:statusPageId/api/status-page/announcements/:statusPageIdOrDomainPOST / GET注意一处源码与文档的出入计划内维护列表端点在源码中注册的路径是scheduled-maintenance-eventsStatusPageAPI.ts而文档中写的是scheduled-maintenance以源码注册路径为准。二、总览 APIOverview该 API 一次返回状态页上所有资源的整体状态包含各资源与资源组的当前状态、活动事件、计划内维护、公告、状态时间线等完整快照。调用方式curl -X POST https://oneuptime.com/status-page-api/overview/:statusPageId从源码实现看StatusPageAPI.ts有几个值得注意的设计POST 与 GET 双方法、同一处理器。源码注释明确写道POST 供状态页前端 SPA 使用GET 则面向“爬虫 / AI Agent 的机器可读访问”两者共用同一套鉴权与授权路径避免行为漂移。因此用curl -X GET同样可以访问。短 TTL 快照缓存 单飞single-flight合并。overview 响应体与用户无关鉴权是每次请求的二进制闸门发生在读缓存之前所以后端用InMemoryTTLCacheOVERVIEW_CACHE_TTL_MS 15_000即 15 秒按解析后的 statusPageId 缓存响应并额外维护一个overviewResponseInFlightMap让并发冷缓存请求共享同一次构建避免同时冲击数据库。失败的构建结果不会被缓存。鉴权先于缓存。checkHasReadAccess必须先于任何缓存读取执行以保证私有页面、IP 白名单、主密码等控制对每次请求都生效。该 handler 不读取req.body因此 GET/POST 行为完全一致。响应字段说明完整继承自官方文档文档给出的响应结构如下JSON 注释保留原文语义{ overallStatus: { // Monitor Status-对象 // 整体状态 本页所有监控项与分组中最差的状态。 // 参见 https://oneuptime.com/reference/monitor-status }, scheduledMaintenanceEventsPublicNotes: [ // ScheduledMaintenancePublicNote-对象数组 // https://oneuptime.com/reference/scheduled-maintenance-public-note ], statusPageHistoryChartBarColorRules: [ // StatusPageHistoryChartBarColorRule-对象数组 // https://oneuptime.com/reference/status-page-history-chart-bar-color-rule ], scheduledMaintenanceEvents: [ // ScheduledMaintenance-对象数组 // https://oneuptime.com/reference/scheduled-maintenance ], activeAnnouncements: [ // StatusPageAnnouncement-对象数组当前生效的公告 // https://oneuptime.com/reference/status-page-announcement ], incidentPublicNotes: [ // IncidentPublicNote-对象数组 // https://oneuptime.com/reference/incident-public-note ], activeIncidents: [ // Incident-对象数组进行中的事件 // https://oneuptime.com/reference/incident ], monitorStatusTimelines: [ // MonitorStatusTimeline-对象数组 // https://oneuptime.com/reference/monitor-status-timeline ], resourceGroups: [ // 资源组-对象数组 // https://oneuptime.com/reference/resource-group ], monitorStatuses: [ // MonitorStatus-对象数组 // https://oneuptime.com/reference/monitor-status ], statusPageResources: [ // StatusPageResource-对象数组本页挂载的资源 // https://oneuptime.com/reference/status-page-resource ], incidentStateTimelines: [ // IncidentStateTimeline-对象数组 // https://oneuptime.com/reference/incident-state-timeline ], statusPage: { // 状态页自身信息 // https://oneuptime.com/reference/status-page }, scheduledMaintenanceStateTimelines: [ // ScheduledMaintenanceStateTimeline-对象数组 // https://oneuptime.com/reference/scheduled-maintenance-state-timeline ], monitorGroupCurrentStatuses: { // 各监控组分组的当前状态。 }, monitorsInGroup: { // 各分组内的监控项。 } }各字段与源码中buildOverviewResponseStatusPageAPI.ts聚合的模型一一对应monitorStatuses/monitorStatusTimelines来自 MonitorStatus、MonitorStatusTimeline 服务事件类字段来自 Incident / IncidentPublicNote / IncidentStateTimeline 等模型见文件头部 StatusPageAPI.ts 的导入整体状态则由StatusPageService.getOverallMonitorStatus按“最坏状态优先”的规则计算与 badge 端点 中使用同一函数。三、可用性 APIUptime该 API 获取状态页上所有资源在指定时间范围内的可用率uptime percent。调用方式curl -X POST https://oneuptime.com/status-page-api/uptime/:statusPageId请求体可选可以在请求体中传入startDate与endDate{ startDate: 2021-09-01T00:00:00Z, endDate: 2021-09-30T23:59:59Z }文档规则与源码实现StatusPageAPI.ts逐条吻合不传日期时默认返回最近 14 天的可用率源码startDate OneUptimeDate.getSomeDaysAgo(14)endDate 当前时间起止日期相隔不得超过 90 天超出会抛出BadDataException“You can only get uptime for 90 days. Please select a date range within 90 days.”startDate晚于endDate会抛出 “Start date cannot be after end date”该端点注册了UserMiddleware.getUserMiddleware需要有效的用户会话/鉴权这是文档未明确写出的适用前提源码注释解释了一个口径细节该端点报告的是显式[startDate, endDate]区间内的可用性因此事件时间线会被裁剪到该区间、分母就是区间本身——否则一条未结束endsAt null且起始于区间之前的记录会把全部时长计入停机时间。示例响应{ statusPageResourceUptimes: [ { statusPageResourceId: { _type: ObjectID, value: cfffa3c3-fdf3-4cd7-9585-d6d408a14663 }, uptimePercent: 99.98, statusPageResourceName: StatusPageResourceName, currentStatus: { _id: cc80b385-4190-42a3-ae8b-9b391e90d79f, name: Operational, color: { _type: Color, value: #2ab57d }, isOperationalState: true, priority: 1 } } ], groupUptimes: [ { statusPageGroupId: { _type: ObjectID, value: df7632c4-c5c0-453c-88bf-9ee3d68d45f2 }, uptimePercent: 99.98, statusPageResourceUptimes: [ { statusPageResourceId: { _type: ObjectID, value: 8175534f-aa77-456c-ad5b-b8e7b85876aa }, uptimePercent: 99.98, statusPageResourceName: my-api, currentStatus: { _id: cc80b385-4190-42a3-ae8b-9b391e90d79f, name: Operational, color: { _type: Color, value: #2ab57d }, isOperationalState: true, priority: 1 } } ], statusPageGroupName: GroupName, currentStatus: { _id: cc80b385-4190-42a3-ae8b-9b391e90d79f, name: Operational, color: { _type: Color, value: #2ab57d }, isOperationalState: true, priority: 1 } } ], startDate: 2021-09-01T00:00:00Z, endDate: 2021-09-30T23:59:59Z }响应由两层构成statusPageResourceUptimes是页面级资源的可用率列表含currentStatus当前 MonitorStatus带颜色、优先级与isOperationalState标志groupUptimes是按状态页分组聚合的结果每个分组内嵌其资源列表与组级currentStatus。四、事件 APIIncidents获取状态页上发布的全部事件Incident。调用方式curl -X POST https://oneuptime.com/status-page-api/incidents/:statusPageId响应结构{ incidents: [ // Incident-对象数组 // 参见 https://oneuptime.com/reference/incident ] }源码中该列表端点同样为 POST/GET 双方法注册StatusPageAPI.ts且:statusPageIdOrDomain参数支持自定义域名。此外源码还注册了单条详情端点POST /api/status-page/incidents/:statusPageIdOrDomain/:incidentId可按 incidentId 拉取单条事件详情——这是文档未覆盖、但可直接使用的补充能力。五、计划内维护 APIScheduled Maintenance获取状态页上发布的计划内维护Scheduled Maintenance Events。调用方式curl -X POST https://oneuptime.com/status-page-api/scheduled-maintenance/:statusPageId响应结构{ scheduledMaintenanceEvents: [ // ScheduledMaintenance-对象数组 // 参见 https://oneuptime.com/reference/scheduled-maintenance ] }如前文速查表所述源码实际注册的列表路径为/scheduled-maintenance-events/:statusPageIdOrDomainStatusPageAPI.tsPOST/GET 均可对应的单条详情端点为POST .../scheduled-maintenance-events/:statusPageIdOrDomain/:scheduledMaintenanceId。六、公告 APIAnnouncements获取状态页上发布的全部公告Announcements。调用方式curl -X POST https://oneuptime.com/status-page-api/announcements/:statusPageId响应结构{ announcements: [ // StatusPageAnnouncement-对象数组 // 参见 https://oneuptime.com/reference/status-page-announcement ] }源码同样以 POST/GET 双方法注册StatusPageAPI.ts并提供POST .../announcements/:statusPageIdOrDomain/:announcementId单条详情端点。七、与周边文档的衔接原文档“Videre læsning延伸阅读”部分指向同一文档目录下的姊妹篇在仓库中的实际位置为与 public-api.md 同目录状态页 – 总览状态页是什么、各部分如何衔接状态页 – 资源与分组上文各端点返回的资源的定义状态页 – 品牌与域名这些端点所服务的自定义域名订阅者与通知公告端点所服务内容的订阅侧。八、小结与适用前提五个端点全部通过https://oneuptime.com/status-page-api/...访问URL 参数支持 statusPageId 或已绑定自定义域名除 uptime 端点外列表/总览类端点在源码中均提供 GET 变体可直接用于脚本、爬虫或 AI Agent 的机器可读集成uptime 端点需要鉴权UserMiddleware日期窗口最多 90 天缺省为最近 14 天overview 响应在服务端有 15 秒级 TTL 缓存读取到的数据最多滞后约 15 秒私有页面的访问控制主密码、IP 白名单等在缓存读取之前逐次执行各响应对象的字段级定义Monitor Status、Incident、Scheduled Maintenance、Status Page Announcement 等以文档中给出的https://oneuptime.com/reference/*在线参考页为准。本文所有实现细节均以 Common/Server/API/StatusPageAPI.ts、Nginx/default.conf.template 与 Common/ServiceRoute.ts 的当前仓库版本为准若端点路径或缓存策略后续调整请以仓库源码为最终依据。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表