【Node.js】APIパフォーマンスを可視化する方法|ログ・レスポンスタイム・モニタリングの実装

【Node.js】APIパフォーマンスを可視化する方法|ログ・レスポンスタイム・モニタリングの実装 Node.js

APIのレスポンスが遅い、または時々タイムアウトが発生する——こうしたパフォーマンスの問題を早期に発見し、安定運用につなげるためには、パフォーマンスの可視化が不可欠です。

本記事では、Node.jsで構築されたAPIサーバにおいて、ログ収集・レスポンスタイム計測・リアルタイムモニタリングといった手法を活用して、APIのパフォーマンスを効率よく可視化・監視する方法を紹介します。

ミドルウェアでレスポンスタイムを計測する

Expressなどのフレームワークでは、ミドルウェアを用いることで簡単にレスポンスタイムを取得できます。以下は基本的な計測例です:

app.use((req, res, next) => {
  const start = Date.now();

  res.on('finish', () => {
    const duration = Date.now() - start;
    console.log(`${req.method} ${req.originalUrl} - ${duration}ms`);
  });

  next();
});

このコードは、各リクエストの処理時間をミリ秒単位で計測し、ログに出力します。

ログ管理を行うためのwinston導入

標準のconsole.logだけではログの出力先やフォーマットに限界があります。winstonを使うことで、ログのレベル管理・出力先の制御・ファイル保存が容易になります。

npm install winston
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.printf(({ timestamp, level, message }) => {
      return `${timestamp} [${level.toUpperCase()}] ${message}`;
    })
  ),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'logs/api.log' })
  ]
});

先ほどのミドルウェアにlogger.info()を組み込めば、時刻付きでログが保存されます。

ステータスコード別に集計・分類する

レスポンスのステータスコードごとに分類してログを出力することで、エラー傾向の可視化も可能です。

res.on('finish', () => {
  const duration = Date.now() - start;
  const status = res.statusCode;
  const method = req.method;
  const url = req.originalUrl;

  logger.info(`${method} ${url} ${status} - ${duration}ms`);
});

ログファイルを後で分析することで、「5xx系エラーが多発しているAPI」や「レスポンスが遅いAPI」の傾向を掴むことができます。

リアルタイムモニタリングに活用できるツール

以下のようなツールを組み合わせることで、パフォーマンスを可視化・監視する体制を構築できます。

  • PM2 + pm2-logrotate:ログ管理とプロセス監視
  • Prometheus + Grafana:時系列メトリクスの可視化
  • Elastic Stack(ELK):検索可能なログ監視基盤

たとえばPM2では、レスポンスタイムやメモリ使用量の変化をWeb UIで確認できます。

npm install pm2 -g
pm2 start app.js --name "api-app"
pm2 monit

アラート通知の導入

エラー頻発やレスポンスタイムの急激な上昇に対して即時対応したい場合は、以下のような通知システムとの連携がおすすめです。

  • Slack通知(webhook連携)
  • Email通知(nodemailer + 条件分岐)
  • DatadogやSentryとの連携

例:レスポンスタイムが1秒を超えた場合にSlackへ通知

if (duration > 1000) {
  sendToSlack(`遅延警告: ${method} ${url} - ${duration}ms`);
}

まとめ

APIのパフォーマンスを可視化することは、信頼性の高いサービス運用において不可欠です。

ミドルウェアによる計測winstonによる構造化ログPM2やPrometheusを用いたモニタリングを組み合わせることで、異常の早期発見と継続的な改善が実現できます。

本番環境ではログの保存・通知・監視を統合し、開発環境ではレスポンスタイムの見える化から始めてみると良いでしょう。