Sha256: 2c04183064fb41efda97553d0b0c833eed52da490df4c06b67659336a9bab52d

Contents?: true

Size: 1.6 KB

Versions: 4

Compression:

Stored size: 1.6 KB

Contents

module GitLab
  module Monitor
    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)
          @metrics   = metrics
          @collector = TupleStatsCollector.new(connection_string: opts[:connection_string])
        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_s, table_name: table_name)
            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

4 entries across 4 versions & 1 rubygems

Version Path
gitlab-monitor-4.2.0 lib/gitlab_monitor/database/tuple_stats.rb
gitlab-monitor-4.1.0 lib/gitlab_monitor/database/tuple_stats.rb
gitlab-monitor-4.0.1 lib/gitlab_monitor/database/tuple_stats.rb
gitlab-monitor-4.0.0 lib/gitlab_monitor/database/tuple_stats.rb