django silk. DRF의 요청 응답 추적 및 ORM 프로파일링

“django silk”는 데이터베이스 쿼리를 포함하여 요청-응답 주기를 기록하고 분석하는 Django 애플리케이션용 프로파일링 도구입니다.

상세한 프로파일링 정보와 시각화를 제공하여 N+1 쿼리를 포함한 성능 병목 현상을 식별할 수 있습니다.

특히 ORM을 통해 장고 내부적으로 사용하는 쿼리를 바로 확인 할 수도 있습니다.

이를 사용하여 최적화가 필요한 코드 영역을 찾아낼 수 있습니다.

django silk 설치 및 설정

우선 pip로 django-silk를 설치 합니다.

pip install django-silk

settings.py 설정 추가

settings.py 에 다음을 추가합니다.

note :

  • silk는 middleware의 순서에 굉장히 민감합니다.
  • process_request을 반환하는 middleware가 있다면 이 보다 위에 두어야합니다.
MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)

urls.py 패턴 추가

장고 silk에 대한 UI에 접근하기 위해서 urls.py를 다음을 추가해줍니다.

urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]

migration

migrate 하기 전에 다음 명령어를 실행합니다.

python manage.py migrate

이제 설치 및 설정은 완료 되었습니다.

runserver를 하고 요청을 하게 되면 localhost:8000/silk/에서 어떤 요청이 있었고 어떤 쿼리를 사용했으며 몇 초가 걸렸는지 등을 대시보드에서 확인 할 수 있습니다.

django silk 에서 제공해주는 데이터

Summary

summary에서는 다음과 같은 정보를 보여줍니다.

  • 전체적으로 가장 시간이 많이 소요된 요청
  • DB에서 가장 시간이 많이 소요된 요청
  • DB에서 가장 많이 발생된 쿼리

해당 정보를 가지고 어떤 요청들이 있었고 서버에 부하가 걸리는 요청은 무엇이었는지 확인 할 수 있습니다.

Request

좌상단 메뉴에서 Request를 클릭해서 들어갈 수 있습니다.

해당 프로젝트에서 발생된 모든 요청들을 해당 페이지에서 확인 할 수 있습니다.

페이지 당 몇개의 요청을 볼 것인지 설정 할 수 있으며 정렬, 필터를 통해 관리자가 관심있는 요청들을 찾아 볼 수 있습니다.

SQL

장고에서 ORM으로 DB에 쿼리를 요청하더라도 실제 돌아가는 쿼리문이 무엇인지 확인 할 수 있습니다.

SQL 메뉴에 들어가면 확인 할 수 있습니다.

Profiling

Python의 내장 cProfile 프로파일러를 사용하려면 SILKY_PYTHON_PROFILER 설정을 켜야 합니다.

각 요청은 별도로 프로파일링되며 프로파일러의 출력은 Silk UI의 요청 프로파일링 페이지에서 사용할 수 있습니다.

NOTE:
Python 3.12부터 cProfile은 동시에 실행할 수 없으므로 Python 3.12 이상에서 django-silk는 다른 프로필이 실행 중인 경우(다른 스레드에 있는 자체 프로필러라도) 프로필을 작성하지 않습니다.

SILKY_PYTHON_PROFILER = True
SILKY_PYTHON_PROFILER_BINARY = True

SILKY_PYTHON_PROFILER이 활성화되면 gprof2dot 및 viz.js를 사용하여 생성된 그래프 시각화가 프로필 세부 정보 페이지에 표시됩니다.

django silk 기록 수 제한

Silky Garbage가 오래된 요청/응답 데이터를 수집하도록 하기 위해 구성 변수가 저장하는 요청/응답 행 수를 제한하도록 설정할 수 있습니다.

SILKY_MAX_RECORDED_REQUESTS = 10**4

쿼리 분석

DBMS에서 지원하는 경우 쿼리 분석을 활성화하려면 분석 기능을 사용할 수 있습니다.

SILKY_ANALYZE_QUERIES = True

WARNING: 이 설정을 사용하면 백엔드에 따라 데이터베이스가 동일한 쿼리를 두 번 실행할 수 있습니다. 예를 들어 Postgres의 EXPLAIN ANALYZE는 실제로 쿼리를 실행하므로 예기치 않은 데이터 업데이트가 발생할 수 있습니다. 주의해서 True로 설정해주세요.

민감한 정보 마스킹

기본적으로 Silk는 다음 키를 포함하는 값을 필터링합니다(대소문자를 구분하지 않음).

SILKY_SENSITIVE_KEYS = {'username', 'api', 'token', 'key', 'secret', 'password', 'signature'}

추가로 마스킹하고 싶은 정보는 해당 변수에 추가하면 됩니다.

django silk 로그 데이터 삭제

다음 명령어는 기록된 모든 데이터를 삭제합니다.

python manage.py silk_clear_request_log

참고하면 좋은 글

django-silk · PyPI

Leave a Comment

목차