분산 추적 개발 지침
GitLab은 분산 추적에 대한 기계적 지원을 제공합니다. 현재 GitLab의 분산 추적은 실험적으로 간주되며, 아직 GitLab.com에서 대규모로 테스트되지 않았습니다.
Open Tracing에 따르면:
분산 추적은 분산 요청 추적이라고도 하며, 주로 마이크로서비스 아키텍처를 사용하여 구축된 애플리케이션을 프로파일링하고 모니터링하는 데 사용되는 방법입니다. 분산 추적은 실패가 발생하는 위치를 정확하게 파악하고 성능 저하의 원인을 찾는 데 도움이 됩니다.
분산 추적은 GitLab 애플리케이션의 다양한 컴포넌트를 통과하는 요청의 수명 주기를 이해하는 데 특히 도움이 됩니다. 현재 Workhorse, Rails, Sidekiq, Gitaly에서 추적 기구를 지원하고 있습니다.
분산 추적은 비활성화되면 추가 부담이 거의 없지만, 활성화되면 소량의 오버헤드만 부과되므로 프로덕션을 포함한 모든 환경에서 사용할 수 있습니다. 따라서 특히 성능 문제와 같은 프로덕션 문제를 진단하는 데 유용할 수 있습니다.
서비스마다 분산 추적에 대한 지원 수준이 다릅니다. 가장 일반적인 라이브러리에 대한 사전 구성된 기구뿐만 아니라 응용 계층에 사용자 지정 기구 코드를 추가해야 합니다.
서비스별 정보는 다음을 참조하세요:
분산 요청 조사를 위한 상관 ID 사용
GitLab 애플리케이션은 요청의 다양한 컴포넌트 간에 상관 ID를 전달합니다. 상관 ID는 요청 사이의 단일 연결을 나타내는 요청당 고유한 토큰으로, 다른 GitLab 하위 시스템(예: Rails, Workhorse) 간에 단일 요청을 연결하는 데 사용됩니다. 상관 ID가 로그 출력에 포함되어 있기 때문에 엔지니어는 상관 ID를 사용하여 서브시스템 간의 로그를 연결하고 시스템을 통해 요청의 종단 간 경로를 더 잘 이해할 수 있습니다. 요청이 프로세스 경계를 통과할 때 상관 ID가 외부 요청에 삽입되기 때문에 상관 ID가 모든 하위 시스템으로 전파됩니다.
일반적으로 상관 ID는 특정 웹 요청에 대한 Rails 애플리케이션에서 생성됩니다. 일부 사용자 프론트엔드 시스템은 상관 ID를 생성하지 않습니다(예: SSH를 통한 Git 푸시).
상관 ID 작업을 위한 개발자 가이드라인
새 시스템에 추적을 통합할 때 개발자는 상관 ID에 대한 특정 가정을 피해야 합니다. 다음 가이드라인은 GitLab의 모든 하위 시스템에 적용됩니다:
- 상관 ID는 항상 선택 사항입니다.
- 추적 기능이 상위 시스템으로부터의 상관 ID의 존재에 의존하면 안 됩니다.
- 상관 ID는 항상 자유 텍스트입니다.
- 상관 ID는 컨텍스트(예: 사용자 이름 또는 IP 주소)를 전달하는 데 사용해서는 안 됩니다.
- 상관 ID는 _구문 분석_되거나 다른 방법으로 조작해서는 안 됩니다(예: 분할).
LabKit 라이브러리는 GitLab 상관 ID를 다루기 위한 Go 프로그래밍 언어의 표준화된 인터페이스를 제공합니다. LabKit은 추적 및 상관 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 개발 키트에서 Jaeger 사용
GitLab이 지원하는 첫 번째 추적 구현은 Jaeger이며, GitLab Development Kit은 Jaeger를 기본적으로 지원하는 분산 추적을 지원합니다. GDK는 서비스 추가를 위한 GITLAB_TRACING
환경 변수를 자동으로 추가합니다.
gdk.yml
파일을 편집하여 Jaeger를 위한 GDK를 구성하세요. 다음 설정을 추가하세요:
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_static
및 tracer_static_jaeger
빌드 태그를 설정합니다. 이후에 수행되는 모든 변경 사항은 해당 빌드 태그로 다시 빌드해야 합니다. 기본 빌드 태그 집합에 이러한 빌드 태그를 추가하거나 빌드 명령에 직접 추가할 수 있습니다. 예를 들어, Gitaly는 기본적으로 빌드 태그를 추가합니다. 다음 명령을 실행하세요 make all WITH_BUNDLED_GIT=YesPlease BUILD_TAGS="tracer_static tracer_static_jaeger"
.
다시 구성한 후, Jaeger 대시보드는 http://localhost:16686
에서 사용할 수 있습니다. GDK 환경에서 추적에 액세스하는 또 다른 방법은 performance-bar를 통하는 것입니다.
브라우저 창에 p
b
를 입력하여 성능 표시줄을 활성화한 다음 성능 표시줄에서 Trace를 선택하여 Jaeger UI로 이동할 수 있습니다.
Jaeger 검색 UI는 현재 요청의 Correlation-ID
에 대한 쿼리 결과를 반환합니다. 이 검색은 단일 추적 결과를 반환해야 합니다. 이 결과를 선택하면 계층적 타임라인의 추적 내용이 표시됩니다.
GitLab 개발자 키트 없이 Jaeger 사용하기
분산 추적은 문제 해결을 위해 GDK(GitLab Developer Kit) 개발 환경뿐만 아니라 프로덕션 또는 스테이징 환경에서도 활성화할 수 있습니다. 현재 이 기능은 실험적이며 현재 프로덕션 환경에서 지원되지 않습니다. 처음 릴리스에서는 개발 환경에서만 디버깅을 위해 사용되도록 의도되었습니다.
Jaeger 추적은 세 단계의 프로세스를 통해 활성화할 수 있습니다:
- Jaeger 시작.
-
GITLAB_TRACING
환경 변수 구성. - GitLab 애플리케이션 시작](#3-start-the-gitlab-application).
- 브라우저에서 Jaeger 검색 UI 열기.
1. Jaeger 시작
Jaeger에는 많은 구성 옵션이 있지만, 추적 리포지터리로 메모리를 사용하는 “올인원” 모드로 매우 쉽게 시작할 수 있습니다(따라서 비영속적입니다). “올인원” 모드의 주요 장점은 사용 편의성입니다.
자세한 구성 옵션은 Jaeger 설명서를 참조하세요.
Docker 사용
Docker를 사용할 수 있는 경우, Jaeger 올인원을 실행하는 더 쉬운 접근 방식은 다음 명령을 사용하여 Docker를 통해 실행하는 것입니다:
$ 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 없이도 올인원 프로세스를 쉽게 설정할 수 있습니다.
- 해당 플랫폼용 최신 Jaeger 릴리스를 다운로드합니다.
- 아카이브를 추출하고
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를 압축된 thrift 프로토콜을 사용하여 포트 6831 에서 UDP 리스너로 추적 정보를 전송하도록 구성합니다. 이 프로토콜을 사용할 때 Jaeger Client for Ruby에서 일부 문제가 발생했습니다.
|
sampler
| probabilistic
| 확률적 랜덤 샘플러를 사용하도록 Jaeger를 구성합니다. 샘플의 비율은 sampler_param 값을 통해 구성됩니다.
|
sampler_param
| 0.01
|
probabilistic 샘플러를 사용하여 추적의 _1%_을 무작위로 샘플링하도록 0.01 비율을 사용합니다.
|
service_name
| api
| Jaeger 백엔드에서 사용되는 서비스 이름을 재정의합니다. 이 매개변수는 응용 프로그램에서 제공된 값보다 우선합니다. |
GITLAB_TRACING
값을 GitLab 프로세스(Workhorse, Gitaly, Rails 및 Sidekiq 포함)의 환경 변수에 구성해야 합니다.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에서 사용할 수 있습니다.