markdown # 관련 로그 항목을 상관 ID와 함께 찾기

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID(상관 ID로 알려짐)를 기록합니다. GitLab의 각 개별 요청은 자체 상관 ID를 받고, 그런 다음 해당 요청에 대한 각 GitLab 컴포넌트의 로그에 기록됩니다. 이로써 분산 시스템에서의 동작을 추적하는 것이 더 쉬워집니다. 이 ID가 없으면 연관된 로그 항목을 일치시키는 것이 어렵거나 불가능할 수 있습니다.

요청의 상관 ID 식별

상관 ID는 correlation_id 키의 구조화된 로그와 GitLab이 보내는 모든 응답 헤더인 x-request-id 헤더에 기록됩니다. 당신은 두 곳 중 어느 곳에서든 상관 ID를 찾을 수 있습니다.

브라우저에서 상관 ID 가져오기

당신은 방문 중인 사이트의 네트워크 활동을 모니터하고 검사하기 위해 브라우저의 개발자 도구를 사용할 수 있습니다. 몇 가지 인기 있는 브라우저의 네트워크 모니터 문서에서 자세한 내용을 보실 수 있습니다.

관련 요청을 찾아 그 상관 ID를 보려면:

  1. 네트워크 모니터에서 지속적 로깅을 활성화합니다. GitLab의 일부 작업은 양식을 제출한 후에 빨리 리디렉션되므로, 이는 모든 관련 활동을 캡쳐하는 데 도움이 됩니다.
  2. 찾고 있는 요청을 격리하기 위해 문서 요청을 필터링할 수 있습니다.
  3. 추가 세부 정보를 보려면 관심 있는 요청을 선택합니다.
  4. 헤더 섹션으로 이동하여 응답 헤더를 찾습니다. 여기서 요청에 대해 GitLab이 무작위로 생성한 값을 나타내는 x-request-id 헤더를 찾아야 합니다.

다음 예를 참조하세요:

Firefox의 네트워크 모니터에서 요청 ID 헤더 표시

로그에서 상관 ID 가져오기

올바른 상관 ID를 찾는 또 다른 접근법은 로그를 검색하거나 감시하여 찾는 것입니다. 당신이 관심 있는 로그 항목의 correlation_id 값을 찾거나 볼 수 있습니다.

예를 들어, GitLab에서 어떤 동작이나 중단이 발생했을 때 무엇이 일어나는지 알고 싶다면, 당신은 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 사용

이 예시에서는 greptr만을 사용하며, 이들은 대부분의 경우 jq보다 설치되어 있을 가능성이 높습니다.

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를 갖고 있다면, 관련 로그 항목을 검색할 수 있습니다. findgrep를 결합하여 찾고자 하는 항목을 찾는 데 충분합니다.

# 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 가져오기를 참조하십시오.

개발자 도구를 활성화한 후, 다음과 같이 세션 쿠키를 얻습니다:

  1. 로그인한 상태로 https://gitlab.com을 방문합니다.
  2. 개발자 도구 패널에서 Fetch/XHR 요청 필터를 선택합니다. 이 단계는 Google Chrome 개발자 도구에서 설명되었으며 엄격히 필요한 것은 아니지만 올바른 요청을 더 쉽게 찾을 수 있습니다.
  3. 왼쪽에 있는 results?request_id=<some-request-id> 요청을 선택합니다.
  4. 세션 쿠키는 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