InfoGrab DocsInfoGrab Docs

메트릭 인스트루멘테이션 가이드

요약

이 가이드는 메트릭 인스트루멘테이션을 사용하여 Service Ping 메트릭을 개발하는 방법을 설명합니다. 동영상 튜토리얼은 인스트루멘테이션 클래스를 통한 Service Ping 메트릭 추가를 참고합니다. 모든 메트릭은 service ping 페이로드에 포함되려면 대응하는 메트릭 정의가 있어야 합니다.

이 가이드는 메트릭 인스트루멘테이션을 사용하여 Service Ping 메트릭을 개발하는 방법을 설명합니다.

동영상 튜토리얼은 인스트루멘테이션 클래스를 통한 Service Ping 메트릭 추가를 참고합니다.

명명법#

  • 인스트루멘테이션 클래스:
    • 메트릭 클래스 중 하나인 DatabaseMetric, NumbersMetric, GenericMetric을 상속합니다.
    • Service Ping 메트릭의 값을 계산하는 로직을 구현합니다.
  • 메트릭 정의 Service Data 메트릭 YAML 정의입니다.
  • 하드닝: 메서드 하드닝은 메서드가 안전하게 실패하면서 -1 같은 폴백 값을 반환하도록 보장하는 과정입니다.

메트릭 인스트루멘테이션 작동 방식#

모든 메트릭은 service ping 페이로드에 포함되려면 대응하는 메트릭 정의가 있어야 합니다. 메트릭 정의에는 instrumentation_class 필드가 있을 수 있으며, 이 필드에는 클래스를 설정할 수 있습니다.

정의된 인스트루멘테이션 클래스는 기존 메트릭 클래스인 DatabaseMetric, NumbersMetric, GenericMetric 중 하나를 상속해야 합니다.

현재 규칙에 따르면 인스트루멘테이션 클래스 하나가 메트릭 하나에 대응합니다.

인스트루멘테이션 클래스를 사용하면 Service Ping 생성 과정 전체를 중단시키지 않고 메트릭이 개별적으로 안전하게 실패할 수 있습니다.

데이터베이스 메트릭#

Note

가능하면 데이터베이스 메트릭 대신 내부 이벤트 추적을 사용하기를 권장합니다. 데이터베이스 메트릭은 규모가 큰 GitLab 인스턴스의 데이터베이스에 불필요한 부하를 줄 수 있고, 최적화 과정이 인스턴스 성능에 영향을 줄 수 있습니다.

데이터베이스에 보관된 데이터를 추적할 때 데이터베이스 메트릭을 사용할 수 있습니다. 예를 들어 특정 인스턴스에 존재하는 이슈의 개수가 이에 해당합니다.

  • operation: 주어진 relation에 대한 연산으로, count, distinct_count, sum, average 중 하나입니다.
  • relation: operation을 수행할 객체의 ActiveRecord::Relation을 반환하는 람다를 할당합니다. 할당된 람다는 매개변수를 최대 하나까지 받습니다. 이 매개변수는 해시로 변환되어 메트릭 정의의 options 키 아래에 저장됩니다.
  • start: 배치 카운팅의 시작 값을 지정하며, 기본값은 relation.minimum(:id) 입니다.
  • finish: 배치 카운팅의 종료 값을 지정하며, 기본값은 relation.maximum(:id) 입니다.
  • cache_start_and_finish_as: start와 finish 값의 캐시 키를 지정하고 이 값의 캐싱을 설정합니다. start와 finish가 비용이 큰 쿼리이면서 여러 메트릭 계산에서 재사용해야 할 때 이 호출을 사용합니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.
  • timestamp_column: 시간 제약이 있는 메트릭에서 레코드를 필터링할 때 사용하는 타임스탬프 칼럼을 선택적으로 지정합니다. 기본값은 created_at 입니다.

데이터베이스 메트릭을 추가하는 머지 리퀘스트 예시.

최적화 권장 사항 및 예시#

Service Ping 메트릭의 단일 쿼리는 콜드 캐시 상태에서 실행 시간 1초 미만을 유지해야 합니다.

  • 특화된 인덱스를 사용합니다. 예시는 다음 머지 리퀘스트를 참고합니다.
  • 정의된 start와 finish를 사용합니다. 이 값은 다음 머지 리퀘스트 예시처럼 메모이제이션하여 재사용할 수 있습니다.
  • 쿼리에서 조인과 불필요한 복잡성을 피합니다. 다음 머지 리퀘스트 예시를 참고합니다.
  • 머지 리퀘스트 예시처럼 distinct_count에 사용자 지정 batch_size를 설정합니다.

데이터베이스 메트릭 예시#

Count 예시#

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesMetric < DatabaseMetric
          operation :count

          relation ->(options) { Issue.where(confidential: options[:confidential]) }
        end
      end
    end
  end
end

배치 카운터 예시#

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesMetric < DatabaseMetric
          operation :count

          start { Issue.minimum(:id) }
          finish { Issue.maximum(:id) }

          relation { Issue }
        end
      end
    end
  end
end

고유 배치 카운터 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountUsersAssociatingMilestonesToReleasesMetric < DatabaseMetric
          operation :distinct_count, column: :author_id

          relation { Release.with_milestones }

          start { Release.minimum(:author_id) }
          finish { Release.maximum(:author_id) }
        end
      end
    end
  end
end

Sum 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class JiraImportsTotalImportedIssuesCountMetric < DatabaseMetric
          operation :sum, column: :imported_issues_count

          relation { JiraImportState.finished }
        end
      end
    end
  end
end

Average 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesWeightAverageMetric < DatabaseMetric
          operation :average, column: :weight

          relation { Issue }
        end
      end
    end
  end
end

추정 배치 카운터#

추정 배치 카운터 기능은 제공된 estimate_batch_distinct_count 메서드를 통해 사용할 때 ActiveRecord::StatementInvalid 오류를 처리합니다. 오류가 발생하면 -1 값을 반환합니다.

Warning

이 기능은 특정 칼럼에서 특정 ActiveRecord_Relation의 고유 개수를 추정하며, HyperLogLog 알고리즘을 사용합니다. HyperLogLog 알고리즘은 확률적이므로 결과에는 항상 오차가 포함됩니다. 관측된 최대 오차율은 4.9% 입니다.

올바르게 사용하면 estimate_batch_distinct_count 메서드로 다른 카운터로는 보장할 수 없는 비고유 값이 포함된 칼럼을 효율적으로 카운트할 수 있습니다.

estimate_batch_distinct_count 메서드#

메서드:

estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)

이 메서드에는 다음 인수가 포함됩니다.

  • relation: 카운트를 수행할 ActiveRecord_Relation 입니다.
  • column: 고유 카운트를 수행할 칼럼입니다. 기본값은 기본 키입니다.
  • batch_size: Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE에서 가져옵니다. 기본값은 10,000 입니다.
  • start: 복잡한 최솟값 계산을 피하기 위한 배치 카운트의 사용자 지정 시작 값입니다.
  • finish: 복잡한 최댓값 계산을 피하기 위한 배치 카운트의 사용자 지정 종료 값입니다.

이 메서드에는 다음 사전 요구 사항이 있습니다.

  • 제공한 relation에는 숫자 칼럼으로 정의된 기본 키가 포함되어야 합니다. 예를 들면 id bigint NOT NULL 입니다.

  • estimate_batch_distinct_count는 조인된 관계를 처리할 수 있습니다. 비고유 칼럼을 카운트하는 기능을 사용하려면 조인된 관계에 has_many :boards 같은 일대다 관계가 없어야 합니다.

  • start와 finish 인수는 추정 카운트가 다른 칼럼을 참조하더라도 항상 기본 키 관계 값을 나타내야 합니다. 예를 들면 다음과 같습니다.

      estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
    

예시:

  1. 관계만 제공하는 추정 배치 카운터의 간단한 실행이며, 반환 값은 Project 관계의 id 칼럼(기본 키)에 있는 고유 값의 추정 개수를 나타냅니다.

      estimate_batch_distinct_count(::Project)
    
  2. 제공한 관계에 추가 필터(.where(time_period))를 적용하고, 사용자 지정 칼럼(:author_id)의 고유 값 개수를 추정하며, start와 finish 매개변수가 함께 분석 대상 관계의 범위를 정하는 경계를 적용하는 추정 배치 카운터 실행입니다.

      estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
    

Numbers 메트릭#

  • operation: 주어진 data 블록에 대한 연산입니다. 현재는 add 연산만 지원합니다.
  • data: 숫자 배열을 담은 block 입니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.
# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
          class IssuesBoardsCountMetric < NumbersMetric
            operation :add

            data do |time_frame|
              [
                 CountIssuesMetric.new(time_frame: time_frame).value,
                 CountBoardsMetric.new(time_frame: time_frame).value
              ]
            end
          end
        end
      end
    end
  end
end

YAML 설정에도 인스트루멘테이션 클래스 이름을 포함해야 합니다.

time_frame: 28d
instrumentation_class: IssuesBoardsCountMetric

Generic 메트릭#

인스턴스의 데이터베이스 버전처럼 그 밖의 메트릭에는 generic 메트릭을 사용할 수 있습니다.

  • value: 메트릭의 값을 지정합니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.

generic 메트릭을 추가하는 머지 리퀘스트 예시.

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class UuidMetric < GenericMetric
          value do
            Gitlab::CurrentSettings.uuid
          end
        end
      end
    end
  end
end

Prometheus 메트릭#

이 인스트루멘테이션 클래스는 Prometheus 클라이언트 객체를 value 블록의 인수로 전달하여 Prometheus 쿼리를 처리합니다. Prometheus 오류 처리는 블록 안에서 수행해야 합니다.

  • value: 메트릭의 값을 지정합니다. 첫 번째 인수로 Prometheus 클라이언트 객체가 전달됩니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.

Prometheus 메트릭을 추가하는 머지 리퀘스트 예시.

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class GitalyApdexMetric < PrometheusMetric
          value do |client|
            result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first

            break FALLBACK unless result

            result['value'].last.to_f
          end
        end
      end
    end
  end
end

새 메트릭 인스트루멘테이션 클래스 생성#

생성기는 클래스 이름을 인수로 받으며 다음 옵션을 사용합니다.

  • --type=TYPE 필수입니다. 메트릭 유형을 나타내며 database, generic, redis, numbers 중 하나여야 합니다.
  • --operation database와 numbers 유형에 필수입니다.
    • database는 count, distinct_count, estimate_batch_distinct_count, sum, average 중 하나여야 합니다.
    • numbers는 add 여야 합니다.
  • --ee 메트릭이 EE 용인지 나타냅니다.
rails generate gitlab:usage_metric CountIssues --type database --operation distinct_count
        create lib/gitlab/usage/metrics/instrumentations/count_issues_metric.rb
        create spec/lib/gitlab/usage/metrics/instrumentations/count_issues_metric_spec.rb

구현한 다음에는 로컬에서 service ping을 실행하여 메트릭이 포함되고 예상대로 동작하는지 확인합니다.

Service Ping 메트릭을 인스트루멘테이션 클래스로 마이그레이션#

이 가이드는 Service Ping 메트릭을 lib/gitlab/usage_data.rb 또는 ee/lib/ee/gitlab/usage_data.rb에서 인스트루멘테이션 클래스로 마이그레이션하는 방법을 설명합니다.

  1. 메트릭 유형을 선택합니다.
  1. 인스트루멘테이션 클래스의 위치를 ee 아래로 할지 ee 밖으로 할지 정합니다.

  2. 인스트루멘테이션 클래스 파일을 생성합니다.

  3. 인스트루멘테이션 클래스 본문을 채웁니다.

    • 메트릭의 코드 로직을 추가합니다. usage_data.rb의 메트릭 구현과 비슷할 수 있습니다.
    • 개별 메트릭의 테스트를 spec/lib/gitlab/usage/metrics/instrumentations/에 추가합니다.
    • Service Ping 테스트를 추가합니다.
  4. 메트릭 정의 파일을 생성합니다.

  5. lib/gitlab/usage_data.rb 또는 ee/lib/ee/gitlab/usage_data.rb에서 코드를 제거합니다.

  6. spec/lib/gitlab/usage_data.rb 또는 ee/spec/lib/ee/gitlab/usage_data.rb에서 테스트를 제거합니다.

메트릭 문제 해결#

원인이 곧바로 드러나지 않는 이유로 메트릭이 실패하기도 합니다. 성능 문제나 다른 문제와 관련된 실패일 수 있습니다. 다음 페어링 세션 동영상은 실제로 실패한 메트릭을 조사한 사례를 보여 줍니다.

메트릭 문제 해결 과정을 자세히 알아보려면 다음 동영상을 참고합니다: Product Intelligence Office Hours Oct 27th

메트릭 인스트루멘테이션 가이드

GitLab v19.4
원문 보기

요약

이 가이드는 메트릭 인스트루멘테이션을 사용하여 Service Ping 메트릭을 개발하는 방법을 설명합니다. 동영상 튜토리얼은 인스트루멘테이션 클래스를 통한 Service Ping 메트릭 추가를 참고합니다. 모든 메트릭은 service ping 페이로드에 포함되려면 대응하는 메트릭 정의가 있어야 합니다.

이 가이드는 메트릭 인스트루멘테이션을 사용하여 Service Ping 메트릭을 개발하는 방법을 설명합니다.

동영상 튜토리얼은 인스트루멘테이션 클래스를 통한 Service Ping 메트릭 추가를 참고합니다.

명명법#

  • 인스트루멘테이션 클래스:
    • 메트릭 클래스 중 하나인 DatabaseMetric, NumbersMetric, GenericMetric을 상속합니다.
    • Service Ping 메트릭의 값을 계산하는 로직을 구현합니다.
  • 메트릭 정의 Service Data 메트릭 YAML 정의입니다.
  • 하드닝: 메서드 하드닝은 메서드가 안전하게 실패하면서 -1 같은 폴백 값을 반환하도록 보장하는 과정입니다.

메트릭 인스트루멘테이션 작동 방식#

모든 메트릭은 service ping 페이로드에 포함되려면 대응하는 메트릭 정의가 있어야 합니다. 메트릭 정의에는 instrumentation_class 필드가 있을 수 있으며, 이 필드에는 클래스를 설정할 수 있습니다.

정의된 인스트루멘테이션 클래스는 기존 메트릭 클래스인 DatabaseMetric, NumbersMetric, GenericMetric 중 하나를 상속해야 합니다.

현재 규칙에 따르면 인스트루멘테이션 클래스 하나가 메트릭 하나에 대응합니다.

인스트루멘테이션 클래스를 사용하면 Service Ping 생성 과정 전체를 중단시키지 않고 메트릭이 개별적으로 안전하게 실패할 수 있습니다.

데이터베이스 메트릭#

Note

가능하면 데이터베이스 메트릭 대신 내부 이벤트 추적을 사용하기를 권장합니다. 데이터베이스 메트릭은 규모가 큰 GitLab 인스턴스의 데이터베이스에 불필요한 부하를 줄 수 있고, 최적화 과정이 인스턴스 성능에 영향을 줄 수 있습니다.

데이터베이스에 보관된 데이터를 추적할 때 데이터베이스 메트릭을 사용할 수 있습니다. 예를 들어 특정 인스턴스에 존재하는 이슈의 개수가 이에 해당합니다.

  • operation: 주어진 relation에 대한 연산으로, count, distinct_count, sum, average 중 하나입니다.
  • relation: operation을 수행할 객체의 ActiveRecord::Relation을 반환하는 람다를 할당합니다. 할당된 람다는 매개변수를 최대 하나까지 받습니다. 이 매개변수는 해시로 변환되어 메트릭 정의의 options 키 아래에 저장됩니다.
  • start: 배치 카운팅의 시작 값을 지정하며, 기본값은 relation.minimum(:id) 입니다.
  • finish: 배치 카운팅의 종료 값을 지정하며, 기본값은 relation.maximum(:id) 입니다.
  • cache_start_and_finish_as: start와 finish 값의 캐시 키를 지정하고 이 값의 캐싱을 설정합니다. start와 finish가 비용이 큰 쿼리이면서 여러 메트릭 계산에서 재사용해야 할 때 이 호출을 사용합니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.
  • timestamp_column: 시간 제약이 있는 메트릭에서 레코드를 필터링할 때 사용하는 타임스탬프 칼럼을 선택적으로 지정합니다. 기본값은 created_at 입니다.

데이터베이스 메트릭을 추가하는 머지 리퀘스트 예시.

최적화 권장 사항 및 예시#

Service Ping 메트릭의 단일 쿼리는 콜드 캐시 상태에서 실행 시간 1초 미만을 유지해야 합니다.

  • 특화된 인덱스를 사용합니다. 예시는 다음 머지 리퀘스트를 참고합니다.
  • 정의된 start와 finish를 사용합니다. 이 값은 다음 머지 리퀘스트 예시처럼 메모이제이션하여 재사용할 수 있습니다.
  • 쿼리에서 조인과 불필요한 복잡성을 피합니다. 다음 머지 리퀘스트 예시를 참고합니다.
  • 머지 리퀘스트 예시처럼 distinct_count에 사용자 지정 batch_size를 설정합니다.

데이터베이스 메트릭 예시#

Count 예시#

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesMetric < DatabaseMetric
          operation :count

          relation ->(options) { Issue.where(confidential: options[:confidential]) }
        end
      end
    end
  end
end

배치 카운터 예시#

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesMetric < DatabaseMetric
          operation :count

          start { Issue.minimum(:id) }
          finish { Issue.maximum(:id) }

          relation { Issue }
        end
      end
    end
  end
end

고유 배치 카운터 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountUsersAssociatingMilestonesToReleasesMetric < DatabaseMetric
          operation :distinct_count, column: :author_id

          relation { Release.with_milestones }

          start { Release.minimum(:author_id) }
          finish { Release.maximum(:author_id) }
        end
      end
    end
  end
end

Sum 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class JiraImportsTotalImportedIssuesCountMetric < DatabaseMetric
          operation :sum, column: :imported_issues_count

          relation { JiraImportState.finished }
        end
      end
    end
  end
end

Average 예시#

# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class CountIssuesWeightAverageMetric < DatabaseMetric
          operation :average, column: :weight

          relation { Issue }
        end
      end
    end
  end
end

추정 배치 카운터#

추정 배치 카운터 기능은 제공된 estimate_batch_distinct_count 메서드를 통해 사용할 때 ActiveRecord::StatementInvalid 오류를 처리합니다. 오류가 발생하면 -1 값을 반환합니다.

Warning

이 기능은 특정 칼럼에서 특정 ActiveRecord_Relation의 고유 개수를 추정하며, HyperLogLog 알고리즘을 사용합니다. HyperLogLog 알고리즘은 확률적이므로 결과에는 항상 오차가 포함됩니다. 관측된 최대 오차율은 4.9% 입니다.

올바르게 사용하면 estimate_batch_distinct_count 메서드로 다른 카운터로는 보장할 수 없는 비고유 값이 포함된 칼럼을 효율적으로 카운트할 수 있습니다.

estimate_batch_distinct_count 메서드#

메서드:

estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)

이 메서드에는 다음 인수가 포함됩니다.

  • relation: 카운트를 수행할 ActiveRecord_Relation 입니다.
  • column: 고유 카운트를 수행할 칼럼입니다. 기본값은 기본 키입니다.
  • batch_size: Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE에서 가져옵니다. 기본값은 10,000 입니다.
  • start: 복잡한 최솟값 계산을 피하기 위한 배치 카운트의 사용자 지정 시작 값입니다.
  • finish: 복잡한 최댓값 계산을 피하기 위한 배치 카운트의 사용자 지정 종료 값입니다.

이 메서드에는 다음 사전 요구 사항이 있습니다.

  • 제공한 relation에는 숫자 칼럼으로 정의된 기본 키가 포함되어야 합니다. 예를 들면 id bigint NOT NULL 입니다.

  • estimate_batch_distinct_count는 조인된 관계를 처리할 수 있습니다. 비고유 칼럼을 카운트하는 기능을 사용하려면 조인된 관계에 has_many :boards 같은 일대다 관계가 없어야 합니다.

  • start와 finish 인수는 추정 카운트가 다른 칼럼을 참조하더라도 항상 기본 키 관계 값을 나타내야 합니다. 예를 들면 다음과 같습니다.

      estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
    

예시:

  1. 관계만 제공하는 추정 배치 카운터의 간단한 실행이며, 반환 값은 Project 관계의 id 칼럼(기본 키)에 있는 고유 값의 추정 개수를 나타냅니다.

      estimate_batch_distinct_count(::Project)
    
  2. 제공한 관계에 추가 필터(.where(time_period))를 적용하고, 사용자 지정 칼럼(:author_id)의 고유 값 개수를 추정하며, start와 finish 매개변수가 함께 분석 대상 관계의 범위를 정하는 경계를 적용하는 추정 배치 카운터 실행입니다.

      estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
    

Numbers 메트릭#

  • operation: 주어진 data 블록에 대한 연산입니다. 현재는 add 연산만 지원합니다.
  • data: 숫자 배열을 담은 block 입니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.
# frozen_string_literal: true

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
          class IssuesBoardsCountMetric < NumbersMetric
            operation :add

            data do |time_frame|
              [
                 CountIssuesMetric.new(time_frame: time_frame).value,
                 CountBoardsMetric.new(time_frame: time_frame).value
              ]
            end
          end
        end
      end
    end
  end
end

YAML 설정에도 인스트루멘테이션 클래스 이름을 포함해야 합니다.

time_frame: 28d
instrumentation_class: IssuesBoardsCountMetric

Generic 메트릭#

인스턴스의 데이터베이스 버전처럼 그 밖의 메트릭에는 generic 메트릭을 사용할 수 있습니다.

  • value: 메트릭의 값을 지정합니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.

generic 메트릭을 추가하는 머지 리퀘스트 예시.

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class UuidMetric < GenericMetric
          value do
            Gitlab::CurrentSettings.uuid
          end
        end
      end
    end
  end
end

Prometheus 메트릭#

이 인스트루멘테이션 클래스는 Prometheus 클라이언트 객체를 value 블록의 인수로 전달하여 Prometheus 쿼리를 처리합니다. Prometheus 오류 처리는 블록 안에서 수행해야 합니다.

  • value: 메트릭의 값을 지정합니다. 첫 번째 인수로 Prometheus 클라이언트 객체가 전달됩니다.
  • available?: 메트릭을 보고할지 여부를 지정합니다. 기본값은 true 입니다.

Prometheus 메트릭을 추가하는 머지 리퀘스트 예시.

module Gitlab
  module Usage
    module Metrics
      module Instrumentations
        class GitalyApdexMetric < PrometheusMetric
          value do |client|
            result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first

            break FALLBACK unless result

            result['value'].last.to_f
          end
        end
      end
    end
  end
end

새 메트릭 인스트루멘테이션 클래스 생성#

생성기는 클래스 이름을 인수로 받으며 다음 옵션을 사용합니다.

  • --type=TYPE 필수입니다. 메트릭 유형을 나타내며 database, generic, redis, numbers 중 하나여야 합니다.
  • --operation database와 numbers 유형에 필수입니다.
    • database는 count, distinct_count, estimate_batch_distinct_count, sum, average 중 하나여야 합니다.
    • numbers는 add 여야 합니다.
  • --ee 메트릭이 EE 용인지 나타냅니다.
rails generate gitlab:usage_metric CountIssues --type database --operation distinct_count
        create lib/gitlab/usage/metrics/instrumentations/count_issues_metric.rb
        create spec/lib/gitlab/usage/metrics/instrumentations/count_issues_metric_spec.rb

구현한 다음에는 로컬에서 service ping을 실행하여 메트릭이 포함되고 예상대로 동작하는지 확인합니다.

Service Ping 메트릭을 인스트루멘테이션 클래스로 마이그레이션#

이 가이드는 Service Ping 메트릭을 lib/gitlab/usage_data.rb 또는 ee/lib/ee/gitlab/usage_data.rb에서 인스트루멘테이션 클래스로 마이그레이션하는 방법을 설명합니다.

  1. 메트릭 유형을 선택합니다.
  1. 인스트루멘테이션 클래스의 위치를 ee 아래로 할지 ee 밖으로 할지 정합니다.

  2. 인스트루멘테이션 클래스 파일을 생성합니다.

  3. 인스트루멘테이션 클래스 본문을 채웁니다.

    • 메트릭의 코드 로직을 추가합니다. usage_data.rb의 메트릭 구현과 비슷할 수 있습니다.
    • 개별 메트릭의 테스트를 spec/lib/gitlab/usage/metrics/instrumentations/에 추가합니다.
    • Service Ping 테스트를 추가합니다.
  4. 메트릭 정의 파일을 생성합니다.

  5. lib/gitlab/usage_data.rb 또는 ee/lib/ee/gitlab/usage_data.rb에서 코드를 제거합니다.

  6. spec/lib/gitlab/usage_data.rb 또는 ee/spec/lib/ee/gitlab/usage_data.rb에서 테스트를 제거합니다.

메트릭 문제 해결#

원인이 곧바로 드러나지 않는 이유로 메트릭이 실패하기도 합니다. 성능 문제나 다른 문제와 관련된 실패일 수 있습니다. 다음 페어링 세션 동영상은 실제로 실패한 메트릭을 조사한 사례를 보여 줍니다.

메트릭 문제 해결 과정을 자세히 알아보려면 다음 동영상을 참고합니다: Product Intelligence Office Hours Oct 27th