티스토리 뷰

 

새로운 기능을 추가하고 배포한지 일주일이 지났습니다. 문득, 새로 추가한 기능을 사용자가 잘 사용하는지 궁금했습니다. 이에 대한 기준은 새로 추가한 API 호출이 빈번하게 일어나는가 입니다. API 별 호출 횟수를 바탕으로 쉽게 파악할 수 있습니다. 

 

API 별 호출 회수는 모니터링하고 있지 않았습니다. Spring Actuator는 사용하고 있었기에 메모리 상에 데이터는 존재할 거란 희망을 품었습니다. 메모리 상 어딘가에 존재하는 이진수를 찾기 위해 jxm을 공부했지만 러닝 커브가 높았습니다. 공부하던 중에 서버가 내려간다면 영영 찾을 수 없게 됩니다. 메모리를 통째로 덤프 떠서 분석할까 고민했지만, 문득 좋은 방법이 떠올랐습니다. 

 

Nginx 로그 파일 발견

EC2 내에서 Nginx로 API 서버에 리버스 프록시를 걸어두었습니다. 즉, 모든 API 요청은 Nginx를 거친다는 것입니다. Spring 서버에 어떠한 기록도 남지 않았지만, Nginx에는 남지 않았을까? 로그 설정을 열어 보았습니다. 

 

 

 

1일 단위로 로그를 롤링하고 있었고 이는 14일 동안 유지 되었습니다. 로그가 살아있다는 희소식에 로그 파일을 찾아가 열어 보았습니다.

 

 

 

감격을 금치 못하고, 바로 로컬로 복사했습니다. 전송에는 scp 프로토콜을 사용했습니다. 

 

EC2 -> local

 

 

로그 파일 분석

로그 파일이 로컬에 무사히 도착하고 분석을 시작했습니다. 3일치 데이터를 분석했습니다. 이 기간은 사용자가 가장 몰렸던 수강 신청 기간입니다. 로그 파일은 요청 그대로를 담고 있었습니다. 

 

 

 

얻고 싶은 결과물은 API 별 요청 수입니다. 이 로그 파일을 어떻게 가공할까 고민했습니다. 생각보다 크기가 컸기에 직접 세다간 밤을 새게 생겼습니다. 로그 파일을 분석해 주는 툴이 있나 찾아보다, 쉘 명령어가 떠올랐습니다. 그리고 최종적으로 사용한 명령어는 다음과 같습니다. 

 

cat access.log.* | awk -F\" '{print $2}' | awk '{print $1, $2}' | grep '/api/v2' | sed 's/\?.*//'
| sort | uniq -c | sort -nr

 

Nginx 로그 파일에서 특정 API 엔드포인트의 요청 횟수를 집계하는 명령어입니다. 각 부분을 단계별로 분석해보겠습니다.

  1. cat access.log.*:
    access.log.로 시작하는 모든 파일의 내용을 읽어들입니다. access.log.1, access.log.2와 같은 파일을 모두 읽습니다. 
  2. awk -F\" '{print $2}':
    -F\"는 필드 구분자를 큰따옴표(")로 설정합니다.
    {print $2}는 로그에서 두 번째 필드를 출력합니다. Nginx의 기본 로그 형식에서 두 번째 필드는 요청 라인(예: "GET /api/v2/some/path HTTP/1.1")입니다.
  3. awk '{print $1, $2}':
    앞의 awk 명령어로 추출한 요청 라인에서 첫 번째 필드(HTTP 메서드)와 두 번째 필드(경로)를 출력합니다.
    예를 들어, "GET /api/v2/some/path HTTP/1.1"에서 GET과 /api/v2/some/path가 추출됩니다.
  4. grep '/api/v2':
    /api/v2로 시작하는 경로만 필터링합니다. 이는 /api/v2로 시작하는 모든 요청 경로를 포함합니다.
  5. sed 's/\?.*//':
    URL에서 쿼리 문자열(파라미터)을 제거합니다. 예를 들어, /api/v2/some/path?param=value에서 ?param=value를 제거하여 /api/v2/some/path로 만듭니다.
  6. sort:
    URL을 정렬합니다. uniq -c 명령어가 작동하려면 입력이 정렬되어 있어야 합니다.
  7. uniq -c:
    중복된 URL을 그룹화하고 각 그룹의 개수를 카운트합니다. 예를 들어, 동일한 URL이 여러 번 나타나면 그 개수를 셉니다.
  8. sort -nr:
    카운트된 결과를 내림차순으로 정렬합니다. 요청 횟수가 많은 API 엔드포인트가 위에 위치하게 됩니다.

 

이렇게 나온 결과는 다음과 같습니다. 3일 간 API 별 호출된 횟수를 알 수 있었습니다. 

 

 

데이터 시각화

숫자로만 보이는 게 심심해서 파이썬을 사용해서 간단하게 시각화 했습니다. 

 

 

시각화는 Google Colab과 다음 스크립트를 사용했습니다. 

 

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 로드
data = pd.read_csv('api_requests.csv')

# HTTP 메서드와 경로를 결합한 새로운 컬럼 생성
data['method_path'] = data['method'] + ' ' + data['path']

# 색상 설정
sns.set(style="whitegrid")

# 요청 경로별 요청 수 시각화
plt.figure(figsize=(12, 10))
barplot = sns.barplot(x='count', y='method_path', data=data, palette='muted')

# 그래프 제목과 축 레이블 설정
barplot.set_title('API Requests by HTTP Method and Path', fontsize=16)
barplot.set_xlabel('Number of Requests', fontsize=14)
barplot.set_ylabel('HTTP Method and API Path', fontsize=14)

# 각 막대에 요청 수 표시
for index, value in enumerate(data['count']):
    plt.text(value + 100, index, str(value), color='black', va="center")

# 결과를 파일로 저장 (선택 사항)
plt.tight_layout()
plt.savefig('api_requests_combined_with_numbers.png')

# 결과 출력
plt.show()

 

 

이후에는

이렇게 Nginx를 통해 API 별 요청 데이터를 추출했습니다. 이후 이 데이터를 기반으로 사용자 분석과 API 최적화를 진행하려고 합니다. 

링크
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday