42 lines
1.2 KiB
Ruby
42 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# Service Ping payload build using the instrumentation classes
|
||
|
# for given metrics key_paths and output method
|
||
|
module Gitlab
|
||
|
module Usage
|
||
|
module ServicePing
|
||
|
class InstrumentedPayload
|
||
|
attr_reader :metrics_key_paths
|
||
|
attr_reader :output_method
|
||
|
|
||
|
def initialize(metrics_key_paths, output_method)
|
||
|
@metrics_key_paths = metrics_key_paths
|
||
|
@output_method = output_method
|
||
|
end
|
||
|
|
||
|
def build
|
||
|
metrics_key_paths.map do |key_path|
|
||
|
compute_instrumental_value(key_path, output_method)
|
||
|
end.reduce({}, :deep_merge)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# Not all metrics defintions have instrumentation classes
|
||
|
# The value can be computed only for those that have it
|
||
|
def instrumented_metrics_defintions
|
||
|
Gitlab::Usage::MetricDefinition.with_instrumentation_class
|
||
|
end
|
||
|
|
||
|
def compute_instrumental_value(key_path, output_method)
|
||
|
definition = instrumented_metrics_defintions.find { |df| df.key_path == key_path }
|
||
|
|
||
|
return {} unless definition.present?
|
||
|
|
||
|
Gitlab::Usage::Metric.new(definition).method(output_method).call
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|