InfoGrab Docs

상관 ID로 관련 로그 항목 찾기

요약

GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID("상관 ID"라고 함)를 기록합니다. 상관 ID는 구조화된 로그에서 correlation_id 키 아래 기록되고 GitLab이 x-request-id 헤더 아래 보내는 모든 응답 헤더에 기록됩니다.

GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID("상관 ID"라고 함)를 기록합니다. GitLab에 대한 각 개별 요청은 자체 상관 ID를 가지며, 이는 해당 요청에 대한 각 GitLab 컴포넌트의 로그에 기록됩니다. 이를 통해 분산 시스템에서 동작을 추적하기가 더 쉬워집니다. 이 ID 없이는 관련 로그 항목을 매칭하기가 어렵거나 불가능할 수 있습니다.

요청에 대한 상관 ID 식별#

상관 ID는 구조화된 로그에서 correlation_id 키 아래 기록되고 GitLab이 x-request-id 헤더 아래 보내는 모든 응답 헤더에 기록됩니다. 두 위치 중 하나를 검색하여 상관 ID를 찾을 수 있습니다.

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

브라우저의 개발자 도구를 사용하여 방문 중인 사이트의 네트워크 활동을 모니터링하고 검사할 수 있습니다. 널리 사용되는 일부 브라우저의 네트워크 모니터링 문서에 대한 링크는 아래를 참조하세요.

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

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

다음 예시를 참조하세요:

Example correlation ID in Headers section of network request details for HTML document

로그에서 상관 ID 가져오기#

올바른 상관 ID를 찾는 또 다른 접근 방법은 로그를 검색하거나 감시하고 찾고 있는 로그 항목의 correlation_id 값을 찾는 것입니다.

예를 들어 GitLab에서 작업을 재현할 때 무슨 일이 일어나고 있는지 또는 무엇이 중단되는지 알고 싶다면, 사용자별로 요청을 필터링하면서 GitLab 로그를 tail하고 관심 있는 요청이 나올 때까지 기다릴 수 있습니다.

curl에서 상관 ID 가져오기#

curl을 사용하는 경우 verbose 옵션을 사용하여 요청 및 응답 헤더와 기타 디버그 정보를 표시할 수 있습니다.

➜  ~ curl --verbose "https://gitlab.example.com/api/v4/projects"
# look for a line that looks like this
< 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보다 설치 가능성이 높은 greptr만 사용합니다.

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 자체로 줄을 필터링할 수 있습니다. 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(parallel SSH)와 같은 도구를 사용하거나 자체 솔루션을 만들 수 있습니다.

성능 바에서 요청 보기#

성능 바를 사용하여 SQL 및 Gitaly에 대한 호출을 포함한 흥미로운 데이터를 볼 수 있습니다.

데이터를 보려면 요청의 상관 ID가 성능 바를 보는 사용자와 동일한 세션과 일치해야 합니다. API 요청의 경우 인증된 사용자의 세션 쿠키를 사용하여 요청을 수행해야 합니다.

예를 들어 다음 API 엔드포인트에 대해 실행된 데이터베이스 쿼리를 보려면:

https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1

먼저 Developer Tools 패널을 활성화하세요. 이를 수행하는 방법에 대한 자세한 내용은 브라우저에서 상관 ID 가져오기를 참조하세요.

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

  1. 로그인된 상태에서 https://gitlab.com을 방문합니다.
  2. 선택 사항. Developer Tools 패널에서 Fetch/XHR 요청 필터를 선택합니다. 이 단계는 Google Chrome 개발자 도구를 기준으로 설명되며 반드시 필요한 것은 아니지만 올바른 요청을 찾기 쉽게 만들 뿐입니다.
  3. 왼쪽에서 results?request_id=<some-request-id> 요청을 선택합니다.
  4. 세션 쿠키는 Headers 패널의 Request Headers 섹션 아래에 표시됩니다. 쿠키 값을 마우스 오른쪽 버튼으로 클릭하고 값 복사를 선택합니다.

Viewing a session cookie in the Developer Tools panel of a browser

클립보드에 복사된 세션 쿠키 값을 가지고 있습니다. 예를 들어:

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":"Analyzer for images used on live K8S containers based on Starboard"
    },
    "container_registry_image_prefix":"registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning",
    "..."
  ]

응답에는 API 엔드포인트의 데이터와 요청에 대한 상관 ID 식별 섹션에 설명된 대로 x-request-id 헤더에 반환된 correlation_id 값이 포함됩니다.

그런 다음 이 요청의 데이터베이스 세부 정보를 볼 수 있습니다:

  1. x-request-id 값을 성능 바request details 필드에 붙여넣고 Enter/Return을 누릅니다. 이 예시에서는 이전 응답에서 반환된 x-request-id01FGN8P881GF2E5J91JYA338Y3을 사용합니다:

    The request details field of the performance bar containing an example value

  2. 새 요청이 성능 바 오른쪽의 Request Selector 드롭다운 목록에 삽입됩니다. 새 요청을 선택하여 API 요청의 메트릭을 봅니다:

    A highlighted example request in an open Request Selector dropdown list

  3. 진행률 바에서 pg 링크를 선택하여 API 요청이 실행한 데이터베이스 쿼리를 봅니다:

    GitLab API database details: 29ms / 34 queries

    데이터베이스 쿼리 대화 상자가 표시됩니다:

    Database query dialog with 34 SQL queries, 29ms duration, 34 replicas, 4 cached, and sorting options

상관 ID로 관련 로그 항목 찾기

Tier: Free, Premium, Ultimate
Offering: GitLab Self-Managed
원문 보기
요약

GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID("상관 ID"라고 함)를 기록합니다. 상관 ID는 구조화된 로그에서 correlation_id 키 아래 기록되고 GitLab이 x-request-id 헤더 아래 보내는 모든 응답 헤더에 기록됩니다.

GitLab 인스턴스는 대부분의 요청에 대해 고유한 요청 추적 ID("상관 ID"라고 함)를 기록합니다. GitLab에 대한 각 개별 요청은 자체 상관 ID를 가지며, 이는 해당 요청에 대한 각 GitLab 컴포넌트의 로그에 기록됩니다. 이를 통해 분산 시스템에서 동작을 추적하기가 더 쉬워집니다. 이 ID 없이는 관련 로그 항목을 매칭하기가 어렵거나 불가능할 수 있습니다.

요청에 대한 상관 ID 식별#

상관 ID는 구조화된 로그에서 correlation_id 키 아래 기록되고 GitLab이 x-request-id 헤더 아래 보내는 모든 응답 헤더에 기록됩니다. 두 위치 중 하나를 검색하여 상관 ID를 찾을 수 있습니다.

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

브라우저의 개발자 도구를 사용하여 방문 중인 사이트의 네트워크 활동을 모니터링하고 검사할 수 있습니다. 널리 사용되는 일부 브라우저의 네트워크 모니터링 문서에 대한 링크는 아래를 참조하세요.

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

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

다음 예시를 참조하세요:

Example correlation ID in Headers section of network request details for HTML document

로그에서 상관 ID 가져오기#

올바른 상관 ID를 찾는 또 다른 접근 방법은 로그를 검색하거나 감시하고 찾고 있는 로그 항목의 correlation_id 값을 찾는 것입니다.

예를 들어 GitLab에서 작업을 재현할 때 무슨 일이 일어나고 있는지 또는 무엇이 중단되는지 알고 싶다면, 사용자별로 요청을 필터링하면서 GitLab 로그를 tail하고 관심 있는 요청이 나올 때까지 기다릴 수 있습니다.

curl에서 상관 ID 가져오기#

curl을 사용하는 경우 verbose 옵션을 사용하여 요청 및 응답 헤더와 기타 디버그 정보를 표시할 수 있습니다.

➜  ~ curl --verbose "https://gitlab.example.com/api/v4/projects"
# look for a line that looks like this
< 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보다 설치 가능성이 높은 greptr만 사용합니다.

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 자체로 줄을 필터링할 수 있습니다. 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(parallel SSH)와 같은 도구를 사용하거나 자체 솔루션을 만들 수 있습니다.

성능 바에서 요청 보기#

성능 바를 사용하여 SQL 및 Gitaly에 대한 호출을 포함한 흥미로운 데이터를 볼 수 있습니다.

데이터를 보려면 요청의 상관 ID가 성능 바를 보는 사용자와 동일한 세션과 일치해야 합니다. API 요청의 경우 인증된 사용자의 세션 쿠키를 사용하여 요청을 수행해야 합니다.

예를 들어 다음 API 엔드포인트에 대해 실행된 데이터베이스 쿼리를 보려면:

https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1

먼저 Developer Tools 패널을 활성화하세요. 이를 수행하는 방법에 대한 자세한 내용은 브라우저에서 상관 ID 가져오기를 참조하세요.

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

  1. 로그인된 상태에서 https://gitlab.com을 방문합니다.
  2. 선택 사항. Developer Tools 패널에서 Fetch/XHR 요청 필터를 선택합니다. 이 단계는 Google Chrome 개발자 도구를 기준으로 설명되며 반드시 필요한 것은 아니지만 올바른 요청을 찾기 쉽게 만들 뿐입니다.
  3. 왼쪽에서 results?request_id=<some-request-id> 요청을 선택합니다.
  4. 세션 쿠키는 Headers 패널의 Request Headers 섹션 아래에 표시됩니다. 쿠키 값을 마우스 오른쪽 버튼으로 클릭하고 값 복사를 선택합니다.

Viewing a session cookie in the Developer Tools panel of a browser

클립보드에 복사된 세션 쿠키 값을 가지고 있습니다. 예를 들어:

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":"Analyzer for images used on live K8S containers based on Starboard"
    },
    "container_registry_image_prefix":"registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning",
    "..."
  ]

응답에는 API 엔드포인트의 데이터와 요청에 대한 상관 ID 식별 섹션에 설명된 대로 x-request-id 헤더에 반환된 correlation_id 값이 포함됩니다.

그런 다음 이 요청의 데이터베이스 세부 정보를 볼 수 있습니다:

  1. x-request-id 값을 성능 바request details 필드에 붙여넣고 Enter/Return을 누릅니다. 이 예시에서는 이전 응답에서 반환된 x-request-id01FGN8P881GF2E5J91JYA338Y3을 사용합니다:

    The request details field of the performance bar containing an example value

  2. 새 요청이 성능 바 오른쪽의 Request Selector 드롭다운 목록에 삽입됩니다. 새 요청을 선택하여 API 요청의 메트릭을 봅니다:

    A highlighted example request in an open Request Selector dropdown list

  3. 진행률 바에서 pg 링크를 선택하여 API 요청이 실행한 데이터베이스 쿼리를 봅니다:

    GitLab API database details: 29ms / 34 queries

    데이터베이스 쿼리 대화 상자가 표시됩니다:

    Database query dialog with 34 SQL queries, 29ms duration, 34 replicas, 4 cached, and sorting options