监控网站正常运行时间
心跳记录成功和失败的检查。这使得中断变得可见,但也揭示了监控作业本身何时停止发送数据。
定期检查将停机时间和意外的沉默转变为可查询的事件。
使用 Telemetry SDK 为每次网站检查发送心跳,然后查询失败的检查和数据发送中断的时段。
先决条件
- Telemetry 的有效 API 密钥
- 对JavaScript和Node.js有基本了解
1.安装Telemetry SDK
首先,您需要在项目中安装 Telemetry SDK。如果您还没有这样做,请运行以下命令:
npm install telemetry-sh axios
2、初始化Telemetry
使用 Node.js 18 或更新版本。运行脚本前,在服务器环境中设置 TELEMETRY_API_KEY;不要将密钥放入浏览器代码。
import telemetry from "telemetry-sh";
import axios from "axios";
const apiKey = process.env.TELEMETRY_API_KEY;
if (!apiKey) throw new Error("Set TELEMETRY_API_KEY in server-side configuration");
telemetry.init(apiKey);
3. 创建心跳检查
要监控正常运行时间,您可以设置心跳功能,定期向 Telemetry 服务发送 ping。心跳将记录您网站的状态,使您可以监控其可用性。
这是心跳函数的基本示例:
const sendHeartbeat = async (url) => {
const startedAt = performance.now();
let heartbeat;
try {
const response = await axios.get(url, {
timeout: 10_000,
validateStatus: () => true,
});
const isOnline = response.status >= 200 && response.status < 400;
heartbeat = {
url,
timestamp: new Date().toISOString(),
status_code: response.status,
status: isOnline ? "check_passed" : "http_error",
is_online: isOnline,
latency_ms: performance.now() - startedAt,
};
} catch {
heartbeat = {
url,
timestamp: new Date().toISOString(),
status_code: 0,
status: "probe_error",
is_online: false,
error_type: "request_failed",
latency_ms: performance.now() - startedAt,
};
}
try {
await telemetry.log("website_uptime", heartbeat);
} catch {
try { console.warn("Heartbeat export failed"); } catch {}
}
return heartbeat;
};
这是从单台主机进行的基本检查,并非生产环境可用性保证。只使用不含凭据或令牌的公开 URL。HTTP 2xx/3xx 满足此示例的检查条件;超时或传输失败表示探测失败,不能证明网站对所有人都不可用。Axios 的十秒超时不是严格的总时间上限。
事件导出单独等待,导出失败不会改变 HTTP 结果。此处 SDK 没有可配置的发送超时:导出阻塞可能延迟后续检查。生产环境应使用应用自行管理的有界队列或 HTTP 客户端隔离导出,并独立监控检查器。
4. 安排心跳
立即开始一次检查,并在当前检查和导出完成后安排下一次运行:
const urlToMonitor = "https://example.com"; // Replace with a public URL.
const interval = 5 * 60 * 1000;
async function runHeartbeat() {
try {
await sendHeartbeat(urlToMonitor);
} catch {
try { console.warn("Heartbeat check failed"); } catch {}
} finally {
setTimeout(runHeartbeat, interval);
}
}
void runHeartbeat();
此调度器立即启动,等待一次检查和导出完成,再等待五分钟后开始下一次运行。它避免检查重叠,但时间会漂移;它不是固定五分钟周期或持久化调度器。
5. 查询正常运行时间
查询已记录探测中通过 HTTP 检查的比例:
const results = await telemetry.query(`
SELECT
url,
COUNT(*) AS total_pings,
SUM(CASE WHEN is_online THEN 1 ELSE 0 END) AS online_pings,
(SUM(CASE WHEN is_online THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) AS observed_check_success_percentage
FROM
website_uptime
WHERE
timestamp_utc >= now() - INTERVAL '30 days'
GROUP BY
url
`);
console.log(results);
查询计算已观测探测中通过检查的比例。缺失的计划检查不在分母中,因此它不是按实际经过时间计算的正常运行率或 SLA。使用预期检查登记表和独立监控器,区分覆盖缺失与已观测失败。
6. 探索 Telemetry 的正常运行时间
Telemetry 的 UI 允许您以交互方式可视化和探索正常运行时间数据。访问 Telemetry仪表板 并使用您的凭据登录,以根据您的正常运行时间监控数据创建仪表板、图表等。
后续步骤
正常运行时间百分比无法检测停止运行的监视器。添加 缺少心跳食谱 并在最新检查早于预期计划加上一小段宽限期时发出告警。