70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Gitlab
 | |
|   module Database
 | |
|     class PostgresTableSize < SharedModel
 | |
|       SMALL = 10.gigabytes
 | |
|       MEDIUM = 50.gigabytes
 | |
|       LARGE = 100.gigabytes
 | |
|       ALERT = 25.gigabytes
 | |
| 
 | |
|       CLASSIFICATION = {
 | |
|         small: 0...SMALL,
 | |
|         medium: SMALL...MEDIUM,
 | |
|         large: MEDIUM...LARGE,
 | |
|         over_limit: LARGE...
 | |
|       }.freeze
 | |
| 
 | |
|       self.primary_key = 'identifier'
 | |
|       self.table_name = 'postgres_table_sizes'
 | |
| 
 | |
|       scope :small, -> { where(size_in_bytes: CLASSIFICATION[:small]) }
 | |
|       scope :medium, -> { where(size_in_bytes: CLASSIFICATION[:medium]) }
 | |
|       scope :large, -> { where(size_in_bytes: CLASSIFICATION[:large]) }
 | |
|       scope :over_limit, -> { where(size_in_bytes: CLASSIFICATION[:over_limit]) }
 | |
|       scope :alerting, -> { where(size_in_bytes: ALERT...) }
 | |
| 
 | |
|       def self.by_table_name(table_name)
 | |
|         where(table_name: table_name).first
 | |
|       end
 | |
| 
 | |
|       def size_classification
 | |
|         case size_in_bytes
 | |
|         when CLASSIFICATION[:small]
 | |
|           'small'
 | |
|         when CLASSIFICATION[:medium]
 | |
|           'medium'
 | |
|         when CLASSIFICATION[:large]
 | |
|           'large'
 | |
|         when CLASSIFICATION[:over_limit]
 | |
|           'over_limit'
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def feature_categories
 | |
|         database_entries.find_by_table_name(table_name)&.feature_categories
 | |
|       end
 | |
| 
 | |
|       def alert_report_hash
 | |
|         {
 | |
|           identifier: identifier,
 | |
|           schema_name: schema_name,
 | |
|           table_name: table_name,
 | |
|           total_size: total_size,
 | |
|           table_size: table_size,
 | |
|           index_size: index_size,
 | |
|           size_in_bytes: size_in_bytes,
 | |
|           classification: size_classification,
 | |
|           feature_categories: feature_categories
 | |
|         }
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       def database_entries
 | |
|         @database_entries ||= Gitlab::Database::Dictionary.entries
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |