diff options
Diffstat (limited to 'app/services/metrics/dashboard')
14 files changed, 105 insertions, 40 deletions
diff --git a/app/services/metrics/dashboard/base_service.rb b/app/services/metrics/dashboard/base_service.rb index 5fa127d64b2..5be8ae62548 100644 --- a/app/services/metrics/dashboard/base_service.rb +++ b/app/services/metrics/dashboard/base_service.rb @@ -13,7 +13,7 @@ module Metrics STAGES::MetricEndpointInserter, STAGES::VariableEndpointInserter, STAGES::PanelIdsInserter, - STAGES::Sorter, + STAGES::TrackPanelType, STAGES::AlertsInserter, STAGES::UrlValidator ].freeze @@ -34,7 +34,7 @@ module Metrics # Returns an un-processed dashboard from the cache. def raw_dashboard - Gitlab::Metrics::Dashboard::Cache.fetch(cache_key) { get_raw_dashboard } + Gitlab::Metrics::Dashboard::Cache.for(project).fetch(cache_key) { get_raw_dashboard } end # Should return true if this dashboard service is for an out-of-the-box diff --git a/app/services/metrics/dashboard/clone_dashboard_service.rb b/app/services/metrics/dashboard/clone_dashboard_service.rb index a6bece391f2..d9bd9423a1b 100644 --- a/app/services/metrics/dashboard/clone_dashboard_service.rb +++ b/app/services/metrics/dashboard/clone_dashboard_service.rb @@ -9,12 +9,11 @@ module Metrics include Gitlab::Utils::StrongMemoize ALLOWED_FILE_TYPE = '.yml' - USER_DASHBOARDS_DIR = ::Metrics::Dashboard::CustomDashboardService::DASHBOARD_ROOT + USER_DASHBOARDS_DIR = ::Gitlab::Metrics::Dashboard::RepoDashboardFinder::DASHBOARD_ROOT SEQUENCES = { ::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH => [ ::Gitlab::Metrics::Dashboard::Stages::CommonMetricsInserter, - ::Gitlab::Metrics::Dashboard::Stages::CustomMetricsInserter, - ::Gitlab::Metrics::Dashboard::Stages::Sorter + ::Gitlab::Metrics::Dashboard::Stages::CustomMetricsInserter ].freeze, ::Metrics::Dashboard::SelfMonitoringDashboardService::DASHBOARD_PATH => [ @@ -22,8 +21,7 @@ module Metrics ].freeze, ::Metrics::Dashboard::ClusterDashboardService::DASHBOARD_PATH => [ - ::Gitlab::Metrics::Dashboard::Stages::CommonMetricsInserter, - ::Gitlab::Metrics::Dashboard::Stages::Sorter + ::Gitlab::Metrics::Dashboard::Stages::CommonMetricsInserter ].freeze }.freeze @@ -112,7 +110,7 @@ module Metrics end def push_authorized? - Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(branch) + Gitlab::UserAccess.new(current_user, container: project).can_push_to_branch?(branch) end def dashboard_template diff --git a/app/services/metrics/dashboard/cluster_dashboard_service.rb b/app/services/metrics/dashboard/cluster_dashboard_service.rb index bfd5abf1126..4a28e847fdd 100644 --- a/app/services/metrics/dashboard/cluster_dashboard_service.rb +++ b/app/services/metrics/dashboard/cluster_dashboard_service.rb @@ -9,12 +9,11 @@ module Metrics DASHBOARD_NAME = 'Cluster' # SHA256 hash of dashboard content - DASHBOARD_VERSION = '9349afc1d96329c08ab478ea0b77db94ee5cc2549b8c754fba67a7f424666b22' + DASHBOARD_VERSION = 'e1a4f8cc2c044cf32273af2cd775eb484729baac0995db687d81d92686bf588e' SEQUENCE = [ STAGES::ClusterEndpointInserter, - STAGES::PanelIdsInserter, - STAGES::Sorter + STAGES::PanelIdsInserter ].freeze class << self diff --git a/app/services/metrics/dashboard/custom_dashboard_service.rb b/app/services/metrics/dashboard/custom_dashboard_service.rb index 741738cc3af..f0f19bf2ba3 100644 --- a/app/services/metrics/dashboard/custom_dashboard_service.rb +++ b/app/services/metrics/dashboard/custom_dashboard_service.rb @@ -6,16 +6,13 @@ module Metrics module Dashboard class CustomDashboardService < ::Metrics::Dashboard::BaseService - DASHBOARD_ROOT = ".gitlab/dashboards" - class << self def valid_params?(params) params[:dashboard_path].present? end def all_dashboard_paths(project) - file_finder(project) - .list_files_for(DASHBOARD_ROOT) + project.repository.user_defined_metrics_dashboard_paths .map do |filepath| { path: filepath, @@ -27,13 +24,9 @@ module Metrics end end - def file_finder(project) - Gitlab::Template::Finders::RepoTemplateFinder.new(project, DASHBOARD_ROOT, '.yml') - end - # Grabs the filepath after the base directory. def name_for_path(filepath) - filepath.delete_prefix("#{DASHBOARD_ROOT}/") + filepath.delete_prefix("#{Gitlab::Metrics::Dashboard::RepoDashboardFinder::DASHBOARD_ROOT}/") end end @@ -41,7 +34,7 @@ module Metrics # Searches the project repo for a custom-defined dashboard. def get_raw_dashboard - yml = self.class.file_finder(project).read(dashboard_path) + yml = Gitlab::Metrics::Dashboard::RepoDashboardFinder.read_dashboard(project, dashboard_path) load_yaml(yml) end diff --git a/app/services/metrics/dashboard/custom_metric_embed_service.rb b/app/services/metrics/dashboard/custom_metric_embed_service.rb index 22b592c7aa5..229bd17f5cf 100644 --- a/app/services/metrics/dashboard/custom_metric_embed_service.rb +++ b/app/services/metrics/dashboard/custom_metric_embed_service.rb @@ -75,7 +75,6 @@ module Metrics def panels [{ type: DEFAULT_PANEL_TYPE, - weight: DEFAULT_PANEL_WEIGHT, title: title, y_label: y_label, metrics: metrics.map(&:to_metric_hash) diff --git a/app/services/metrics/dashboard/dynamic_embed_service.rb b/app/services/metrics/dashboard/dynamic_embed_service.rb index ff540c30579..0b198ecbbe9 100644 --- a/app/services/metrics/dashboard/dynamic_embed_service.rb +++ b/app/services/metrics/dashboard/dynamic_embed_service.rb @@ -18,7 +18,7 @@ module Metrics # Determines whether the provided params are sufficient # to uniquely identify a panel from a yml-defined dashboard. # - # See https://docs.gitlab.com/ee/user/project/integrations/prometheus.html#defining-custom-dashboards-per-project + # See https://docs.gitlab.com/ee/operations/metrics/dashboards/index.html#defining-custom-dashboards-per-project # for additional info on defining custom dashboards. def valid_params?(params) [ diff --git a/app/services/metrics/dashboard/gitlab_alert_embed_service.rb b/app/services/metrics/dashboard/gitlab_alert_embed_service.rb index 08d65413e1d..33c93b25c71 100644 --- a/app/services/metrics/dashboard/gitlab_alert_embed_service.rb +++ b/app/services/metrics/dashboard/gitlab_alert_embed_service.rb @@ -8,6 +8,7 @@ module Metrics module Dashboard class GitlabAlertEmbedService < ::Metrics::Dashboard::BaseEmbedService + include Gitlab::Metrics::Dashboard::Defaults include Gitlab::Utils::StrongMemoize SEQUENCE = [ @@ -63,7 +64,8 @@ module Metrics { title: prometheus_metric.title, y_label: prometheus_metric.y_label, - metrics: [prometheus_metric.to_metric_hash] + metrics: [prometheus_metric.to_metric_hash], + type: DEFAULT_PANEL_TYPE } end diff --git a/app/services/metrics/dashboard/grafana_metric_embed_service.rb b/app/services/metrics/dashboard/grafana_metric_embed_service.rb index 8e72a185406..b8c5c17c738 100644 --- a/app/services/metrics/dashboard/grafana_metric_embed_service.rb +++ b/app/services/metrics/dashboard/grafana_metric_embed_service.rb @@ -33,7 +33,7 @@ module Metrics def from_cache(project_id, user_id, grafana_url) project = Project.find(project_id) - user = User.find(user_id) + user = User.find(user_id) if user_id.present? new(project, user, grafana_url: grafana_url) end @@ -56,7 +56,7 @@ module Metrics end def cache_key(*args) - [project.id, current_user.id, grafana_url] + [project.id, current_user&.id, grafana_url] end # Required for ReactiveCaching; Usage overridden by diff --git a/app/services/metrics/dashboard/panel_preview_service.rb b/app/services/metrics/dashboard/panel_preview_service.rb new file mode 100644 index 00000000000..5b24d817fb6 --- /dev/null +++ b/app/services/metrics/dashboard/panel_preview_service.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +# Ingest YAML fragment with metrics dashboard panel definition +# https://docs.gitlab.com/ee/operations/metrics/dashboards/yaml.html#panel-panels-properties +# process it and returns renderable json version +module Metrics + module Dashboard + class PanelPreviewService + SEQUENCE = [ + ::Gitlab::Metrics::Dashboard::Stages::CommonMetricsInserter, + ::Gitlab::Metrics::Dashboard::Stages::MetricEndpointInserter, + ::Gitlab::Metrics::Dashboard::Stages::PanelIdsInserter, + ::Gitlab::Metrics::Dashboard::Stages::AlertsInserter, + ::Gitlab::Metrics::Dashboard::Stages::UrlValidator + ].freeze + + HANDLED_PROCESSING_ERRORS = [ + Gitlab::Metrics::Dashboard::Errors::DashboardProcessingError, + Gitlab::Config::Loader::Yaml::NotHashError, + Gitlab::Config::Loader::Yaml::DataTooLargeError, + Gitlab::Config::Loader::FormatError + ].freeze + + def initialize(project, panel_yaml, environment) + @project, @panel_yaml, @environment = project, panel_yaml, environment + end + + def execute + dashboard = ::Gitlab::Metrics::Dashboard::Processor.new(project, dashboard_structure, SEQUENCE, environment: environment).process + ServiceResponse.success(payload: dashboard[:panel_groups][0][:panels][0]) + rescue *HANDLED_PROCESSING_ERRORS => error + ServiceResponse.error(message: error.message) + end + + private + + attr_accessor :project, :panel_yaml, :environment + + def dashboard_structure + { + panel_groups: [ + { + panels: [panel_hash] + } + ] + } + end + + def panel_hash + ::Gitlab::Config::Loader::Yaml.new(panel_yaml).load_raw! + end + end + end +end diff --git a/app/services/metrics/dashboard/pod_dashboard_service.rb b/app/services/metrics/dashboard/pod_dashboard_service.rb index 8699189deac..c83f8618460 100644 --- a/app/services/metrics/dashboard/pod_dashboard_service.rb +++ b/app/services/metrics/dashboard/pod_dashboard_service.rb @@ -4,10 +4,28 @@ module Metrics module Dashboard class PodDashboardService < ::Metrics::Dashboard::PredefinedDashboardService DASHBOARD_PATH = 'config/prometheus/pod_metrics.yml' - DASHBOARD_NAME = 'Pod Health' + DASHBOARD_NAME = N_('K8s pod health') # SHA256 hash of dashboard content - DASHBOARD_VERSION = 'f12f641d2575d5dcb69e2c633ff5231dbd879ad35020567d8fc4e1090bfdb4b4' + DASHBOARD_VERSION = '3a91b32f91b2dd3d90275333c0ea3630b3f3f37c4296ede5b5eef59bf523d66b' + + SEQUENCE = [ + STAGES::MetricEndpointInserter, + STAGES::VariableEndpointInserter, + STAGES::PanelIdsInserter + ].freeze + + class << self + def all_dashboard_paths(_project) + [{ + path: DASHBOARD_PATH, + display_name: _(DASHBOARD_NAME), + default: false, + system_dashboard: false, + out_of_the_box_dashboard: out_of_the_box_dashboard? + }] + end + end private diff --git a/app/services/metrics/dashboard/predefined_dashboard_service.rb b/app/services/metrics/dashboard/predefined_dashboard_service.rb index c21083475f0..abdef66c2e0 100644 --- a/app/services/metrics/dashboard/predefined_dashboard_service.rb +++ b/app/services/metrics/dashboard/predefined_dashboard_service.rb @@ -12,8 +12,7 @@ module Metrics SEQUENCE = [ STAGES::MetricEndpointInserter, STAGES::VariableEndpointInserter, - STAGES::PanelIdsInserter, - STAGES::Sorter + STAGES::PanelIdsInserter ].freeze class << self @@ -30,6 +29,11 @@ module Metrics end end + # Returns an un-processed dashboard from the cache. + def raw_dashboard + Gitlab::Metrics::Dashboard::Cache.fetch(cache_key) { get_raw_dashboard } + end + private def dashboard_version diff --git a/app/services/metrics/dashboard/self_monitoring_dashboard_service.rb b/app/services/metrics/dashboard/self_monitoring_dashboard_service.rb index f1f5cd7d77e..0651e569d07 100644 --- a/app/services/metrics/dashboard/self_monitoring_dashboard_service.rb +++ b/app/services/metrics/dashboard/self_monitoring_dashboard_service.rb @@ -6,17 +6,16 @@ module Metrics module Dashboard class SelfMonitoringDashboardService < ::Metrics::Dashboard::PredefinedDashboardService DASHBOARD_PATH = 'config/prometheus/self_monitoring_default.yml' - DASHBOARD_NAME = N_('Default dashboard') + DASHBOARD_NAME = N_('Overview') # SHA256 hash of dashboard content - DASHBOARD_VERSION = '1dff3e3cb76e73c8e368823c98b34c61aec0d141978450dea195a3b3dc2415d6' + DASHBOARD_VERSION = '0f7ade2022e09f1a1da8e883cc95d84b9557e1e0e9b015c51eb964296aa73098' SEQUENCE = [ STAGES::CustomMetricsInserter, STAGES::MetricEndpointInserter, STAGES::VariableEndpointInserter, - STAGES::PanelIdsInserter, - STAGES::Sorter + STAGES::PanelIdsInserter ].freeze class << self @@ -29,7 +28,7 @@ module Metrics path: DASHBOARD_PATH, display_name: _(DASHBOARD_NAME), default: true, - system_dashboard: false, + system_dashboard: true, out_of_the_box_dashboard: out_of_the_box_dashboard? }] end diff --git a/app/services/metrics/dashboard/system_dashboard_service.rb b/app/services/metrics/dashboard/system_dashboard_service.rb index 5c3562b8ca0..29b8f23f40d 100644 --- a/app/services/metrics/dashboard/system_dashboard_service.rb +++ b/app/services/metrics/dashboard/system_dashboard_service.rb @@ -6,10 +6,10 @@ module Metrics module Dashboard class SystemDashboardService < ::Metrics::Dashboard::PredefinedDashboardService DASHBOARD_PATH = 'config/prometheus/common_metrics.yml' - DASHBOARD_NAME = N_('Default dashboard') + DASHBOARD_NAME = N_('Overview') # SHA256 hash of dashboard content - DASHBOARD_VERSION = '4685fe386c25b1a786b3be18f79bb2ee9828019003e003816284cdb634fa3e13' + DASHBOARD_VERSION = 'ce9ae27d2913f637de851d61099bc4151583eae68b1386a2176339ef6e653223' SEQUENCE = [ STAGES::CommonMetricsInserter, @@ -18,7 +18,6 @@ module Metrics STAGES::MetricEndpointInserter, STAGES::VariableEndpointInserter, STAGES::PanelIdsInserter, - STAGES::Sorter, STAGES::AlertsInserter ].freeze diff --git a/app/services/metrics/dashboard/update_dashboard_service.rb b/app/services/metrics/dashboard/update_dashboard_service.rb index d37d06a0222..d990e96ecb5 100644 --- a/app/services/metrics/dashboard/update_dashboard_service.rb +++ b/app/services/metrics/dashboard/update_dashboard_service.rb @@ -7,7 +7,7 @@ module Metrics include Stepable ALLOWED_FILE_TYPE = '.yml' - USER_DASHBOARDS_DIR = ::Metrics::Dashboard::CustomDashboardService::DASHBOARD_ROOT + USER_DASHBOARDS_DIR = ::Gitlab::Metrics::Dashboard::RepoDashboardFinder::DASHBOARD_ROOT steps :check_push_authorized, :check_branch_name, @@ -68,7 +68,7 @@ module Metrics end def push_authorized? - Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(branch) + Gitlab::UserAccess.new(current_user, container: project).can_push_to_branch?(branch) end def valid_branch_name? |