[typescript] GraphQL-js에서의 타입 기반 로깅 및 모니터링 구현

GraphQL은 서버 사이드 개발에서 인기 있는 기술 중 하나로, Node.js 기반의 GraphQL 서버를 구축하기 위해 주로 GraphQL-js를 사용합니다. 서비스의 신뢰성을 높이고 사용률을 추적하기 위해서는 로깅 및 모니터링이 필수적입니다. 이번 블로그 포스트에서는 TypeScript를 사용하여 GraphQL-js에서 타입 기반의 로깅 및 모니터링을 구현하는 방법에 대해 살펴보겠습니다.

요구 사항

우리의 목표는 GraphQL 서버에서 발생하는 이벤트를 타입에 기반하여 적절히 로깅하고 모니터링하는 것입니다. 이를 위해 다음과 같은 요구 사항을 고려하고 구현할 것입니다.

GraphQL 타입 기반 로깅

GraphQL-js에서 이벤트 로깅을 구현하는 한 가지 방법은 미들웨어를 사용하는 것입니다. 우리는 execute 함수를 래핑하여 원하는 이벤트가 발생할 때 로깅하는 미들웨어를 구현할 것입니다.

import { execute, ExecutionArgs } from 'graphql';
import { Logger } from './logger';

export const loggingMiddleware = async (args: ExecutionArgs) => {
  // 이벤트에 따라 로그 생성
  const loggingInfo = {
    operationName: args.operationName,
    query: args.source.body,
    variables: args.variableValues,
    // 추가적인 필드들...
  };
  Logger.log(loggingInfo);
  return execute(args);
};

위의 예제에서 loggingMiddleware 함수는 전달된 ExecutionArgs에 기반하여 로깅을 수행한 뒤, execute 함수를 호출합니다.

타입 기반 모니터링

GraphQL의 타입 기반 모니터링을 구현하기 위해서는 GraphQL 스키마의 타입 정보를 활용할 것입니다. 각각의 타입에 대한 요청 횟수나 소요 시간 등의 정보를 추적할 수 있습니다.

import { GraphQLSchema, execute, ExecutionArgs } from 'graphql';
import { Monitor } from './monitor';

export const monitoringMiddleware = (schema: GraphQLSchema) => async (args: ExecutionArgs) => {
  // 요청된 타입 정보 추적
  const typeInfo = schema.getType(args.fieldName);
  Monitor.trackTypeUsage(typeInfo.name);
  // 성능 관련 정보 추적
  const start = Date.now();
  const result = await execute(args);
  const end = Date.now();
  Monitor.trackPerformance(typeInfo.name, end - start);
  return result;
};

위의 예제에서 monitoringMiddleware 함수는 전달된 schema 에 기반하여 요청된 타입 정보와 성능 관련 정보를 추적한 뒤, execute 함수를 호출합니다.

마치며

이와 같이 타입 기반의 로깅 및 모니터링을 구현하여 GraphQL 서버의 이벤트를 세밀하게 추적하고 기록할 수 있습니다. 이를 통해 서비스의 안정성을 높이고 성능 향상에도 도움이 될 수 있습니다.

이상으로 타입 기반 로깅 및 모니터링에 대한 튜토리얼을 마치겠습니다. 어떤 정보든 도움이 되었기를 바라며, 추가적인 궁금증이나 더 많은 내용을 알고 싶다면 아래의 참고 자료를 참고해 보시기 바랍니다.

참고 자료