Prometheus로 GitLab 모니터링

Tier: Free, Premium, Ultimate Offering: Self-managed

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 및 이에 대한 모든 익스포터를 비활성화하려면 다음을 수행하세요.

  1. /etc/gitlab/gitlab.rb 파일 편집
  2. 다음 라인을 찾거나 추가하여 false로 설정하세요:

    prometheus_monitoring['enable'] = false
    sidekiq['metrics_enabled'] = false
       
    # 기본적으로 'false'로 설정되어 있지만 명시적으로 비활성화하여 확실하게 설정할 수 있습니다
    puma['exporter_enabled'] = false
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.

Prometheus 수신 대기 포트 및 주소 변경

caution
가능하긴 하지만, Prometheus가 수신 대기하는 포트를 변경하는 것은 권장되지 않습니다. GitLab 서버에서 실행 중인 다른 서비스에 영향을 줄 수 있습니다. 진행하려면 자신의 책임 하에 진행하세요.

GitLab 서버 외부에서 Prometheus에 액세스하려면, Prometheus가 수신 대기하는 주소/포트를 변경하세요.

  1. /etc/gitlab/gitlab.rb 파일 편집
  2. 다음 라인을 찾거나 추가하세요:

    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'
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.

사용자 정의 스크래이프 구성 추가

Linux 패키지로 번들된 Prometheus에 대한 추가 스크래이프 대상을 구성할 수 있습니다. 이를 위해 /etc/gitlab/gitlab.rbprometheus['scrape_configs']를 수정하고 Prometheus 스크래이프 대상 구성 구문을 사용하세요.

다음은 다음을 스크래이핑하는 예제 구성입니다: http://1.1.1.1:8060/probe?param_a=test&param_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가 실행되는 모니터링 노드를 구성하는 데 필요한 최소한의 단계입니다.

  1. 모니터링 노드에 SSH로 연결합니다.
  2. 다운로드 페이지에서 GitLab 다운로드 페이지에서 단계 1과 2를 사용하여 원하는 Linux 패키지를 설치하지만, 나머지 단계는 따르지 마세요.
  3. 다음 단계에서는 Consul 서버 노드의 IP 주소 또는 DNS 레코드를 수집하세요.
  4. /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
    
  5. 구성을 컴파일하려면 sudo gitlab-ctl reconfigure를 실행하세요.

다음 단계는 모든 다른 노드에 모니터링 노드의 위치를 알려주는 것입니다:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가하거나 찾아서 주석을 제거하세요:

    # FQDN 또는 IP가 될 수 있습니다
    gitlab_rails['prometheus_address'] = '10.0.0.1:9090'
    

    여기서 10.0.0.1:9090은 Prometheus 노드의 IP 주소와 포트입니다.

  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성하세요.

서비스 검색을 사용하여 모니터링을 활성화하게 되면 /etc/gitlab/gitlab.rb에서 prometheus['scrape_configs']가 설정되어 있지 않은지 확인하세요. consul['monitoring_service_discovery'] = trueprometheus['scrape_configs']를 동시에 /etc/gitlab/gitlab.rb에서 설정하면 오류가 발생합니다.

외부 Prometheus 서버 사용하기

caution
Prometheus 및 대부분의 익스포터는 인증을 지원하지 않습니다. 우리는 이를 로컬 네트워크 외부에 노출하는 것을 권장하지 않습니다.

외부 Prometheus 서버로부터 GitLab을 모니터링하도록 허용하려면 몇 가지 구성 변경이 필요합니다.

외부 Prometheus 서버를 사용하려면:

  1. /etc/gitlab/gitlab.rb 파일을 편집합니다.
  2. 번들된 Prometheus를 비활성화합니다:

    prometheus['enable'] = false
    
  3. 각 번들된 서비스의 익스포터를 네트워크 주소에서 수신하도록 설정하세요. 예를 들어:

    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'
    
  4. 필요한 경우 공식 설치 안내를 사용하여 전용 Prometheus 인스턴스를 설치하고 설정합니다.
  5. 모든 GitLab Rails (Puma, Sidekiq) 서버에서 Prometheus 서버 IP 주소 및 수신 포트를 설정하세요. 예를 들어:

    gitlab_rails['prometheus_address'] = '192.168.0.1:9090'
    
  6. 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",
    }
    
  7. Prometheus 서버가 GitLab 메트릭 엔드포인트에서 데이터를 수집할 수 있도록, Prometheus 서버 IP 주소를 모니터링 IP 허용 디렉터리에 추가하세요:

    gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '192.168.0.1']
    
  8. 각 번들된 서비스의 익스포터를 네트워크 주소에서 수신하도록 설정하였기 때문에, 인스턴스의 방화벽을 프로메테우스 IP로부터의 트래픽만 해당 익스포터로 허용하도록 업데이트하세요. 익스포터 서비스 및 해당 포트의 전체 참조 디렉터리은 여기에서 찾을 수 있습니다.
  9. 변경 사항을 적용하기 위해 GitLab을 재구성하세요.
  10. Prometheus 서버의 구성 파일을 편집하세요.
  11. 각 노드의 익스포터를 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
    
    caution
    스니펫의 gitlab-rails 작업은 GitLab이 HTTPS를 통해 접근 가능한 것으로 가정합니다. 만약 귀하의 배포가 HTTPS를 사용하지 않는다면, 작업 구성을 http 스키마와 포트 80을 사용하도록 조정합니다.
  12. Prometheus 서버를 다시 로드하세요.

저장 보존 크기 구성하기

Prometheus에는 로컬 리포지터리를 구성하는 데 사용되는 여러 사용자 정의 플래그가 있습니다:

  • storage.tsdb.retention.time: 오래된 데이터를 제거할 시간을 지정합니다. 기본값은 15d입니다. 이 플래그가 기본값과 다른 값으로 설정되면 storage.tsdb.retention을 재정의합니다.
  • storage.tsdb.retention.size: (실험적) 유지할 리포지터리 블록의 최대 바이트 수를 지정합니다. 가장 오래된 데이터가 먼저 제거됩니다. 기본값은 0입니다(비활성화됨). 이 플래그는 실험적이며 향후 릴리스에서 변경될 수 있습니다. 지원되는 단위: B, KB, MB, GB, TB, PB, EB. 예: 512MB.

저장 보존 크기를 구성하려면:

  1. /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"
    }
    
  2. 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 대시보드를 추가하는 방법:

  1. Grafana에서 새로운 데이터 소스를 만듭니다.
  2. 데이터 소스의 이름을 지정합니다(예: GitLab).
  3. 종류 드롭다운 디렉터리에서 Prometheus를 선택합니다.
  4. Prometheus 수신 주소를 URL로 추가하고, 액세스를 브라우저로 설정합니다.
  5. HTTP 메소드를 GET으로 설정합니다.
  6. 구성을 저장하고 테스트하여 작동 여부를 확인합니다.

GitLab 지표

GitLab은 자체적으로 내부 서비스 지표를 모니터링하고, 이를 /-/metrics 엔드포인트에서 사용할 수 있도록 합니다. 다른 수출자들과는 달리 이 엔드포인트는 사용자 트래픽과 동일한 URL 및 포트에서 사용 가능하므로 인증이 필요합니다.

GitLab Metrics에 대해 더 알아보기.

번들된 소프트웨어 지표

Linux 패키지에 번들된 많은 GitLab 의존성은 Prometheus 지표를 내보내도록 사전 구성되어 있습니다.

노드 수출자

노드 수출자를 통해 메모리, 디스크 및 CPU 사용률과 같은 여러 기계 리소스를 메트릭할 수 있습니다.

노드 수출자에 대해 자세히 알아보기.

웹 수출자

웹 수출자는 엔드 유저 및 Prometheus 트래픽을 두 개의 별도 애플리케이션으로 분리하여 성능과 가용성을 향상시키는 전용 지표 서버입니다.

웹 수출자에 대해 자세히 알아보기.

Redis 수출자

Redis 수출자를 사용하여 다양한 Redis 지표를 메트릭할 수 있습니다.

Redis 수출자에 대해 자세히 알아보기.

PostgreSQL 수출자

PostgreSQL 수출자를 사용하여 다양한 PostgreSQL 지표를 메트릭할 수 있습니다.

PostgreSQL 수출자에 대해 자세히 알아보기.

PgBouncer 수출자

PgBouncer 수출자를 사용하여 다양한 PgBouncer 지표를 메트릭할 수 있습니다.

PgBouncer 수출자에 대해 자세히 알아보기.

레지스트리 수출자

레지스트리 수출자를 사용하여 다양한 레지스트리 지표를 메트릭할 수 있습니다.

레지스트리 수출자에 대해 자세히 알아보기.

GitLab 수출자

GitLab 수출자를 사용하여 Redis와 데이터베이스에서 추출한 다양한 GitLab 지표를 메트릭할 수 있습니다.

GitLab 수출자에 대해 자세히 알아보기.

문제 해결

/var/opt/gitlab/prometheus의 디스크 공간이 너무 많이 사용됨

만약 Prometheus 모니터링을 사용하지 않는다면:

  1. Prometheus 비활성화.
  2. /var/opt/gitlab/prometheus 아래의 데이터를 삭제합니다.

만약 Prometheus 모니터링을 사용하는 경우:

  1. Prometheus를 중지합니다(실행 중에 데이터를 삭제하면 데이터 손상이 발생할 수 있습니다):

    gitlab-ctl stop prometheus
    
  2. /var/opt/gitlab/prometheus/data 아래의 데이터를 삭제합니다.
  3. 서비스를 다시 시작합니다:

    gitlab-ctl start prometheus
    
  4. 서비스가 실행 중인지 확인합니다:

    gitlab-ctl status prometheus
    
  5. 선택 사항. 저장 보유량 크기 구성.

모니터링 노드가 데이터를 수신하지 않음

모니터링 노드가 데이터를 수신하지 않는 경우, 익스포터가 데이터를 캡처하는지 확인합니다:

curl "http[s]://localhost:<EXPORTER LISTENING PORT>/metrics"

또는

curl "http[s]://localhost:<EXPORTER LISTENING PORT>/-/metrics"