Prometheus 메트릭 개발 가이드라인

라이브러리에 추가하기

우리는 Prometheus를 지원하는 공통 시스템 서비스마다 가장 중요한 2-4개의 메트릭을 지원하기 위해 노력합니다. 라이브러리에 추가되지 않은 특정 익스포터에 대한 지원이 필요하다면, 여기common_metrics.yml 파일에 추가할 수 있습니다.

쿼리 식별자

새로운 메트릭을 추가할 때 요구되는 것은 변경된 후 메트릭을 업데이트하는 데 사용되는 고유 식별자를 가진 개별 쿼리를 만드는 것입니다:

- 그룹: 응답 메트릭 (NGINX Ingress)
  메트릭:
    - 제목: "처리량"
      y_축:
        이름: "초당 요청"
        형식: "숫자"
        정밀도: 2
      쿼리:
        - id: response_metrics_nginx_ingress_throughput_status_code
          query_range: 'sum(rate(nginx_upstream_responses_total{upstream=~"%{kube_namespace}-%{ci_environment_slug}-.*"}[2m])) by (status_code)'
          단위: req / sec
          레이블: 상태 코드

기존 메트릭 업데이트

새로운 공통 메트릭을 추가하거나 기존 메트릭을 변경한 후에는 가져온 스크립트를 다시 실행하여 모든 기존 메트릭을 쿼리 및 업데이트해야 합니다.

또는, 데이터베이스 마이그레이션을 생성할 수 있습니다:

class ImportCommonMetrics < Gitlab::Database::Migration[2.1]
  def up
    ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
  end
  def down
    # 아무 작업도 수행하지 않음
  end
end

쿼리 메트릭 (id:로 식별되는)이 제거된 경우, 기본적으로 데이터베이스에서 제거되지 않습니다. 제거된 메트릭에 대해 어떻게 처리할지 결정하는 추가 데이터베이스 마이그레이션을 추가할 수 있습니다. 예를 들어: 종속 데이터를 다른 메트릭으로 마이그레이션하는 것에 관심이 있을 수 있습니다.

GitLab Prometheus 메트릭

GitLab은 자체 모니터링을 위한 Prometheus 메트릭을 제공합니다.

새로운 메트릭 추가

이 섹션에서는 자체 모니터링을 위한 새로운 메트릭을 추가하는 방법을 설명합니다 (예시).

  1. 메트릭 유형을 선택합니다:

    • Gitlab::Metrics.counter
    • Gitlab::Metrics.gauge
    • Gitlab::Metrics.histogram
    • Gitlab::Metrics.summary
  2. 메트릭에 적절한 이름을 선택합니다. Prometheus 메트릭 이름에 대한 지침을 참조하세요.
  3. GitLab Prometheus 메트릭 목록을 업데이트합니다.
  4. 메트릭에 추가할 레이블을 신중하게 선택하세요. 프로젝트 경로 또는 프로젝트 ID와 같이 고카디널리티(고카디널리티를 갖는 값은 각 레이블 집합이 /metrics 엔드포인트에 새 항목으로 노출되는 사실 때문에)를 갖는 값은 우리 서비스 가용성에 영향을 미칠 수 있기 때문에 강력히 권장되지 않습니다. 예를 들어, 10개의 버킷과 100개의 값이 있는 레이블이 있는 히스토그램은 익스포트 엔드포인트에 1000개의 항목을 생성합니다.
  5. 새로운 메트릭을 기록하는 관련 페이지 또는 코드를 트리거합니다.
  6. 새 메트릭이 /-/metrics에 나타나는지 확인합니다.

특정 컨텍스트에 바운드되지 않은 메트릭(request, process, machine, namespace 등)에 대한 메트릭은 cron을 기반으로 한 Sidekiq 작업에서 생성합니다:

  • 지오 관련 메트릭의 경우, Geo::MetricsUpdateService를 확인합니다.
  • 다른 “전역” / 인스턴스 전체 메트릭의 경우, Metrics::GlobalMetricsUpdateService를 확인합니다.

하나 이상의 Sidekiq 인스턴스를 갖는 설치에서 Sidekiq에서 데이터를 익스포트할 때, 항상 동일한 익스포터가 쿼리될 것이라는 보장이 없습니다.

issue 406583에서 더 많은 내용과 주의사항을 확인할 수 있으며, push-gateway를 사용한 가능한 솔루션에 대해 논의합니다.