Slow Request Log
Slow Request Log (느린 요청 로그) (ops-monitoring-slow-request-log)
검색 요청이 유난히 느릴 때 어떤 쿼리가 지연을 일으키는지 알고 싶어질 때가 있어요. Qdrant의 Slow Request Log가 바로 그 역할을 해줘요. 이 문서에서 이 로그가 무엇을 기록하는지, 어떻게 읽는지, 응답 필드는 어떻게 생겼는지 차근차근 설명해 드릴게요.
출처: Qdrant 공식문서
v1.16.0(beta)부터 사용할 수 있어요. 향후 릴리스에서 동작이 바뀔 수 있어요.
Slow request log는 노드가 시작된 이후 가장 느렸던 고유한 연산들을 기록해요. 어떤 쿼리가 높은 지연 시간의 원인인지 파악하는 데 사용할 수 있죠.
이 로그는 요청 유형별로 최대 32개 항목을 유지해요. 항목은 요청 본문과 컬렉션 이름의 콘텐츠 해시(content hash)로 중복 제거되므로, 동일한 요청이 반복돼도 로그가 중복으로 채워지지 않아요. 로그는 각 요청 패턴이 몇 번 발생했는지 횟수도 세어 둬요. 특정 요청 유형의 큐가 가득 차면, 새 항목은 기존의 가장 빠른 항목보다 오래 걸린 경우에만 그 자리를 대체해요.
이 로그는 메모리에만 존재하고 서버가 재시작되면 초기화돼요. 로그를 읽는 유일한 방법은 REST 엔드포인트를 통해서예요. 배포나 구성 변경 후에는 서버를 재시작해 깨끗한 기준선(baseline)을 확보하는 게 좋아요.
로그는 노드별로 존재해요. 각 노드는 자신의 로컬 샤드에서 일어난 연산을 추적하죠. 한 노드에서 로그를 조회하면 그 노드의 데이터만 반환돼요. 클러스터 전반의 느린 요청에 대한 완전한 그림을 얻으려면 각 노드를 따로 조회하고 결과를 집계해야 해요.
Slow Request Log는 기본적으로 활성화되어 있고 비활성화할 수 없어요.
무엇이 기록되나요 (What Gets Captured)
로그는 50ms보다 오래 걸리는 샤드 레벨 연산을 기록해요. 다음 연산 유형이 추적돼요.
core_search와query_batchcountretrievefacet- upsert, delete 같은 쓰기 연산
로그 읽기 (Reading the Log)
GET /profiler/slow_requests는 로그의 현재 상태를 반환해요. 이 엔드포인트는 manage 접근 권한이 필요하고 REST API로만 제공돼요.
쿼리 파라미터:
| Parameter | Default | Description |
|---|---|---|
limit |
10 | 반환할 최대 항목 수예요. |
request |
— | 요청 유형에 대한 부분 문자열(substring) 필터예요. 예를 들어 search는 검색 연산만 반환해요. |
# 모든 유형에서 가장 느린 상위 10개 요청
curl http://YOUR_NODE_URL:6333/profiler/slow_requests \
-H "api-key: your-api-key"
# 검색 요청 중 가장 느린 상위 20개만
curl "http://YOUR_NODE_URL:6333/profiler/slow_requests?limit=20&request=search" \
-H "api-key: your-api-key"
응답 필드 (Response Fields)
응답의 각 항목에는 다음 필드가 포함돼요.
| Field | Description |
|---|---|
collection_name |
요청이 실행된 컬렉션이에요. |
duration |
요청 시간(초 단위)이에요. |
datetime |
요청의 타임스탬프예요. |
request_name |
연산 유형이에요. 예: core_search. |
approx_count |
시작 이후 이 요청 패턴이 관찰된 대략적인 횟수예요. |
cpu_usage_ratio |
요청 중 CPU 사용률이에요(선택 사항). |
request_body |
전체 요청을 JSON으로 표현한 값이에요. |
결과는 가장 느린 것부터 정렬되고, 그다음 limit만큼 잘려서 반환돼요.