Prometheus로 GitLab 모니터링
Prometheus는 유연한 플랫폼을 제공하여 GitLab 및 기타 소프트웨어 제품을 모니터링하는 강력한 시계열 모니터링 서비스입니다.
GitLab은 Prometheus와 함께 기본 제공 모니터링을 제공하여 높은 품질의 시계열 모니터링에 접근할 수 있습니다.
이 페이지에 나열된 Prometheus와 다양한 익스포터는 Linux 패키지에 번들로 제공됩니다. 각 익스포터가 추가된 시기에 대한 타임라인은 해당 익스포터의 문서를 확인하세요. 소스 코드로 설치하는 경우 직접 설치해야 합니다. 이후 릴리스에서는 추가로 GitLab 메트릭이 캡처됩니다.
Prometheus 서비스는 기본적으로 실행됩니다.
Prometheus 및 해당 익스포터는 사용자를 인증하지 않으며, 해당 서비스에 액세스할 수 있는 모든 사용자에게 사용 가능합니다.
Prometheus 작동 방식
Prometheus는 주기적으로 데이터 소스에 연결하여 다양한 익스포터를 통해 성능 메트릭을 수집합니다. 모니터링 데이터를 보거나 작업하려면 Prometheus에 직접 연결하거나 Grafana와 같은 대시보드 도구를 사용할 수 있습니다.
Prometheus 구성
소스 코드로 설치하는 경우 직접 설치 및 구성해야 합니다.
Prometheus와 해당 익스포터는 기본적으로 실행됩니다.
Prometheus는 gitlab-prometheus
사용자로 실행되며 http://localhost:9090
에서 수신 대기합니다. 기본적으로 Prometheus는 GitLab 서버 자체에서만 액세스할 수 있습니다. 각 익스포터는 Prometheus의 모니터링 대상으로 자동 설정됩니다(개별적으로 비활성화하지 않는 한).
Prometheus 및 이에 대한 모든 익스포터를 비활성화하려면 다음을 수행하세요.
-
/etc/gitlab/gitlab.rb
파일 편집 -
다음 라인을 찾거나 추가하여
false
로 설정하세요:prometheus_monitoring['enable'] = false sidekiq['metrics_enabled'] = false # 기본적으로 'false'로 설정되어 있지만 명시적으로 비활성화하여 확실하게 설정할 수 있습니다 puma['exporter_enabled'] = false
- 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.
Prometheus 수신 대기 포트 및 주소 변경
GitLab 서버 외부에서 Prometheus에 액세스하려면, Prometheus가 수신 대기하는 주소/포트를 변경하세요.
-
/etc/gitlab/gitlab.rb
파일 편집 -
다음 라인을 찾거나 추가하세요:
prometheus['listen_address'] = 'localhost:9090'
localhost:9090
을 Prometheus가 수신 대기할 주소 또는 포트로 교체하세요.localhost
외의 호스트에서 Prometheus에 액세스하려면 호스트를 제외하거나0.0.0.0
을 사용하여 공용 액세스를 허용하세요:prometheus['listen_address'] = ':9090' # 또는 prometheus['listen_address'] = '0.0.0.0:9090'
- 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.
사용자 정의 스크래이프 구성 추가
Linux 패키지로 번들된 Prometheus에 대한 추가 스크래이프 대상을 구성할 수 있습니다. 이를 위해 /etc/gitlab/gitlab.rb
의 prometheus['scrape_configs']
를 수정하고 Prometheus 스크래이프 대상 구성 구문을 사용하세요.
다음은 다음을 스크래이핑하는 예제 구성입니다: http://1.1.1.1:8060/probe?param_a=test¶m_b=additional_test
prometheus['scrape_configs'] = [
{
'job_name': 'custom-scrape',
'metrics_path': '/probe',
'params' => {
'param_a' => ['test'],
'param_b' => ['additional_test'],
},
'static_configs' => [
'targets' => ['1.1.1.1:8060'],
],
},
]
Linux 패키지를 사용한 독립형 Prometheus
Linux 패키지를 사용하여 Prometheus와 Grafana가 실행되는 독립형 모니터링 노드를 구성할 수 있습니다. 독립형 모니터링 노드는 여러 노드를 갖는 GitLab 배포에 권장됩니다.
다음 단계는 Linux 패키지를 사용하여 Prometheus와 Grafana가 실행되는 모니터링 노드를 구성하는 데 필요한 최소한의 단계입니다.
- 모니터링 노드에 SSH로 연결합니다.
- 다운로드 페이지에서 GitLab 다운로드 페이지에서 단계 1과 2를 사용하여 원하는 Linux 패키지를 설치하지만, 나머지 단계는 따르지 마세요.
- 다음 단계에서는 Consul 서버 노드의 IP 주소 또는 DNS 레코드를 수집하세요.
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 내용을 추가하세요:roles ['monitoring_role'] external_url 'http://gitlab.example.com' # Prometheus prometheus['listen_address'] = '0.0.0.0:9090' prometheus['monitor_kubernetes'] = false # Grafana grafana['enable'] = true grafana['admin_password'] = 'toomanysecrets' grafana['disable_login_form'] = false # Prometheus를 위한 서비스 검색 활성화 consul['enable'] = true consul['monitoring_service_discovery'] = true consul['configuration'] = { retry_join: %w(10.0.0.1 10.0.0.2 10.0.0.3), # 주소는 IP 또는 FQDN일 수 있습니다 } # Nginx - Grafana 액세스를 위한 nginx['enable'] = true
- 구성을 컴파일하려면
sudo gitlab-ctl reconfigure
를 실행하세요.
다음 단계는 모든 다른 노드에 모니터링 노드의 위치를 알려주는 것입니다:
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 라인을 추가하거나 찾아서 주석을 제거하세요:# FQDN 또는 IP가 될 수 있습니다 gitlab_rails['prometheus_address'] = '10.0.0.1:9090'
여기서
10.0.0.1:9090
은 Prometheus 노드의 IP 주소와 포트입니다. -
파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.
서비스 검색을 사용하여 모니터링을 활성화하게 되면 /etc/gitlab/gitlab.rb
에서 prometheus['scrape_configs']
가 설정되어 있지 않은지 확인하세요. consul['monitoring_service_discovery'] = true
과 prometheus['scrape_configs']
를 동시에 /etc/gitlab/gitlab.rb
에서 설정하면 오류가 발생합니다.
외부 Prometheus 서버 사용하기
외부 Prometheus 서버로부터 GitLab을 모니터링하도록 허용하려면 몇 가지 구성 변경이 필요합니다.
외부 Prometheus 서버를 사용하려면:
-
/etc/gitlab/gitlab.rb
파일을 편집합니다. -
번들된 Prometheus를 비활성화합니다:
prometheus['enable'] = false
-
각 번들된 서비스의 익스포터를 네트워크 주소에서 수신하도록 설정하세요. 예를 들어:
node_exporter['listen_address'] = '0.0.0.0:9100' gitlab_workhorse['prometheus_listen_addr'] = "0.0.0.0:9229" # Rails 노드 gitlab_exporter['listen_address'] = '0.0.0.0' gitlab_exporter['listen_port'] = '9168' registry['debug_addr'] = '0.0.0.0:5001' # Sidekiq 노드 sidekiq['listen_address'] = '0.0.0.0' # Redis 노드 redis_exporter['listen_address'] = '0.0.0.0:9121' # PostgreSQL 노드 postgres_exporter['listen_address'] = '0.0.0.0:9187' # Gitaly 노드 gitaly['configuration'] = { # ... prometheus_listen_addr: '0.0.0.0:9236', } # Pgbouncer 노드 pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
- 필요한 경우 공식 설치 안내를 사용하여 전용 Prometheus 인스턴스를 설치하고 설정합니다.
-
모든 GitLab Rails (Puma, Sidekiq) 서버에서 Prometheus 서버 IP 주소 및 수신 포트를 설정하세요. 예를 들어:
gitlab_rails['prometheus_address'] = '192.168.0.1:9090'
-
NGINX 메트릭을 수집하려면 Prometheus 서버 IP를 허용하도록 NGINX를 구성해야 합니다. 예를 들어:
nginx['status']['options'] = { "server_tokens" => "off", "access_log" => "off", "allow" => "192.168.0.1", "deny" => "all", }
여러 개의 Prometheus 서버가 있는 경우 IP 주소를 여러 개 지정할 수도 있습니다:
nginx['status']['options'] = { "server_tokens" => "off", "access_log" => "off", "allow" => ["192.168.0.1", "192.168.0.2"], "deny" => "all", }
-
Prometheus 서버가 GitLab 메트릭 엔드포인트에서 데이터를 수집할 수 있도록, Prometheus 서버 IP 주소를 모니터링 IP 허용 디렉터리에 추가하세요:
gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '192.168.0.1']
- 각 번들된 서비스의 익스포터를 네트워크 주소에서 수신하도록 설정하였기 때문에, 인스턴스의 방화벽을 프로메테우스 IP로부터의 트래픽만 해당 익스포터로 허용하도록 업데이트하세요. 익스포터 서비스 및 해당 포트의 전체 참조 디렉터리은 여기에서 찾을 수 있습니다.
- 변경 사항을 적용하기 위해 GitLab을 재구성하세요.
- Prometheus 서버의 구성 파일을 편집하세요.
-
각 노드의 익스포터를 Prometheus 서버의 수집 대상 구성에 추가하세요. 예를 들어,
static_configs
를 사용한 샘플 스니펫:scrape_configs: - job_name: nginx static_configs: - targets: - 1.1.1.1:8060 - job_name: redis static_configs: - targets: - 1.1.1.1:9121 - job_name: postgres static_configs: - targets: - 1.1.1.1:9187 - job_name: node static_configs: - targets: - 1.1.1.1:9100 - job_name: gitlab-workhorse static_configs: - targets: - 1.1.1.1:9229 - job_name: gitlab-rails metrics_path: "/-/metrics" scheme: https static_configs: - targets: - 1.1.1.1 - job_name: gitlab-sidekiq static_configs: - targets: - 1.1.1.1:8082 - job_name: gitlab_exporter_database metrics_path: "/database" static_configs: - targets: - 1.1.1.1:9168 - job_name: gitlab_exporter_sidekiq metrics_path: "/sidekiq" static_configs: - targets: - 1.1.1.1:9168 - job_name: gitaly static_configs: - targets: - 1.1.1.1:9236 - job_name: registry static_configs: - targets: - 1.1.1.1:5001
스니펫의gitlab-rails
작업은 GitLab이 HTTPS를 통해 접근 가능한 것으로 가정합니다. 만약 귀하의 배포가 HTTPS를 사용하지 않는다면, 작업 구성을http
스키마와 포트 80을 사용하도록 조정합니다. - Prometheus 서버를 다시 로드하세요.
저장 보존 크기 구성하기
Prometheus에는 로컬 리포지터리를 구성하는 데 사용되는 여러 사용자 정의 플래그가 있습니다:
-
storage.tsdb.retention.time
: 오래된 데이터를 제거할 시간을 지정합니다. 기본값은15d
입니다. 이 플래그가 기본값과 다른 값으로 설정되면storage.tsdb.retention
을 재정의합니다. -
storage.tsdb.retention.size
: (실험적) 유지할 리포지터리 블록의 최대 바이트 수를 지정합니다. 가장 오래된 데이터가 먼저 제거됩니다. 기본값은0
입니다(비활성화됨). 이 플래그는 실험적이며 향후 릴리스에서 변경될 수 있습니다. 지원되는 단위:B
,KB
,MB
,GB
,TB
,PB
,EB
. 예:512MB
.
저장 보존 크기를 구성하려면:
-
/etc/gitlab/gitlab.rb
파일을 편집합니다:prometheus['flags'] = { 'storage.tsdb.path' => "/var/opt/gitlab/prometheus/data", 'storage.tsdb.retention.time' => "7d", 'storage.tsdb.retention.size' => "2GB", 'config.file' => "/var/opt/gitlab/prometheus/prometheus.yml" }
-
GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
성능 지표 보기
기본적으로 Prometheus가 제공하는 대시보드를 볼 수 있도록 http://localhost:9090
을 방문할 수 있습니다.
만약 GitLab의 SSL이 활성화된 경우, 동일한 FQDN을 사용하여 GitLab과 같은 브라우저에서 HSTS(HTTP Strict Transport Security) 때문에 Prometheus에 액세스할 수 없을 수 있습니다. GitLab을 통해 액세스하도록 제공하는 테스트 프로젝트가 있지만, 우회 방법을 사용해야 할 수 있습니다: 별도의 FQDN 사용, 서버 IP 사용, Prometheus용 별도 브라우저 사용, HSTS 재설정 또는 NGINX가 이를 프록시하는 방법 등이 있습니다.
Prometheus가 수집한 성능 데이터는 직접 Prometheus 콘솔이나 호환되는 대시보드 도구를 통해 볼 수 있습니다. Prometheus 인터페이스는 수집된 데이터를 다루는 유연한 쿼리 언어를 제공하여 결과를 시각화할 수 있는 환경을 제공합니다. 더 다양한 기능을 제공하는 대시보드를 원한다면, Prometheus를 위한 공식 지원을 제공하는 Grafana를 사용할 수 있습니다.
샘플 Prometheus 쿼리:
-
% 사용 가능 메모리:
((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) 또는 ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes)) * 100
-
% CPU 사용률:
1 - avg without (mode,cpu) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
-
전송된 데이터:
rate(node_network_transmit_bytes_total{device!="lo"}[5m])
-
받은 데이터:
rate(node_network_receive_bytes_total{device!="lo"}[5m])
Grafana 데이터 소스로서의 Prometheus
Grafana를 사용하면 Prometheus 성능 메트릭을 데이터 소스로 가져와 그래프와 대시보드에 표시할 수 있으며, 시각화 측면에서 유용합니다.
단일 서버 GitLab 설치를 위한 Prometheus 대시보드를 추가하는 방법:
- Grafana에서 새로운 데이터 소스를 만듭니다.
- 데이터 소스의 이름을 지정합니다(예: GitLab).
- 종류 드롭다운 디렉터리에서
Prometheus
를 선택합니다. - Prometheus 수신 주소를 URL로 추가하고, 액세스를
브라우저
로 설정합니다. - HTTP 메소드를
GET
으로 설정합니다. - 구성을 저장하고 테스트하여 작동 여부를 확인합니다.
GitLab 지표
GitLab은 자체적으로 내부 서비스 지표를 모니터링하고, 이를 /-/metrics
엔드포인트에서 사용할 수 있도록 합니다. 다른 수출자들과는 달리 이 엔드포인트는 사용자 트래픽과 동일한 URL 및 포트에서 사용 가능하므로 인증이 필요합니다.
GitLab Metrics에 대해 더 알아보기.
번들된 소프트웨어 지표
Linux 패키지에 번들된 많은 GitLab 의존성은 Prometheus 지표를 내보내도록 사전 구성되어 있습니다.
노드 수출자
노드 수출자를 통해 메모리, 디스크 및 CPU 사용률과 같은 여러 기계 리소스를 메트릭할 수 있습니다.
웹 수출자
웹 수출자는 엔드 유저 및 Prometheus 트래픽을 두 개의 별도 애플리케이션으로 분리하여 성능과 가용성을 향상시키는 전용 지표 서버입니다.
Redis 수출자
Redis 수출자를 사용하여 다양한 Redis 지표를 메트릭할 수 있습니다.
PostgreSQL 수출자
PostgreSQL 수출자를 사용하여 다양한 PostgreSQL 지표를 메트릭할 수 있습니다.
PgBouncer 수출자
PgBouncer 수출자를 사용하여 다양한 PgBouncer 지표를 메트릭할 수 있습니다.
레지스트리 수출자
레지스트리 수출자를 사용하여 다양한 레지스트리 지표를 메트릭할 수 있습니다.
GitLab 수출자
GitLab 수출자를 사용하여 Redis와 데이터베이스에서 추출한 다양한 GitLab 지표를 메트릭할 수 있습니다.
문제 해결
/var/opt/gitlab/prometheus
의 디스크 공간이 너무 많이 사용됨
만약 Prometheus 모니터링을 사용하지 않는다면:
- Prometheus 비활성화.
-
/var/opt/gitlab/prometheus
아래의 데이터를 삭제합니다.
만약 Prometheus 모니터링을 사용하는 경우:
-
Prometheus를 중지합니다(실행 중에 데이터를 삭제하면 데이터 손상이 발생할 수 있습니다):
gitlab-ctl stop prometheus
-
/var/opt/gitlab/prometheus/data
아래의 데이터를 삭제합니다. -
서비스를 다시 시작합니다:
gitlab-ctl start prometheus
-
서비스가 실행 중인지 확인합니다:
gitlab-ctl status prometheus
- 선택 사항. 저장 보유량 크기 구성.
모니터링 노드가 데이터를 수신하지 않음
모니터링 노드가 데이터를 수신하지 않는 경우, 익스포터가 데이터를 캡처하는지 확인합니다:
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/metrics"
또는
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/-/metrics"