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 수신 대기 포트 및 주소 변경

경고: 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.rb에서 prometheus['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가 실행되는 독립형 모니터링 노드를 구성할 수 있습니다. Linux 패키지를 사용한 독립형 모니터링 노드는 다중 노드를 갖는 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 서버 사용하기

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

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

외부 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 메트릭을 수집하려면, 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

경고: 스니펫의 gitlab-rails 작업은 GitLab이 HTTPS를 통해 도달 가능하다고 가정합니다. 배포가 HTTPS를 사용하지 않는 경우, 작업 구성은 http 스킴 및 포트 80을 사용하도록 조정됩니다.

  1. 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과 동일한 브라우저에서 Prometheus에 액세스할 수 없을 수 있습니다. HSTS 때문에 GitLab을 통해 Prometheus에 액세스하는 방법에 대한 테스트 프로젝트가 있습니다, 하지만 임시방편으로는 몇 가지 해결책이 있습니다: 별도의 FQDN 사용, 서버 IP 사용, Prometheus용 별도의 브라우저 사용, HSTS 재설정 또는 NGINX로 프록시화하는 것입니다.

Prometheus가 수집한 성능 데이터는 Prometheus 콘솔에서 직접 볼 수 있으며, 호환되는 대시보드 도구를 통해 확인할 수 있습니다. Prometheus 인터페이스는 수집된 데이터와 작업할 수 있는 유연한 쿼리 언어를 제공하여 출력을 시각화할 수 있습니다. 더 다양한 기능을 갖춘 대시보드를 위해서는 Grafana를 사용할 수 있으며, Prometheus에 대한 공식 지원이 있습니다.

샘플 Prometheus 쿼리:

  • % 사용 가능한 메모리: ((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) or ((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. URL로 Prometheus 수신 주소를 추가하고 액세스를 브라우저로 설정합니다.
  5. HTTP 방법을 GET으로 설정합니다.
  6. 구성이 작동하는지 확인하기 위해 구성을 저장하고 테스트합니다.

GitLab 지표

GitLab은 자체 내부 서비스 지표를 모니터링하고 /-/metrics 엔드포인트에서 해당 지표를 사용할 수 있습니다. 다른 익스포터와는 달리 이 엔드포인트는 사용자 트래픽과 동일한 URL 및 포트에서 사용 가능하기 때문에 인증이 필요합니다.

GitLab 지표에 대해 자세히 알아보기.

번들된 소프트웨어 지표

Linux 패키지에 번들된 많은 GitLab 종속성은 Prometheus 지표를 내보내기 위해 사전 구성되어 있습니다.

노드 익스포터

노드 익스포터를 사용하면 메모리, 디스크 및 CPU 활용과 같은 다양한 기계 자원을 측정할 수 있습니다.

노드 익스포터에 대해 자세히 알아보기.

웹 익스포터

웹 익스포터는 엔드 유저 및 Prometheus 트래픽을 두 개의 별도 응용 프로그램으로 분리하여 성능과 가용성을 개선하는 전용 지표 서버입니다.

웹 익스포터에 대해 자세히 알아보기.

Redis 익스포터

Redis 익스포터를 사용하면 다양한 Redis 지표를 측정할 수 있습니다.

Redis 익스포터에 대해 자세히 알아보기.

PostgreSQL 익스포터

PostgreSQL 익스포터를 사용하면 다양한 PostgreSQL 지표를 측정할 수 있습니다.

PostgreSQL 익스포터에 대해 자세히 알아보기.

PgBouncer Exporter

PgBouncer Exporter를 사용하면 여러 가지 PgBouncer 지표를 측정할 수 있습니다.

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

레지스트리 Exporter

레지스트리 Exporter를 사용하면 여러 가지 레지스트리 지표를 측정할 수 있습니다.

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

GitLab Exporter

GitLab Exporter를 사용하면 Redis와 데이터베이스에서 가져온 여러 가지 GitLab 지표를 측정할 수 있습니다.

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

Troubleshooting

/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. 선택 사항. 저장 보존 크기를 구성.

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

만약 모니터링 노드가 어떠한 데이터도 수신하지 않는다면, Exporter가 데이터를 캡처하는지 확인하세요:

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

또는

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