SCALE — Build Lab
開発パターン · CLOUDFLARE FUNCTION

ヘルスチェック API

CATEGORY開発パターン TYPECloudflare Function EFFORT15〜30分 DIFFICULTY
PRIMARY CODE
ts · scale-crm:functions/api/health.ts
// GET /api/health → ヘルスチェック (UptimeRobot用)
import { corsResponse, corsError, handleOptions } from '../_lib/cors';

interface Env { DB: D1Database }

export const onRequestOptions = () => handleOptions();

export const onRequestGet: PagesFunction<Env> = async ({ env }) => {
  try {
    const t0 = Date.now();
    const row = await env.DB.prepare(
      'UPDATE health_check SET last_ping = datetime(\'now\') WHERE id = 1 RETURNING last_ping'
    ).first();
    const dbLatency = Date.now() - t0;

    const counts = await env.DB.prepare(
      'SELECT (SELECT COUNT(*) FROM app_data) AS app_data, (SELECT COUNT(*) FROM snapshots) AS snapshots, (SELECT COUNT(*) FROM error_log) AS errors'
    ).first();

    return corsResponse({
      ok: true,
      time: new Date().toISOString(),
      db_latency_ms: dbLatency,
      last_ping: row?.last_ping,
      counts,
    });
  } catch (e: any) {
    return corsError('DB unhealthy: ' + e.message, 503);
  }
};

前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • 全API プロジェクト

ヘルスチェック API

:LiTarget: 用途

API の生死確認エンドポイント。UptimeRobot 等の外部監視で利用。

:LiSparkle: 特徴

  • シンプル GET /api/health
  • 応答時間測定
  • D1接続確認

:LiCode: 実コード(SCALE Base より自動抽出)

:LiInfo: scale-crm:functions/api/health.ts の中身そのもの。コピペ即可。

// GET /api/health → ヘルスチェック (UptimeRobot用)
import { corsResponse, corsError, handleOptions } from '../_lib/cors';

interface Env { DB: D1Database }

export const onRequestOptions = () => handleOptions();

export const onRequestGet: PagesFunction<Env> = async ({ env }) => {
  try {
    const t0 = Date.now();
    const row = await env.DB.prepare(
      'UPDATE health_check SET last_ping = datetime(\'now\') WHERE id = 1 RETURNING last_ping'
    ).first();
    const dbLatency = Date.now() - t0;

    const counts = await env.DB.prepare(
      'SELECT (SELECT COUNT(*) FROM app_data) AS app_data, (SELECT COUNT(*) FROM snapshots) AS snapshots, (SELECT COUNT(*) FROM error_log) AS errors'
    ).first();

    return corsResponse({
      ok: true,
      time: new Date().toISOString(),
      db_latency_ms: dbLatency,
      last_ping: row?.last_ping,
      counts,
    });
  } catch (e: any) {
    return corsError('DB unhealthy: ' + e.message, 503);
  }
};

:LiFolder: ソースファイルのパス

/Users/oogushiyuuki/株式会社SCALE/scale-lead/functions/api/health.ts

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加