Sha256: 3d3045799fb46536b4e0110666e0919609f60c62d44f650a1e3f3b9e33c85f73

Contents?: true

Size: 1.9 KB

Versions: 46

Compression:

Stored size: 1.9 KB

Contents

module GitLab
  module Exporter
    module Database
      # Helper to collect bloat metrics.
      class BloatCollector < Base
        attr_writer :logger

        def run(type = :btree)
          execute(self.class.query_for(type)).each_with_object({}) do |row, h|
            h[row["object_name"]] = row
          end
        end

        private

        def execute(query)
          with_connection_pool do |conn|
            conn.exec(query)
          end
        end

        class << self
          def query_for(type)
            @queries ||= {}

            return @queries[type] if @queries[type]

            file = File.join(__dir__, "bloat_#{type}.sql")
            fail "Unknown bloat query file: #{file}" unless File.exist?(file)

            @queries[type] = File.read(file)
          end
        end
      end

      # Prober class to gather bloat metrics
      class BloatProber
        METRIC_KEYS = %w[bloat_ratio bloat_size extra_size real_size].freeze

        attr_reader :metrics, :collector, :bloat_types

        def initialize(metrics: PrometheusMetrics.new,
                       logger: nil,
                       **opts)
          @metrics = metrics
          @collector = opts[:collector] || BloatCollector.new(**opts)
          @collector.logger = logger
          @bloat_types = opts[:bloat_types] || %i[btree table]
        end

        def probe_db
          bloat_types.each do |type|
            probe_for_type(type)
          end
        end

        def write_to(target)
          target.write(metrics.to_s)
        end

        private

        def probe_for_type(type)
          collector.run(type).each do |query_name, data|
            METRIC_KEYS.each do |key|
              metrics.add("gitlab_database_bloat_#{type}_#{key}", data[key].to_f, query_name: query_name)
            end
          end

          self
        rescue PG::ConnectionBad
          self
        end
      end
    end
  end
end

Version data entries

46 entries across 46 versions & 1 rubygems

Version Path
gitlab-exporter-15.2.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-15.1.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-15.0.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.5.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.4.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.3.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.2.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.1.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-14.0.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.5.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.4.1 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.4.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.3.1 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.3.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.2.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.1.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.0.3 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-13.0.0 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-12.1.1 lib/gitlab_exporter/database/bloat.rb
gitlab-exporter-12.1.0 lib/gitlab_exporter/database/bloat.rb