- 분산 요청 조사를 위한 상관 ID 사용
- 분산 추적 활성화
- GitLab Development Kit에서 Jaeger 사용
- GitLab 개발자 키트를 사용하지 않고 Jaeger 사용하기
분산 추적 개발 지침
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_static
및 tracer_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
에 대한 쿼리 결과를 반환합니다. 이 검색은 단일 추적 결과를 반환해야 합니다. 이 결과를 선택하면 계층적 시간 축인에서 추적의 세부 정보를 확인할 수 있습니다.
GitLab 개발자 키트를 사용하지 않고 Jaeger 사용하기
분산 추적은 문제 해결을 위한 개발 환경 및 프로덕션 또는 스테이징 환경에서 활성화할 수 있습니다. 현재 이 기능은 실험적이며, 현재 프로덕션 환경에서는 지원되지 않습니다. 이번 첫 릴리스에서는 개발 환경에서의 디버깅을 위해 사용할 것을 목표로 합니다.
Jaeger 추적은 다음과 같은 세 단계의 프로세스를 통해 활성화할 수 있습니다.
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 없이 모두 한 곳 프로세스를 설정하는 것도 간단합니다.
- 플랫폼에 맞는 최신 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를 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에 나타나기 전에 응용 프로그램을 사용하여 추적을 생성해야 한다는 것을 잊지 마세요.