モニタリングとロギング
このガイドでは、AWS上のMBC CQRS Serverlessアプリケーション向けの包括的なモニタリングとロギングのセットアップ方法を説明します。
概要
完全な可観測性戦略には以下が含まれます:
- ロギング: アプリケーションイベントとエラーのキャプチャ
- メトリクス: パフォーマンスと使用量の測定
- トレーシング: サービス間のリクエスト追跡
- アラート: 問題発生時の通知
組み込み機能
MBC CQRS Serverlessフレームワークは、以下の可観測性機能をすぐに使える形で提供します:
- RequestLogger: コンテキスト情報(tenantCode、userId、requestId、sourceIp)を含む拡張NestJSロガー
- AWS X-Rayトレーシング: CDKテンプレートでLambdaとStep Functionsに対してデフォルトで有効
- JSONロギングフォーマット: Lambda関数はクエリしやすいJSON形式でログを出力
- 設定可能なログレベル: LOG_LEVEL環境変数で設定
AWSサービスガイダンス
以下のセクションでは、追加のAWS CloudWatch機能(メトリクス、ダッシュボード、アラーム)のセットアップに関するガイダンスを提供します。これらはフレームワークに組み込まれていませんが、本番デプロイメントに推奨されるパターンです。
CloudWatch Logs
Lambdaロギング
フレームワークには、ログにコンテキストを自動的に追加する組み込みのRequestLoggerが含まれています:
// フレームワークのRequestLoggerは自動的に使用されます
// ログ出力には以下が含まれます: context、requestId、ip、tenantCode、userId
import { Logger, Injectable } from '@nestjs/common';
@Injectable()
export class YourService {
private readonly logger = new Logger(YourService.name);
async doSomething() {
// これらのログはLambdaでユーザーコンテキストを自動的に含みます
this.logger.log('操作を開始しました');
this.logger.debug('デバッグ情報');
this.logger.error('エラーが発生しました');
}
}
より詳細な追跡のために、構造化ロギングで強化できます:
import { Logger, Injectable } from '@nestjs/common';
@Injectable()
export class TodoService {
private readonly logger = new Logger(TodoService.name);
async create(dto: CreateTodoDto): Promise<Todo> {
this.logger.log({
action: 'create_todo',
input: dto,
userId: context.userId,
});
try {
const result = await this.save(dto);
this.logger.log({
action: 'todo_created',
todoId: result.id,
duration: Date.now() - startTime,
});
return result;
} catch (error) {
this.logger.error({
action: 'create_todo_failed',
error: error.message,
stack: error.stack,
});
throw error;
}
}
}
ログ保持
CDKでログ保持を設定:
import * as logs from 'aws-cdk-lib/aws-logs';
const logGroup = new logs.LogGroup(this, 'AppLogGroup', {
logGroupName: `/aws/lambda/${props.appName}-${props.envName}`,
retention: logs.RetentionDays.ONE_MONTH,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
ログフォーマット
クエリを容易にするための推奨ログフォーマット:
interface LogEntry {
timestamp: string;
level: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
message: string;
context: string;
correlationId?: string;
userId?: string;
duration?: number;
error?: {
name: string;
message: string;
stack: string;
};
metadata?: Record<string, any>;
}
CloudWatchメトリクス
実装が必要
カスタムメトリクスはフレームワークに組み込まれていません。以下の例は、AWS SDKを使用してアプリケーションにカスタムメトリクスを実装する方法を示しています。