Commit e17529b4 authored by syasonik's avatar syasonik

Show multimetric embeds on a single chart

When several user-defined prometheus metrics exist with
the same group, title, and y-axis label, they are grouped
onto a single panel. This change updated embeds to also
display these metrics on a single panel, rather than
separating them out one metric per panel.
parent b026efe9
...@@ -57,7 +57,7 @@ module Metrics ...@@ -57,7 +57,7 @@ module Metrics
# @return [Hash] # @return [Hash]
override :raw_dashboard override :raw_dashboard
def raw_dashboard def raw_dashboard
panels_not_found!(identifiers) if panels.empty? panels_not_found!(identifiers) if metrics.empty?
{ 'panel_groups' => [{ 'panels' => panels }] } { 'panel_groups' => [{ 'panels' => panels }] }
end end
...@@ -66,11 +66,20 @@ module Metrics ...@@ -66,11 +66,20 @@ module Metrics
# Generated dashboard panels for each metric which # Generated dashboard panels for each metric which
# matches the provided input. # matches the provided input.
#
# As the panel is generated
# on the fly, we're using default values for info
# not represented in the DB.
#
# @return [Array<Hash>] # @return [Array<Hash>]
def panels def panels
strong_memoize(:panels) do [{
metrics.map { |metric| panel_for_metric(metric) } type: DEFAULT_PANEL_TYPE,
end weight: DEFAULT_PANEL_WEIGHT,
title: title,
y_label: y_label,
metrics: metrics.map(&:to_metric_hash)
}]
end end
# Metrics which match the provided inputs. # Metrics which match the provided inputs.
...@@ -78,12 +87,14 @@ module Metrics ...@@ -78,12 +87,14 @@ module Metrics
# displayed in a single panel/chart. # displayed in a single panel/chart.
# @return [ActiveRecord::AssociationRelation<PromtheusMetric>] # @return [ActiveRecord::AssociationRelation<PromtheusMetric>]
def metrics def metrics
PrometheusMetricsFinder.new( strong_memoize(:metrics) do
project: project, PrometheusMetricsFinder.new(
group: group_key, project: project,
title: title, group: group_key,
y_label: y_label title: title,
).execute y_label: y_label
).execute
end
end end
# Returns a symbol representing the group that # Returns a symbol representing the group that
...@@ -101,22 +112,6 @@ module Metrics ...@@ -101,22 +112,6 @@ module Metrics
.to_s .to_s
end end
end end
# Returns a representation of a PromtheusMetric
# as a dashboard panel. As the panel is generated
# on the fly, we're using default values for info
# not represented in the DB.
#
# @return [Hash]
def panel_for_metric(metric)
{
type: DEFAULT_PANEL_TYPE,
weight: DEFAULT_PANEL_WEIGHT,
title: metric.title,
y_label: metric.y_label,
metrics: [metric.to_metric_hash]
}
end
end end
end end
end end
---
title: Show multimetric embeds on a single chart
merge_request: 28841
author:
type: fixed
...@@ -121,11 +121,18 @@ describe Metrics::Dashboard::CustomMetricEmbedService do ...@@ -121,11 +121,18 @@ describe Metrics::Dashboard::CustomMetricEmbedService do
it_behaves_like 'valid embedded dashboard service response' it_behaves_like 'valid embedded dashboard service response'
it 'includes both metrics' do it 'includes both metrics in a single panel' do
result = service_call result = service_call
included_queries = all_queries(result[:dashboard])
expect(included_queries).to include('avg(metric_2)', 'avg(metric)') panel_groups = result[:dashboard][:panel_groups]
panels = panel_groups[0][:panels]
metrics = panels[0][:metrics]
queries = metrics.map { |metric| metric[:query_range] }
expect(panel_groups.length).to eq(1)
expect(panels.length).to eq(1)
expect(metrics.length).to eq(2)
expect(queries).to include('avg(metric_2)', 'avg(metric)')
end end
end end
end end
...@@ -136,16 +143,4 @@ describe Metrics::Dashboard::CustomMetricEmbedService do ...@@ -136,16 +143,4 @@ describe Metrics::Dashboard::CustomMetricEmbedService do
it_behaves_like 'misconfigured dashboard service response', :not_found it_behaves_like 'misconfigured dashboard service response', :not_found
end end
end end
private
def all_queries(dashboard)
dashboard[:panel_groups].flat_map do |group|
group[:panels].flat_map do |panel|
panel[:metrics].map do |metric|
metric[:query_range]
end
end
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment