80 lines
2.1 KiB
Ruby
80 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Usage
|
|
module Metrics
|
|
module Instrumentations
|
|
class DatabaseMetric < BaseMetric
|
|
# Usage Example
|
|
#
|
|
# class CountUsersCreatingIssuesMetric < DatabaseMetric
|
|
# operation :distinct_count, column: :author_id
|
|
#
|
|
# relation do |database_time_constraints|
|
|
# ::Issue.where(database_time_constraints)
|
|
# end
|
|
# end
|
|
class << self
|
|
def start(&block)
|
|
@metric_start = block
|
|
end
|
|
|
|
def finish(&block)
|
|
@metric_finish = block
|
|
end
|
|
|
|
def relation(&block)
|
|
@metric_relation = block
|
|
end
|
|
|
|
def operation(symbol, column: nil)
|
|
@metric_operation = symbol
|
|
@column = column
|
|
end
|
|
|
|
attr_reader :metric_operation, :metric_relation, :metric_start, :metric_finish, :column
|
|
end
|
|
|
|
def value
|
|
method(self.class.metric_operation)
|
|
.call(relation,
|
|
self.class.column,
|
|
start: self.class.metric_start&.call,
|
|
finish: self.class.metric_finish&.call)
|
|
end
|
|
|
|
def to_sql
|
|
Gitlab::Usage::Metrics::Query.for(self.class.metric_operation, relation, self.class.column)
|
|
end
|
|
|
|
def suggested_name
|
|
Gitlab::Usage::Metrics::NameSuggestion.for(
|
|
self.class.metric_operation,
|
|
relation: relation,
|
|
column: self.class.column
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
def relation
|
|
self.class.metric_relation.call.where(time_constraints)
|
|
end
|
|
|
|
def time_constraints
|
|
case time_frame
|
|
when '28d'
|
|
monthly_time_range_db_params
|
|
when 'all'
|
|
{}
|
|
when 'none'
|
|
nil
|
|
else
|
|
raise "Unknown time frame: #{time_frame} for DatabaseMetric"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|