markdown # 관련 로그 항목과 상관 ID 찾기
GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID(상관 ID)를 기록합니다. 각각의 GitLab 요청은 고유한 상관 ID를 받아 해당 요청에 대한 각 GitLab 구성요소 로그에 기록됩니다. 이로써 분산 시스템에서의 동작을 추적하기가 수월해집니다. 이 ID 없이 대응되는 로그 항목을 찾는 것은 어렵거나 불가능할 수 있습니다.
요청의 상관 ID 식별
상관 ID는 correlation_id
키가 있는 구조화된 로그 및 GitLab이 전송하는 모든 응답 헤더인 x-request-id
에 기록됩니다.
상관 ID는 이 두 위치에서 검색하여 찾을 수 있습니다.
브라우저에서 상관 ID 가져오기
방문 중인 사이트의 네트워크 활동을 모니터링하고 검사하기 위해 브라우저의 개발자 도구를 사용할 수 있습니다. 인기 있는 브라우저에 대한 네트워크 모니터링 문서에 대한 링크는 아래에서 확인할 수 있습니다.
- Network Monitor - Firefox Developer Tools
- Inspect Network Activity In Chrome DevTools
- Safari Web Development Tools
- Microsoft Edge Network panel
관련 요청을 찾아 상관 ID를 확인하려면:
- 네트워크 모니터에서 지속적인 로깅을 활성화합니다. GitLab에서 양식을 제출한 후 신속하게 리디렉션되는 경우가 있으므로, 이렇게 하면 관련 활동을 모두 캡처할 수 있습니다.
- 찾고 있는 요청을 분리하기 위해
document
요청을 필터링할 수 있습니다. - 관심 있는 요청을 선택하여 자세한 내용을 확인합니다.
-
헤더 섹션으로 이동하여 응답 헤더를 찾습니다. 여기에서 GitLab이 요청에 대해 임의로 생성한 값인
x-request-id
헤더를 찾을 수 있어야 합니다.
다음과 같은 예시를 참조하세요:
로그에서 상관 ID 가져오기
올바른 상관 ID를 찾는 다른 방법은 로그를 검색하거나 모니터링하여 관심 있는 로그 항목의 correlation_id
값을 찾는 것입니다.
예를 들어, GitLab에서 특정 작업을 재현할 때 무슨 일이 일어나고 있는지 알아보고 싶다고 가정해보겠습니다. 그렇다면 사용자의 요청으로부터 로그를 추출하여 관심 있는 요청이 나타날 때까지 해당 요청을 관찰할 수 있습니다.
curl에서 상관 ID 가져오기
만약 curl
을 사용 중이라면, 요청 및 응답 헤더와 다른 디버그 정보를 표시하기 위해 verbose 옵션을 사용할 수 있습니다.
➜ ~ curl --verbose "https://gitlab.example.com/api/v4/projects"
# 다음과 같은 줄을 찾아보세요
< x-request-id: 4rAMkV3gof4
jq 사용
이 예시는 jq를 사용하여 결과를 필터링하고 우리가 주로 관심을 가질 만한 값을 표시합니다.
sudo gitlab-ctl tail gitlab-rails/production_json.log | jq 'select(.username == "bob") | "User: \(.username), \(.method) \(.path), \(.controller)#\(.action), ID: \(.correlation_id)"'
"User: bob, GET /root/linux, ProjectsController#show, ID: U7k7fh6NpW3"
"User: bob, GET /root/linux/commits/master/signatures, Projects::CommitsController#signatures, ID: XPIHpctzEg1"
"User: bob, GET /root/linux/blob/master/README, Projects::BlobController#show, ID: LOt9hgi1TV4"
grep 사용
이 예시는 jq
보다 더 일반적으로 설치되어 있는 grep
와 tr
을 사용합니다.
sudo gitlab-ctl tail gitlab-rails/production_json.log | grep '"username":"bob"' | tr ',' '\n' | egrep 'method|path|correlation_id'
{"method":"GET"
"path":"/root/linux"
"username":"bob"
"correlation_id":"U7k7fh6NpW3"}
{"method":"GET"
"path":"/root/linux/commits/master/signatures"
"username":"bob"
"correlation_id":"XPIHpctzEg1"}
{"method":"GET"
"path":"/root/linux/blob/master/README"
"username":"bob"
"correlation_id":"LOt9hgi1TV4"}
상관 ID로 로그 검색하기
상관 ID를 확인했다면, 관련 로그 항목을 검색할 수 있습니다.
find
및 grep
을 결합하면 찾고 있는 항목들을 찾을 수 있어야 합니다.
# find <gitlab log directory> -type f -mtime -0 exec grep '<correlation ID>' '{}' '+'
find /var/log/gitlab -type f -mtime 0 -exec grep 'LOt9hgi1TV4' '{}' '+'
/var/log/gitlab/gitlab-workhorse/current:{"correlation_id":"LOt9hgi1TV4","duration_ms":2478,"host":"gitlab.domain.tld","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"https://gitlab.domain.tld/root/linux","remote_addr":"68.0.116.160:0","remote_ip":"[filtered]","status":200,"system":"http","time":"2019-09-17T22:17:19Z","uri":"/root/linux/blob/master/README?format=json\u0026viewer=rich","user_agent":"Mozilla/5.0 (Mac) Gecko Firefox/69.0","written_bytes":1743}
/var/log/gitlab/gitaly/current:{"correlation_id":"LOt9hgi1TV4","grpc.code":"OK","grpc.meta.auth_version":"v2","grpc.meta.client_name":"gitlab-web","grpc.method":"FindCommits","grpc.request.deadline":"2019-09-17T22:17:47Z","grpc.request.fullMethod":"/gitaly.CommitService/FindCommits","grpc.request.glProjectPath":"root/linux","grpc.request.glRepository":"project-1","grpc.request.repoPath":"@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.git","grpc.request.repoStorage":"default","grpc.request.topLevelGroup":"@hashed","grpc.service":"gitaly.CommitService","grpc.start_time":"2019-09-17T22:17:17Z","grpc.time_ms":2319.161,"level":"info","msg":"finished streaming call with code OK","peer.address":"@","span.kind":"server","system":"grpc","time":"2019-09-17T22:17:19Z"}
/var/log/gitlab/gitlab-rails/production_json.log:{"method":"GET","path":"/root/linux/blob/master/README","format":"json","controller":"Projects::BlobController","action":"show","status":200,"duration":2448.77,"view":0.49,"db":21.63,"time":"2019-09-17T22:17:19.800Z","params":[{"key":"viewer","value":"rich"},{"key":"namespace_id","value":"root"},{"key":"project_id","value":"linux"},{"key":"id","value":"master/README"}],"remote_ip":"[filtered]","user_id":2,"username":"bob","ua":"Mozilla/5.0 (Mac) Gecko Firefox/69.0","queue_duration":3.38,"gitaly_calls":1,"gitaly_duration":0.77,"rugged_calls":4,"rugged_duration_ms":28.74,"correlation_id":"LOt9hgi1TV4"}
### 분산 아키텍처에서의 검색
GitLab 인프라에서 수평 확장을 수행했다면 _모든_ GitLab 노드를 통해 검색해야 합니다. Loki, ELK, Splunk 또는 기타 유형의 로그 집계 소프트웨어를 사용하여 이 작업을 수행할 수 있습니다.
병렬로 서버 전체에 동일한 명령을 실행할 수 있는 Ansible이나 PSSH(병렬 SSH)와 같은 도구를 사용하거나 고유한 솔루션을 만들 수 있습니다.
### 성능 막대에서 요청 보기
[성능 막대](../monitoring/performance/performance_bar.md)를 사용하여 SQL 및 Gitaly 호출을 포함한 흥미로운 데이터를 볼 수 있습니다.
데이터를 보려면 요청의 상관 ID가 성능 막대를 보는 사용자의 세션과 일치해야 합니다. API 요청의 경우, 이는 인증된 사용자의 세션 쿠키를 사용하여 요청을 수행해야 함을 의미합니다.
예를 들어, 다음 API 엔드포인트에 대해 실행된 데이터베이스 쿼리를 보려는 경우:
```shell
https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1
먼저 개발자 도구 패널을 활성화합니다. 자세한 내용은 브라우저에서 상관 ID 가져오기를 참조하십시오.
개발자 도구를 활성화한 후, 다음과 같이 세션 쿠키를 가져옵니다:
- 로그인한 상태에서 https://gitlab.com을 방문합니다.
- 개발자 도구 패널에서 선택 사항입니다. 이 단계는 Google Chrome 개발자 도구를 위한 것으로 엄격히 필수적이지 않지만 올바른 요청을 찾기가 더 쉬워집니다.
- 왼쪽에 있는
results?request_id=<some-request-id>
요청을 선택합니다. - 세션 쿠키는
Headers
패널의Request Headers
섹션에 표시됩니다. 쿠키 값을 마우스 오른쪽 버튼으로 클릭하고Copy value
를 선택합니다.
클립보드에 세션 쿠키의 값을 복사했습니다. 예를 들어:
experimentation_subject_id=<subject-id>; _gitlab_session=<session-id>; event_filter=all; visitor_id=<visitor-id>; perf_bar_enabled=true; sidebar_collapsed=true; diff_view=inline; sast_entry_point_dismissed=true; auto_devops_settings_dismissed=true; cf_clearance=<cf-clearance>; collapsed_gutter=false; frequently_used_emojis=clap,thumbsup,rofl,tada,eyes,bow
curl
요청의 사용자 지정 헤더에 이 값을 붙여 API 요청을 생성합니다:
$ curl --include "https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1" \
--header 'cookie: experimentation_subject_id=<subject-id>; _gitlab_session=<session-id>; event_filter=all; visitor_id=<visitor-id>; perf_bar_enabled=true; sidebar_collapsed=true; diff_view=inline; sast_entry_point_dismissed=true; auto_devops_settings_dismissed=true; cf_clearance=<cf-clearance>; collapsed_gutter=false; frequently_used_emojis=clap,thumbsup,rofl,tada,eyes,bow'
date: Tue, 28 Sep 2021 03:55:33 GMT
content-type: application/json
...
x-request-id: 01FGN8P881GF2E5J91JYA338Y3
...
[
{
"id":27497069,
"description":"Starboard를 기반으로 하는 실시간 K8S 컨테이너에 사용된 이미지에 대한 분석기"
},
"container_registry_image_prefix":"registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning",
"..."
]
응답에는 API 엔드포인트에서의 데이터와 x-request-id
헤더에서 반환된 correlation_id
값이 포함되어 있습니다. 이는 요청의 상관 ID 식별 섹션에서 설명된 것과 동일합니다.
그런 다음 이 요청에 대한 데이터베이스 세부 정보를 볼 수 있습니다:
-
성능 막대의
요청 세부 정보
필드에x-request-id
값을 붙여넣고 Enter/Return을 누릅니다. 이 예에서는 위 응답에서 반환된x-request-id
값01FGN8P881GF2E5J91JYA338Y3
을 사용합니다. -
새 요청이
성능 막대
오른쪽에 있는요청 선택기
드롭다운 디렉터리에 삽입됩니다. API 요청의 메트릭을 보려면 새 요청을 선택합니다. -
성능 막대
의pg
링크를 선택하여 API 요청에 의해 실행된 데이터베이스 쿼리를 볼 수 있습니다:데이터베이스 쿼리 대화 상자가 표시됩니다: