Web サイトの稼働時間を監視する
ハートビートは、成功したチェックと失敗したチェックの両方を記録します。これにより、停止が可視化されるだけでなく、監視ジョブ自体がいつデータ送信を停止するかも明らかになります。
定期的なチェックにより、ダウンタイムと予期せぬ沈黙がクエリ可能なイベントに変わります。
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 を送信するハートビート機能を設定できます。ハートビートは Web サイトのステータスを記録し、Web サイトの可用性を監視できるようにします。
ハートビート関数の基本的な例を次に示します。
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 ダッシュボード 資格情報を使用してログインし、稼働時間監視データに基づいてダッシュボードやグラフなどを作成します。
次のステップ
稼働時間のパーセンテージでは、実行が停止したモニターを検出できません。を追加します。 失われたハートビートのレシピ 最新のチェックが予想されるスケジュールに少しの猶予期間を加えたものよりも古い場合に警告します。