Sha256: 3add9501bb49d4abab74c2160d61dd5324660a4b17d54d7e7b1235a5cc3e86d2

Contents?: true

Size: 1.71 KB

Versions: 5

Compression:

Stored size: 1.71 KB

Contents

module GitLab
  module Exporter
    module Database
      # A helper class to collect tuple stats from the database
      #
      # It takes a connection string (e.g. "dbname=test port=5432")
      class TupleStatsCollector < Base
        COLUMNS = %w(relname seq_tup_read idx_tup_fetch n_tup_ins n_tup_upd n_tup_del n_tup_hot_upd n_dead_tup seq_scan)
                  .join(",")
        QUERY   = <<-SQL.freeze
          SELECT #{COLUMNS}
          FROM pg_stat_user_tables
          WHERE relname IN (SELECT tablename FROM pg_tables WHERE tableowner = 'gitlab')
          GROUP BY #{COLUMNS}
        SQL

        def run
          with_connection_pool do |conn|
            conn.exec(QUERY).each.with_object({}) do |row, stats|
              stats[row.delete("relname")] = row
            end
          end
        end
      end

      # Probes the DB specified by opts[:connection_string] for tuple stats, then converts them to metrics
      class TuplesProber
        def initialize(opts, metrics: PrometheusMetrics.new, logger: nil)
          @metrics   = metrics
          @collector = TupleStatsCollector.new(connection_string: opts[:connection_string], logger: logger)
        end

        def probe_db
          result = @collector.run

          result.each do |table_name, tuple_stats|
            tuple_stats.each do |column_name, value|
              @metrics.add("gitlab_database_stat_table_#{column_name}",
                           value.to_f,
                           table_name: table_name) unless value.is_a?(Numeric)
            end
          end

          self
        rescue PG::ConnectionBad
          self
        end

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

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
gitlab-exporter-8.0.0 lib/gitlab_exporter/database/tuple_stats.rb
gitlab-exporter-7.2.0 lib/gitlab_exporter/database/tuple_stats.rb
gitlab-exporter-7.1.2 lib/gitlab_exporter/database/tuple_stats.rb
gitlab-exporter-7.1.1 lib/gitlab_exporter/database/tuple_stats.rb
gitlab-exporter-7.1.0 lib/gitlab_exporter/database/tuple_stats.rb