애초부터 관찰 가능한 API 설계하기
Wenhao Wang
Dev Intern · Leapcell

소개
빠르게 발전하는 소프트웨어 개발 세계에서 백엔드 서비스를 구축하고 배포하는 것은 일상적인 작업이 되었습니다. 그러나 진정한 도전은 초기 출시가 아니라 프로덕션에서 이러한 시스템을 유지, 디버깅 및 최적화하는 데서 시작되는 경우가 많습니다. 요청이 여러 서비스, 데이터베이스 및 외부 API를 통과하는 복잡한 마이크로서비스 아키텍처를 상상해 보세요. 이러한 상호 작용에 대한 적절한 가시성 없이는 병목 현상을 정확히 찾아내거나, 오류를 진단하거나, 심지어 사용자 행동을 이해하는 것조차 불가능한 작업이 될 것입니다. 이러한 통찰력 부족은 장기간의 중단, 좌절한 고객, 과도한 작업을 하는 개발자로 이어질 수 있습니다.
전통적인 접근 방식은 종종 "관찰 가능성"을 사후 처리로 취급합니다. 즉, 문제가 발생한 후에 추가하는 것입니다. 그러나 보다 선제적이고 궁극적으로 더 효과적인 전략은 API 설계 단계에서부터 관찰 가능성을 시스템의 핵심에 통합하는 것입니다. 로깅, 메트릭 및 추적을 염두에 두고 API를 본질적으로 설계함으로써 우리는 복원력이 있고 이해하기 쉬우며 진단하기 쉬운 백엔드 시스템을 구축할 수 있는 역량을 갖추게 됩니다. 이 글에서는 반응형 디버깅을 넘어 서비스에 대한 선제적 이해로 나아가 이를 달성하는 방법을 살펴봅니다.
관찰 가능성의 기둥
"어떻게"에 대해 자세히 알아보기 전에 관찰 가능성의 핵심 개념에 대한 공통된 이해를 정립해 보겠습니다.
로깅: 로그는 시스템 내에서 발생하는 이벤트에 대한 이산적이고 변경 불가능한 기록입니다. 특정 시점에서 "무슨 일이 일어났는지"에 대한 서술을 제공합니다. 시스템 동작, 오류 및 중요한 상태 변경을 자세히 설명하는 개별 일기 항목으로 생각하세요.
메트릭: 메트릭은 시간이 지남에 따라 캡처되는 집계 가능한 수치 측정값입니다. 이벤트별인 로그와 달리 메트릭은 시스템 상태 및 성능에 대한 정량적 요약을 제공합니다. 예로는 초당 요청 수, 오류율, CPU 사용률 및 지연 시간이 있습니다. "얼마나 많이?" 또는 "얼마나 자주?"와 같은 질문에 답합니다.
추적: 분산 추적은 여러 서비스에 걸친 단일 요청의 여정에 대한 엔드투엔드 보기를 제공합니다. 이벤트의 인과 사슬을 시각화하여 어떤 서비스가 호출되었는지, 어떤 순서로, 각 작업이 얼마나 오래 걸렸는지를 정확히 보여줍니다. 추적은 "왜 이 요청이 느린가?" 또는 "이 오류는 어디서 발생했는가?"와 같은 질문에 답하는 데 도움이 됩니다.
이 세 가지 기둥은 상호 보완적입니다. 로그는 세부 정보를 제공하고, 메트릭은 높은 수준의 추세를 제공하며, 추적은 실행 경로를 조명합니다. 함께, 그것들은 시스템 동작에 대한 포괄적인 그림을 제시합니다.
API 설계에 관찰 가능성 통합
여기서 핵심 원칙은 API 설계 시점에 디버깅, 성능 분석 및 비즈니스 인텔리제이션에 유용한 정보를 retrospective이 아닌 retrospective이 아닌 retrospective이 아닌 retrospectively가 아닌 retrospectively가 아닌 retrospective이 아닌 retrospectively가 아닌 retrospective이 아닌 retrospective이 아닌 retrospective이 아닌 retrospective이 아닌 retrospective이 아닌 retrospective을 omitting-retrospectively 아닌 retrospectively 아닌 omitting-retrospectively 가 아닌 omitting-retrospectively 아닌 omitting-retrospectively 가 아닌 omitting-retrospectively 가 아닌 omitting-retrospectively 가 아닌 omitting-retrospectively 아닌 omitting-retrospectively가 아닌 omitting-retrospectively가 아닌 omitting-retrospectively가 아닌 omitting-retrospectively가.
API를 위한 로깅 모범 사례
API를 설계할 때 명시적 로깅으로 이점을 얻을 수 있는 중요한 상태와 결정 지점을 고려하십시오.
- 
요청 및 응답 로깅: API 게이트웨이 또는 진입점에서 들어오는 요청과 나가는 응답을 기록합니다. 여기에는 관련 헤더, 요청 ID 및 상태 코드가 포함되어야 합니다. 민감한 데이터를 마스킹하십시오.
# Flask 및 사용자 정의 로거를 사용하는 예 from flask import Flask, request, jsonify import logging app = Flask(__name__) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') @app.before_request def log_request_info(): request_id = request.headers.get('X-Request-ID', 'N/A') app.logger.info(f