48 lines
1.5 KiB
Ruby
48 lines
1.5 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 definitions 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
|
|
rescue StandardError => error
|
|
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
|
|
metric_fallback(key_path)
|
|
end
|
|
|
|
def metric_fallback(key_path)
|
|
::Gitlab::Usage::Metrics::KeyPathProcessor.process(key_path, ::Gitlab::Utils::UsageData::FALLBACK)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|