관련 로그 항목을 상관 ID로 찾기
GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID(이른바 “상관 ID”)를 기록합니다. GitLab에 대한 각 개별 요청은 자체 상관 ID를 갖게 되며, 이는 해당 요청에 대한 각 GitLab 구성 요소의 로그에 기록됩니다. 이를 통해 분산 시스템에서의 동작을 추적하기가 더 쉬워집니다. 이 ID 없이는 상관 로그 항목을 일치시키기가 어렵거나 불가능할 수 있습니다.
요청의 상관 ID 식별하기
상관 ID는 correlation_id
키 아래의 구조화된 로그와, GitLab이 전송하는 모든 응답 헤더의 x-request-id
헤더에 기록됩니다. 두 곳 모두에서 검색하여 상관 ID를 찾을 수 있습니다.
브라우저에서 상관 ID 얻기
브라우저의 개발자 도구를 사용하여 방문 중인 사이트와의 네트워크 활동을 모니터링하고 검사할 수 있습니다. 인기 있는 브라우저에 대한 네트워크 모니터링 문서는 아래 링크를 참조하세요.
관련 요청을 찾고 그 요청의 상관 ID를 보려면:
- 네트워크 모니터에서 지속 로그 기록을 활성화합니다. GitLab의 일부 작업은 양식을 제출한 후 빠르게 리다이렉트되므로, 모든 관련 활동을 캡처하는 데 도움이 됩니다.
- 찾고 있는 요청을 분리하기 위해
document
요청으로 필터링할 수 있습니다. - 관심 있는 요청을 선택하여 더 많은 세부 정보를 봅니다.
-
Headers 섹션으로 가서 Response Headers를 찾습니다. 거기에서 GitLab이 요청을 위해 무작위로 생성한 값을 가진
x-request-id
헤더를 찾아야 합니다.
다음 예제를 참조하세요:
로그에서 상관 ID 얻기
올바른 상관 ID를 찾는 또 다른 접근 방법은 로그를 검색하거나 시청하여 찾고 있는 로그 항목의 correlation_id
값을 찾는 것입니다.
예를 들어, GitLab에서 작업을 재현할 때 무슨 일이 일어나고 있는지 또는 문제가 발생하는지를 알고 싶다고 가정해 보겠습니다. GitLab 로그를 tail하여, 사용자의 요청을 필터링하고, 관심 있는 요청을 볼 때까지 요청을 관찰할 수 있습니다.
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를 가지고 있으면 관련 로그 항목을 검색할 수 있습니다.
상관 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)를 사용하여
서버에서 동일한 명령을 병렬로 실행하거나
자체 솔루션을 만들 수 있습니다.
성능 바에서 요청 보기
성능 바를 사용하여 SQL 및 Gitaly에 대한 호출을 포함한 흥미로운 데이터를 볼 수 있습니다.
데이터를 보려면 요청의 상관 ID가 성능 바를 보는 사용자와 동일한 세션과 일치해야 합니다.
API 요청의 경우, 이는 인증된 사용자의 세션 쿠키를 사용하여 요청을 수행해야 함을 의미합니다.
예를 들어, 다음 API 엔드포인트에 대해 실행된 데이터베이스 쿼리를 보려면:
https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1
먼저, 개발자 도구 패널을 활성화합니다.
이는 브라우저에서 상관 ID 가져오기에서 활성화하는 방법에 대한 자세한 정보를 참조하세요.
개발자 도구가 활성화되면, 다음과 같이 세션 쿠키를 얻습니다:
- 로그인한 상태에서 https://gitlab.com에 방문합니다.
- 선택 사항입니다. 개발자 도구 패널에서 Fetch/XHR 요청 필터를 선택합니다. 이 단계는 Google Chrome 개발자 도구에 대해 설명되어 있으며, 반드시 필요한 것은 아니지만 올바른 요청을 찾는 데 더 쉽습니다.
- 왼쪽 패널에서
results?request_id=<some-request-id>
요청을 선택합니다. -
Headers
패널의Request Headers
섹션에서 세션 쿠키가 표시됩니다. 쿠키 값을 마우스 오른쪽 버튼으로 클릭하고값 복사
를 선택합니다.
이제 세션 쿠키의 값을 클립보드에 복사했습니다. 예를 들면:
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
세션 쿠키의 값을 사용하여 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'
date: Tue, 28 Sep 2021 03:55:33 GMT
content-type: application/json
...
x-request-id: 01FGN8P881GF2E5J91JYA338Y3
...
[
{
"id":27497069,
"description":"실제 K8S 컨테이너에서 사용되는 이미지를 위한 분석기"
},
"container_registry_image_prefix":"registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning",
"..."
]
응답에는 API 엔드포인트의 데이터와 함께, 요청에 대한 상관 ID 식별하기 섹션에서 설명한 바와 같이 x-request-id
헤더에 반환된 correlation_id
값이 포함되어 있습니다.
그 후, 다음 단계에서 이 요청에 대한 데이터베이스 세부 정보를 볼 수 있습니다:
-
x-request-id
값을 성능 바의request details
필드에 붙여넣고 Enter/Return을 누릅니다. 이 예제에서는 위 응답에 의해 반환된x-request-id
값01FGN8P881GF2E5J91JYA338Y3
를 사용합니다: -
성능 바의 오른쪽에 있는
Request Selector
드롭다운 목록에 새로운 요청이 삽입됩니다. 새로운 요청을 선택하여 API 요청의 메트릭을 봅니다: -
진행 바의
pg
링크를 선택하여 API 요청에 의해 실행된 데이터베이스 쿼리를 봅니다:데이터베이스 쿼리 대화 상자가 표시됩니다: