mongo 메뉴얼에 따르면, "ping 명령은 서버가 명령에 응답하는지 테스트하는 데 사용되는 무작동 명령입니다. 이 명령은 서버가 쓰기 잠금 상태인 경우에도 즉시 반환됩니다".
db서버 연결 타임아웃은 1초로 한다. 같은 vm에서 실행되기때문에 기본값인 30초는 너무 길다.
https://www.mongodb.com/community/forums/t/connect-timeout-and-execution-timeout-in-nodejs-driver/2129/2 코멘트를 참고했다.
ping API가 하는 일은 Mongo db의 상태와 Nest.js 서버의 정상적인 응답 여부이다. 앱에서 호출하지는 않고 문제 생겼을 때 브라우저에서 확인용으로 호출해 본다. 구현은 간단해서 자세한 설명은 생략한다.
import { MongoClient } from "mongodb";
const os = require('os');
export async function getPing(response: Response) {
// Mongo db
let mongoStatus;
try {
const config = {
serverSelectionTimeoutMS: 1000, //connection timeout
socketTimeoutMS: 1000,
}
const client = await MongoClient.connect("mongodb://localhost", config);
const result = await client.db("admin").command({ ping: 1 });
await client.close();
mongoStatus = result && result.ok && result.ok == 1? "ping OK" : "ping failed";
} catch(error) {
mongoStatus = "Down (connection failed)";
}
// os.loadavg()
const avg_load = os.loadavg();
const avgLoad1m = String(avg_load[0]).substring(0, 4);
const avgLoad5m = String(avg_load[1]).substring(0, 4);
const avgLoad15m = String(avg_load[2]).substring(0, 4);
// os.freemem()
let free_memory = os.freemem();
let free_mem_in_kb = free_memory / 1024;
let free_mem_in_mb = free_mem_in_kb / 1024;
let free_mem_in_gb = free_mem_in_mb / 1024;
free_mem_in_gb = Math.floor(free_mem_in_gb);
free_mem_in_mb = Math.floor(free_mem_in_mb);
free_mem_in_mb = free_mem_in_mb % 1024;
const freeMem = "Free memory: " + free_mem_in_gb + "GB (" + free_mem_in_mb + "MB)";
// process.memoryUsage()
const memoryData = process.memoryUsage();
const memoryUsage = {
heapTotal: `${memoryData.heapTotal / 1024 / 1024} MB`,
heapUsed: `${memoryData.heapUsed / 1024 / 1024} MB`,
rss: `${memoryData.rss / 1024 / 1024} MB`,
external: `${memoryData.external / 1024 / 1024} MB`,
};
const json = {
server: "API Server(version: 2)",
serverStatus: {
avgLoad1m,
avgLoad5m,
avgLoad15m,
freeMem,
},
mongoStatus,
process: memoryUsage,
timestamp: new Date().toLocaleString()
};
const result = {
code: 0,
result: json,
};
response.status(200).send(JSON.stringify(result, null, 2));
}