debian-mirror-gitlab/lib/gitlab/prometheus/queries/query_additional_metrics.rb

102 lines
3 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
2017-09-10 17:25:29 +05:30
module Gitlab
module Prometheus
module Queries
module QueryAdditionalMetrics
2019-12-04 20:38:33 +05:30
prepend_if_ee('EE::Gitlab::Prometheus::Queries::QueryAdditionalMetrics') # rubocop: disable Cop/InjectEnterpriseEditionModule
2018-11-18 11:00:15 +05:30
def query_metrics(project, environment, query_context)
2018-03-27 19:54:05 +05:30
matched_metrics(project).map(&query_group(query_context))
.select(&method(:group_with_any_metrics))
end
protected
def query_group(query_context)
2017-09-10 17:25:29 +05:30
query_processor = method(:process_query).curry[query_context]
2018-03-27 19:54:05 +05:30
lambda do |group|
2017-09-10 17:25:29 +05:30
metrics = group.metrics.map do |metric|
2018-11-18 11:00:15 +05:30
metric_hsh = {
2017-09-10 17:25:29 +05:30
title: metric.title,
weight: metric.weight,
y_label: metric.y_label,
queries: metric.queries.map(&query_processor).select(&method(:query_with_result))
}
2018-11-18 11:00:15 +05:30
metric_hsh[:id] = metric.id if metric.id
metric_hsh
2017-09-10 17:25:29 +05:30
end
{
group: group.name,
priority: group.priority,
metrics: metrics.select(&method(:metric_with_any_queries))
}
end
end
private
def metric_with_any_queries(metric)
metric[:queries]&.count&.> 0
end
def group_with_any_metrics(group)
group[:metrics]&.count&.> 0
end
def query_with_result(query)
query[:result]&.any? do |item|
item&.[](:values)&.any? || item&.[](:value)&.any?
end
end
def process_query(context, query)
query = query.dup
result =
if query.key?(:query_range)
query[:query_range] %= context
2020-04-22 19:07:51 +05:30
client_query_range(query[:query_range], start_time: context[:timeframe_start], end_time: context[:timeframe_end])
2017-09-10 17:25:29 +05:30
else
query[:query] %= context
client_query(query[:query], time: context[:timeframe_end])
end
query[:result] = result&.map(&:deep_symbolize_keys)
query
end
def available_metrics
@available_metrics ||= client_label_values || []
end
2018-03-27 19:54:05 +05:30
def matched_metrics(project)
result = Gitlab::Prometheus::MetricGroup.for_project(project).map do |group|
2017-09-10 17:25:29 +05:30
group.metrics.select! do |metric|
metric.required_metrics.all?(&available_metrics.method(:include?))
end
group
end
result.select { |group| group.metrics.any? }
end
def common_query_context(environment, timeframe_start:, timeframe_end:)
2019-02-15 15:39:39 +05:30
base_query_context(timeframe_start, timeframe_end)
.merge(QueryVariables.call(environment))
2018-03-27 19:54:05 +05:30
end
def base_query_context(timeframe_start, timeframe_end)
{
timeframe_start: timeframe_start,
timeframe_end: timeframe_end
2017-09-10 17:25:29 +05:30
}
end
end
end
end
end