Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb')
-rw-r--r--lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb151
1 files changed, 0 insertions, 151 deletions
diff --git a/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb b/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb
deleted file mode 100644
index 03370ae7370..00000000000
--- a/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb
+++ /dev/null
@@ -1,151 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Metrics
- module Dashboard
- module Stages
- class GrafanaFormatter < BaseStage
- include Gitlab::Utils::StrongMemoize
-
- CHART_TYPE = 'area-chart'
- PROXY_PATH = 'api/v1/query_range'
-
- # Reformats the specified panel in the Gitlab
- # dashboard-yml format
- def transform!
- validate_input!
-
- new_dashboard = formatted_dashboard
-
- dashboard.clear
- dashboard.merge!(new_dashboard)
- end
-
- private
-
- def validate_input!
- ::Grafana::Validator.new(
- grafana_dashboard,
- datasource,
- panel,
- query_params
- ).validate!
- rescue ::Grafana::Validator::Error => e
- raise ::Gitlab::Metrics::Dashboard::Errors::DashboardProcessingError, e.message
- end
-
- def formatted_dashboard
- { panel_groups: [{ panels: [formatted_panel] }] }
- end
-
- def formatted_panel
- {
- title: panel[:title],
- type: CHART_TYPE,
- y_label: '', # Grafana panels do not include a Y-Axis label
- metrics: panel[:targets].map.with_index do |target, idx|
- formatted_metric(target, idx)
- end
- }
- end
-
- def formatted_metric(metric, idx)
- {
- id: "#{metric[:legendFormat]}_#{idx}",
- query_range: format_query(metric),
- label: replace_variables(metric[:legendFormat])
- }.compact
- end
-
- # Panel specified by the url from the Grafana dashboard
- def panel
- strong_memoize(:panel) do
- grafana_dashboard[:dashboard][:panels].find do |panel|
- query_params[:panelId] ? matching_panel?(panel) : valid_panel?(panel)
- end
- end
- end
-
- # Determines whether a given panel is the one
- # specified by the linked grafana url
- def matching_panel?(panel)
- panel[:id].to_s == query_params[:panelId]
- end
-
- # Determines whether any given panel has the potenial
- # to return valid results from grafana/prometheus
- def valid_panel?(panel)
- ::Grafana::Validator
- .new(grafana_dashboard, datasource, panel, query_params)
- .valid?
- end
-
- # Grafana url query parameters. Includes information
- # on which panel to select and time range.
- def query_params
- strong_memoize(:query_params) do
- Gitlab::Metrics::Dashboard::Url.parse_query(grafana_url)
- end
- end
-
- # Reformats query for compatibility with prometheus api.
- def format_query(metric)
- expression = remove_new_lines(metric[:expr])
- expression = replace_variables(expression)
- replace_global_variables(expression, metric)
- end
-
- # Accomodates instance-defined Grafana variables.
- # These are variables defined by users, and values
- # must be provided in the query parameters.
- def replace_variables(expression)
- return expression unless grafana_dashboard[:dashboard][:templating]
-
- grafana_dashboard[:dashboard][:templating][:list]
- .sort_by { |variable| variable[:name].length }
- .each do |variable|
- variable_value = query_params[:"var-#{variable[:name]}"]
-
- expression = expression.gsub("$#{variable[:name]}", variable_value)
- expression = expression.gsub("[[#{variable[:name]}]]", variable_value)
- expression = expression.gsub("{{#{variable[:name]}}}", variable_value)
- end
-
- expression
- end
-
- # Replaces Grafana global built-in variables with values.
- # Only $__interval and $__from and $__to are supported.
- #
- # See https://grafana.com/docs/reference/templating/#global-built-in-variables
- def replace_global_variables(expression, metric)
- expression = expression.gsub('$__interval', metric[:interval]) if metric[:interval]
- expression = expression.gsub('$__from', query_params[:from])
- expression.gsub('$__to', query_params[:to])
- end
-
- # Removes new lines from expression.
- def remove_new_lines(expression)
- expression.gsub(/\R+/, '')
- end
-
- # Grafana datasource object corresponding to the
- # specified dashboard
- def datasource
- params[:datasource]
- end
-
- # The specified Grafana dashboard
- def grafana_dashboard
- params[:grafana_dashboard]
- end
-
- # The URL specifying which Grafana panel to embed
- def grafana_url
- params[:grafana_url]
- end
- end
- end
- end
- end
-end