OpenStatus与NTFY集成:开源推送通知的监控告警方案
你是否还在为开源监控平台的告警通知问题烦恼?当服务器宕机、API响应超时或服务性能下降时,如何确保团队能及时收到告警信息?本文将详细介绍如何通过OpenStatus与NTFY的集成,构建一套完整的开源监控告警方案,让你轻松实现系统异常的实时推送通知。
读完本文你将了解:
- OpenStatus与NTFY集成的核心优势
- 完整的配置步骤与代码实现
- 三种告警类型(故障、恢复、降级)的处理流程
- 实际应用场景与最佳实践
集成方案概述
OpenStatus作为开源监控平台,提供了全面的服务监控和事件管理能力,而NTFY则是一款简单易用的开源推送通知服务。两者的集成为用户打造了一个无需依赖第三方商业服务的完整监控告警闭环。
集成架构主要包含三个核心组件:
- 监控数据采集:由OpenStatus的checker模块完成,定期检测服务状态
- 告警规则引擎:分析监控数据并触发相应级别的告警
- 通知分发系统:通过NTFY模块将告警信息推送到指定设备或平台
核心实现代码位于packages/notifications/ntfy/src/index.ts,定义了四种主要通知类型:故障告警(sendAlert)、恢复通知(sendRecovery)、性能降级通知(sendDegraded)和测试通知(sendTest)。
配置与依赖
NTFY集成模块的配置 schema 定义在packages/notifications/ntfy/src/schema.ts,采用Zod进行数据验证:
export const NtfySchema = z.object({
ntfy: z.object({
topic: z.string(),
serverUrl: z.string().default("https://ntfy.sh"),
token: z.string().optional(),
}),
});
主要配置参数说明:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| topic | string | NTFY主题名称,用于接收通知 | 是 |
| serverUrl | string | NTFY服务器地址,默认使用公共服务器 | 否 |
| token | string | 访问私有NTFY服务器的认证令牌 | 否 |
在OpenStatus中,你需要在通知配置页面填写这些参数,建立与NTFY服务的连接。
核心实现详解
故障告警通知
当监控对象出现故障时,sendAlert函数会被调用,发送告警信息到指定的NTFY主题:
export const sendAlert = async ({
monitor,
notification,
statusCode,
message,
incidentId,
cronTimestamp,
latency,
region
}) => {
const notificationData = NtfySchema.parse(JSON.parse(notification.data));
const { name } = monitor;
const body = `Your monitor ${name} / ${monitor.url} is down with ${
statusCode ? `status code ${statusCode}` : `error: ${message}`
}`;
const authorization = notificationData.ntfy.token
? { Authorization: `Bearer ${notificationData.ntfy.token}` }
: undefined;
const url = notificationData.ntfy.serverUrl
? `${notificationData.ntfy.serverUrl}/${notificationData.ntfy.topic}`
: `https://ntfy.sh/${notificationData.ntfy.topic}`;
try {
await fetch(url, {
method: "post",
body,
headers: {
...authorization,
},
});
} catch (err) {
console.log(err);
}
};
这段代码首先解析并验证通知配置,然后构建包含监控名称、URL、状态码或错误信息的通知内容,最后通过HTTP POST请求发送到NTFY服务器。
恢复通知
当故障恢复后,sendRecovery函数会发送恢复通知:
export const sendRecovery = async ({
monitor,
notification,
statusCode,
message,
incidentId,
cronTimestamp,
latency,
region
}) => {
// 实现逻辑类似sendAlert,但通知内容为恢复信息
const body = `Your monitor ${name} / ${monitor.url} is up again`;
// ...发送请求代码
};
恢复通知采用与故障告警相同的请求结构,但内容更加简洁,仅通知服务已恢复正常。
性能降级通知
当服务性能下降但未完全故障时,sendDegraded函数会发送降级通知:
export const sendDegraded = async ({
monitor,
notification,
statusCode,
message,
incidentId,
cronTimestamp,
latency,
region
}) => {
const body = `Your monitor ${name} / ${monitor.url} is degraded `;
// ...发送请求代码
};
降级通知适用于响应时间过长、部分功能异常等非致命性问题,帮助用户及时发现潜在风险。
集成步骤与使用指南
1. 准备NTFY服务
首先,你需要有一个可用的NTFY服务。有两种选择:
- 使用公共NTFY服务(https://ntfy.sh)
- 自建私有NTFY服务器
对于公共服务,只需创建一个唯一的主题名称;对于私有服务器,需要记录服务器URL和访问令牌。
2. 在OpenStatus中配置通知
在OpenStatus控制台中:
- 导航到"通知"设置页面
- 点击"添加通知"按钮
- 选择"NTFY"作为通知类型
- 填写NTFY配置信息(主题、服务器URL、令牌)
- 保存配置并发送测试通知验证连接
3. 创建监控规则
在OpenStatus中创建或编辑监控对象,在"告警设置"部分:
- 选择刚刚创建的NTFY通知通道
- 设置触发条件(如状态码非200、响应时间>500ms等)
- 配置告警级别和重复策略
实际应用场景
网站可用性监控
配置HTTP监控检查网站状态,当网站不可访问时,通过NTFY接收即时告警:
Your monitor "公司官网" / https://example.com is down with status code 503
API性能监控
监控关键业务API的响应时间,当性能下降时触发降级通知:
Your monitor "支付API" / https://api.example.com/pay is degraded
服务器资源监控
结合OpenStatus的SSH监控能力,监控服务器CPU、内存使用率,当超过阈值时发送告警。
最佳实践与注意事项
主题命名策略
为不同类型的监控对象创建专用主题,如:
- openstatus-prod-alerts(生产环境告警)
- openstatus-dev-notifications(开发环境通知)
- openstatus-critical(关键业务告警)
安全建议
- 对于敏感系统的告警,建议使用私有NTFY服务器并启用认证
- 定期轮换访问令牌,增强安全性
- 避免在通知内容中包含敏感信息(如IP地址、凭证等)
优化建议
- 根据监控对象的重要性设置不同的告警级别
- 配置合理的告警抑制策略,避免告警风暴
- 定期测试通知通道的可用性
总结与展望
OpenStatus与NTFY的集成提供了一个完全开源、自主可控的监控告警解决方案,帮助团队及时响应系统异常,减少业务中断时间。这种组合的优势在于:
- 完全开源:避免 vendor lock-in,可自由定制和扩展
- 部署灵活:支持公共服务和私有部署两种模式
- 简单易用:无需复杂配置即可快速搭建
- 安全可靠:端到端加密,保障通知内容安全
未来,OpenStatus计划增强与NTFY的集成能力,包括支持富文本通知、图片附件和交互式操作,进一步提升告警通知的实用性和易用性。
如果你在使用过程中遇到任何问题,欢迎查阅官方文档或提交issue参与项目改进。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



