Lang x Lang

health チェック

health チェックは、システム自体が立ち上がっているかのチェックと、DB 含めシステムが機能しているかのチェックの 2 種類がある。1 つにしてしまっても良いが、前者は Deploy する AWS 等のインフラ側がたくさんアクセスするので、DB への負荷という面で、2 つに分けることにする。

  • /api/health200
  • /api/health/deep200 or 503
src
└── app/api
    └── health
        ├── deep
        │   └── route.ts
        └── route.ts

health チェックの API のレスポンスは、

  • headers > 'Content-Type': 'application/health+json'
  • body > status: 'pass' or 'fail'
  • error > details: {}

とするのが作法のようだ。

通常の health チェック

src/app/api/health/route.ts
export const dynamic = 'force-dynamic';
import { NextResponse } from 'next/server';

export function GET(request: Request) {
  return NextResponse.json(
    { status: 'pass', message: 'success to connect' },
    {
      status: 200,
      headers: {
        'Content-Type': 'application/health+json',
      },
    }
  );
}

深い health チェック

何でも良いので、DB から値を取得するようにして、DB が立ち上がっているかのチェックを行う。

src/app/api/health/deep/route.ts
export const dynamic = 'force-dynamic';
import { NextResponse } from 'next/server';
import { prisma } from '@/lib/Prisma';
import { handlePrismaError } from '@/lib/PrismaErrorHandler';

// health check with database connection
export async function GET(request: Request) {
  let statusCode = 200;
  const res = await prisma.bookmark
    .findMany({ take: 1 })
    .then(() => {
      return {
        status: 'pass',
        message: 'success to connect database',
      };
    })
    .catch((err) => {
      const { errorObject } = handlePrismaError(err);
      statusCode = 503;
      return {
        status: 'fail',
        message: 'failed to connect database',
        details: errorObject,
      };
    });

  return NextResponse.json(res, {
    status: statusCode,
    headers: {
      'Content-Type': 'application/health+json',
    },
  });
}

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use