분산 추적 개발 지침

GitLab은 분산 추적을 위해 계측되어 있습니다. GitLab에서의 분산 추적은 현재 실험적으로 간주되고 있으며, 아직 GitLab.com에서 대규모로 테스트되지 않았습니다.

Open Tracing에 따르면:

분산 추적, 또는 분산 요청 추적이란, 특히 마이크로서비스 아키텍처를 사용하여 구축된 애플리케이션을 프로파일링하고 모니터링하는 데 사용되는 방법입니다. 분산 추적은 실패가 발생하는 위치를 정확히 파악하고 성능이 나빠지는 원인을 파악하는 데 도움이 됩니다.

분산 추적은 GitLab 애플리케이션의 다른 구성 요소를 통해 요청이 전달되는 과정을 이해하는 데 특히 도움이 됩니다. 현재 Workhorse, Rails, Sidekiq 및 Gitaly에서 추적 계측을 지원합니다.

분산 추적은 비활성화되어 있을 때 추가 부하를 거의 추가하지 않지만 활성화되어 있을 때에는 적은 부하만 부과하므로 제품 환경을 포함한 모든 환경에서 사용할 수 있습니다. 이러한 이유로 제품 문제, 특히 성능 문제를 진단하는 데 유용할 수 있습니다.

서비스별로 분산 추적을 지원하는 수준이 다릅니다. 가장 일반적인 라이브러리에 대한 사전 구축된 계측에 추가하여 애플리케이션 계층에 사용자 정의 계측 코드를 추가해야 합니다.

서비스별 정보는 다음을 참조하세요:

분산 요청 조사를 위한 상관 ID 사용

GitLab 애플리케이션은 요청의 다양한 구성 요소 간에 상관 ID를 전달합니다. 상관 ID는 단일 요청에 고유한 토큰으로, 다른 GitLab 하위 시스템(예: Rails, Workhorse) 간에 단일 요청을 관련시키는 데 사용됩니다. 상관 ID는 로그 출력에 포함되어 있으므로 엔지니어는 상관 ID를 사용하여 다른 하위 시스템의 로그를 관련시키고 시스템을 통한 요청의 종단 간 경로를 더 잘 이해할 수 있습니다. 요청이 프로세스 경계를 통과할 때 상관 ID가 발신 요청에 주입됩니다. 이를 통해 상관 ID가 각 하향식 하위 시스템에 전파됩니다.

상관 ID는 일반적으로 특정 웹 요청에 대한 응답으로 레일 응용 프로그램에서 생성됩니다. 일부 사용자 지향 시스템은 사용자 요청에 대한 응답으로 상관 ID를 생성하지 않습니다(예: SSH를 통한 Git 푸시).

상관 ID 처리를 위한 개발자 지침

새로운 시스템에 추적을 통합할 때, 개발자는 상관 ID에 대한 특정 가정을 피해야 합니다. 다음 지침은 GitLab의 모든 하위 시스템에 적용됩니다:

  • 상관 ID는 항상 선택 사항입니다.
    • 비 추적 기능이 상향 시스템에서의 상관 ID의 존재에 의존하지 않아야 합니다.
  • 상관 ID는 항상 자유 텍스트입니다.
    • 상관 ID는 컨텍스트(예: 사용자 이름 또는 IP 주소)를 전달하는 데 사용해서는 안됩니다.
    • 상관 ID는 절대로 _구문 분석_되거나 다른 방식으로 조작되어서는 안 됩니다(예: 분할).

LabKit 라이브러리는 Go 프로그래밍 언어에서 GitLab 상관 ID를 처리하기위한 표준화된 인터페이스를 제공합니다. LabKit은 Go가 아닌 GitLab 하위 시스템에서 추적 및 상관 ID를 다루는 개발자들에 대한 참조 구현으로 사용할 수 있습니다.

분산 추적 활성화

GitLab은 GITLAB_TRACING 환경 변수를 사용하여 분산 추적을 구성합니다. 모든 구성 요소(예: Workhorse, Rails 등)에 대해 동일한 구성이 사용됩니다.

GITLAB_TRACING가 설정되지 않은 경우 애플리케이션이 계측되지 않으며 아무런 부하가 없습니다.

GITLAB_TRACING를 활성화하려면 다음과 같은 유효한 “구성 문자열” 값을 설정해야 합니다. URL과 유사한 양식을 갖습니다:

GITLAB_TRACING=opentracing://<driver>?<param_name>=<param_value>&<param_name_2>=<param_value_2>

이 예에서는 다음과 같은 가상의 값이 있습니다:

  • driver: Jaeger와 같은 드라이버입니다.
  • param_name, param_value: 이는 드라이버별 구성 값입니다. Jaeger에 대한 구성 매개변수는 이 문서에서 더 자세히 문서화되어 있으며 URL 인코딩되어야 합니다. 여러 값은 URL과 같이 & 문자로 구분되어야 합니다.

GitLab Rails은 요청의 상세한 뷰를 제공하는 일반적인 유형의 작업에 대해 사전 구현 계측을 제공합니다. 그러나 상세한 정보가 따른 결과인 추적은 길고 처리하기 어려울 수 있으며 더 큰 기본 문제를 식별하기 어렵습니다. 이러한 우려에 대응하기 위해 일부 계측은 기본적으로 비활성화되어 있습니다. 이러한 비활성화되어 있는 계측을 활성화하려면 다음과 같은 환경 변수를 설정하세요.

  • GITLAB_TRACING_TRACK_CACHES: 캐시 읽기, 쓰기 또는 삭제와 같은 캐시 작업을 추적합니다.
  • GITLAB_TRACING_TRACK_REDIS: Redis 작업을 추적합니다. 대부분의 Redis 작업은 캐싱용입니다.

GitLab Development Kit에서 Jaeger 사용

GitLab에서 지원하는 최초의 추적 구현은 Jaeger이며, GitLab Development Kit은 Jaeger와 함께 분산 추적을 지원합니다. GDK는 서비스에 GITLAB_TRACING 환경 변수를 자동으로 추가합니다.

gdk.yml 파일을 수정하여 Jaeger를 구성하려면 다음과 같이 설정하세요.

tracer:
  build_tags: tracer_static tracer_static_jaeger
  jaeger:
    enabled: true
    listen_address: 127.0.0.1
    version: 1.43.0

gdk.yml 파일을 수정한 후 gdk reconfigure 명령어를 통해 GDK를 다시 구성하세요. 이를 통해 GDK가 올바르게 구성되어 사용할 수 있습니다.

위의 구성은 첫 번째로 Go로 작성된 서비스를 다시 빌드할 때 tracer_statictracer_static_jaeger 빌드 태그를 설정합니다. 이후에 변경된 내용에 대해 다시 빌드하려면 해당 빌드 태그로 다시 빌드해야 합니다. 다음 중 하나를 수행할 수 있습니다.

  • 기본 빌드 태그 집합에 해당 빌드 태그를 추가합니다.
  • 빌드 명령에 직접 해당 빌드 태그를 추가합니다. 예를 들어 Gitaly는 기본적으로 빌드 태그를 추가하도록 지원합니다. make all WITH_BUNDLED_GIT=YesPlease BUILD_TAGS="tracer_static tracer_static_jaeger"을 실행할 수 있습니다.

재구성한 후에 Jaeger 대시보드는 http://localhost:16686에서 사용할 수 있습니다. GDK 환경에서 추적에 접근하는 또 다른 방법은 성능 바를 통한 추적에 접근하는 것입니다. 이를 위해 브라우저 창에서 p b를 입력하면 됩니다.

성능 바를 활성화한 후 Trace를 선택하여 Jaeger UI로 이동할 수 있습니다.

Jaeger 검색 UI는 현재 요청의 Correlation-ID에 대한 쿼리 결과를 반환합니다. 이 검색은 단일 추적 결과를 반환해야 합니다. 이 결과를 선택하면 계층적 시간 축인에서 추적의 세부 정보를 확인할 수 있습니다.

Jaeger Search UI

GitLab 개발자 키트를 사용하지 않고 Jaeger 사용하기

분산 추적은 문제 해결을 위한 개발 환경 및 프로덕션 또는 스테이징 환경에서 활성화할 수 있습니다. 현재 이 기능은 실험적이며, 현재 프로덕션 환경에서는 지원되지 않습니다. 이번 첫 릴리스에서는 개발 환경에서의 디버깅을 위해 사용할 것을 목표로 합니다.

Jaeger 추적은 다음과 같은 세 단계의 프로세스를 통해 활성화할 수 있습니다.

  1. Jaeger 시작.
  2. GITLAB_TRACING 환경 변수 구성.
  3. GitLab 애플리케이션 시작.
  4. 브라우저에서 Jaeger 검색 UI로 이동.

1. Jaeger 시작

Jaeger에는 많은 구성 옵션이 있지만 “모두 한 곳” 모드로 시작하는 것이 매우 쉽습니다. 이 모드의 주요 장점은 사용 편의성입니다.

자세한 구성 옵션은 Jaeger 설명서를 참조하세요.

Docker 사용

Docker를 사용할 수 있는 경우, Jaeger 모두 한 곳을 실행하는 가장 쉬운 방법은 다음 명령을 사용하는 것입니다.

$ docker run \
  --rm \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411  \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:latest

Jaeger 프로세스 사용

Docker 없이 모두 한 곳 프로세스를 설정하는 것도 간단합니다.

  1. 플랫폼에 맞는 최신 Jaeger 릴리스를 다운로드하세요.
  2. 아카이브를 추출하고 bin/all-in-one 프로세스를 실행하세요.

이렇게 하면 기본 수신 포트에서 프로세스가 시작됩니다.

2. GITLAB_TRACING 환경 변수 구성

Jaeger를 실행한 후 GITLAB_TRACING 변수를 적절한 구성 문자열로 구성하세요.

동일한 호스트에서 모든 것을 실행 중인 경우 다음 값을 사용하세요.

export GITLAB_TRACING="opentracing://jaeger?http_endpoint=http%3A%2F%2Flocalhost%3A14268%2Fapi%2Ftraces&sampler=const&sampler_param=1"

이 구성 문자열은 Jaeger 드라이버 opentracing://jaeger를 사용하며 다음 옵션을 사용합니다.

이름 설명
http_endpoint http://localhost:14268/api/traces Jaeger를 http://localhost:14268/에서 실행 중인 HTTP 엔드포인트로 추적 정보를 전송하도록 구성합니다. 대안으로 upd_endpoint를 사용할 수 있습니다.
sampler const Jaeger를 상수 샘플러(켜거나 끌 수 있음)로 구성합니다.
sampler_param 1 const 샘플러를 사용하여 모든 추적을 샘플링하도록 구성합니다. 0을 사용하면 아무 추적도 샘플링하지 않습니다.

다른 매개변수 값도 가능합니다:

이름 예시 설명
udp_endpoint localhost:6831 이것이 기본값입니다. Jaeger를 compact thrift 프로토콜을 사용하여 포트 6831에서 UDP 수신자로 추적 정보를 전송하도록 구성합니다. 이 프로토콜을 사용할 때 Jaeger Client for Ruby에서 문제가 발생했습니다.
sampler probabilistic Jaeger를 확률적 랜덤 샘플러로 구성합니다. 샘플의 비율은 sampler_param 값으로 구성됩니다.
sampler_param 0.01 probabilistic 샘플러를 사용하여 추적의 _1%_를 랜덤으로 샘플링하도록 구성합니다.
service_name api Jaeger 백엔드에서 사용하는 서비스 이름을 재정의합니다. 이 매개변수는 애플리케이션에서 제공된 값보다 우선합니다.

참고: 동일한 GITLAB_TRACING 값은 Workhorse, Gitaly, Rails 및 Sidekiq를 포함한 모든 GitLab 프로세스의 환경 변수로 구성해야 합니다.

3. GitLab 애플리케이션 시작

GITLAB_TRACING 환경 변수가 모든 GitLab 서비스에 내보내어진 후, 애플리케이션을 시작하세요.

GITLAB_TRACING이 올바르게 구성된 경우, 애플리케이션은 시작 시 이를 로그에 기록합니다.

13:41:53 gitlab-workhorse.1      | 2019/02/12 13:41:53 Tracing enabled
...
13:41:54 gitaly.1                | 2019/02/12 13:41:54 Tracing enabled
...

GITLAB_TRACING이 올바르게 구성되지 않은 경우 다음과 같은 이슈가 로깅됩니다.

13:43:45 gitaly.1                | 2019/02/12 13:43:45 skipping tracing configuration step: tracer: unable to load driver mytracer

기본적으로 GitLab에는 Jaeger 추적기가 제공되지만, 컴파일 시 다른 추적기를 포함할 수도 있습니다. 이에 대한 자세한 내용은 LabKit 추적 설명서에 포함되어 있습니다.

추적에 대한 로그 메시지가 없으면 GITLAB_TRACING 환경 변수가 아마 설정되지 않았을 것입니다.

4. Jaeger 검색 UI 열기

기본적으로 Jaeger 검색 UI는 http://localhost:16686/search에서 사용할 수 있습니다.

참고: Jaeger UI에 나타나기 전에 응용 프로그램을 사용하여 추적을 생성해야 한다는 것을 잊지 마세요.