Seize the day

POST : Backend study

Mongo 서버에 ping 해보기

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));
}
top

posted at

2024. 5. 4. 20:29


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크