From 447e088a7fbf2ff73494ad8ee34c15c6637545b1 Mon Sep 17 00:00:00 2001 From: Jose Vargas <jvargas@gitlab.com> Date: Tue, 21 Jul 2020 18:41:14 -0500 Subject: [PATCH] Add metrics dashboard template finder This adds the necessary backend that manages the *.metrics-dashboard.yml template files --- app/finders/template_finder.rb | 3 +- app/helpers/blob_helper.rb | 4 ++ ...ics_dashboard_template_selection_v13_3.png | Bin 0 -> 36268 bytes ...board_template_selection_web_ide_v13_3.png | Bin 0 -> 26123 bytes .../operations/metrics/templates.md | 20 ++++++ ee/app/finders/ee/template_finder.rb | 3 +- lib/api/project_templates.rb | 4 +- .../templates/Default.metrics-dashboard.yml | 24 +++++++ lib/gitlab/metrics/templates/index.md | 3 + .../template/metrics_dashboard_template.rb | 32 +++++++++ .../metrics_dashboard_template_spec.rb | 66 ++++++++++++++++++ spec/requests/api/project_templates_spec.rb | 21 ++++++ 12 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 doc/development/operations/metrics/img/metrics_dashboard_template_selection_v13_3.png create mode 100644 doc/development/operations/metrics/img/metrics_dashboard_template_selection_web_ide_v13_3.png create mode 100644 doc/development/operations/metrics/templates.md create mode 100644 lib/gitlab/metrics/templates/Default.metrics-dashboard.yml create mode 100644 lib/gitlab/metrics/templates/index.md create mode 100644 lib/gitlab/template/metrics_dashboard_template.rb create mode 100644 spec/lib/gitlab/template/metrics_dashboard_template_spec.rb diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb index 78c8392f1cd..9f7fca154ec 100644 --- a/app/finders/template_finder.rb +++ b/app/finders/template_finder.rb @@ -6,7 +6,8 @@ class TemplateFinder VENDORED_TEMPLATES = HashWithIndifferentAccess.new( dockerfiles: ::Gitlab::Template::DockerfileTemplate, gitignores: ::Gitlab::Template::GitignoreTemplate, - gitlab_ci_ymls: ::Gitlab::Template::GitlabCiYmlTemplate + gitlab_ci_ymls: ::Gitlab::Template::GitlabCiYmlTemplate, + metrics_dashboard_ymls: ::Gitlab::Template::MetricsDashboardTemplate ).freeze class << self diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 3a7b649b1fa..615c834c529 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -200,6 +200,10 @@ module BlobHelper @gitlab_ci_ymls ||= template_dropdown_names(TemplateFinder.build(:gitlab_ci_ymls, project).execute) end + def metrics_dashboard_ymls(project) + @metrics_dashboard_ymls ||= template_dropdown_names(TemplateFinder.build(:metrics_dashboard_ymls, project).execute) + end + def dockerfile_names(project) @dockerfile_names ||= template_dropdown_names(TemplateFinder.build(:dockerfiles, project).execute) end diff --git a/doc/development/operations/metrics/img/metrics_dashboard_template_selection_v13_3.png b/doc/development/operations/metrics/img/metrics_dashboard_template_selection_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8401a1747530df4095b28f472917cfc35aaaf8 GIT binary patch literal 36268 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 literal 0 HcmV?d00001 diff --git a/doc/development/operations/metrics/img/metrics_dashboard_template_selection_web_ide_v13_3.png b/doc/development/operations/metrics/img/metrics_dashboard_template_selection_web_ide_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..650f66e9a307650943d7224131e943ccc38cff84 GIT binary patch literal 26123 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 ZPV6i(GNW*-C%4>m*x16T@WAmae+SNeFcbg) literal 0 HcmV?d00001 diff --git a/doc/development/operations/metrics/templates.md b/doc/development/operations/metrics/templates.md new file mode 100644 index 00000000000..c77af2693c4 --- /dev/null +++ b/doc/development/operations/metrics/templates.md @@ -0,0 +1,20 @@ +# Development guide for Metrics Dashboards templates + +This document explains how to develop Metrics Dashboards templates + +## Place the template file in the relevant directory + +All template files reside in the `lib/gitlab/metrics/templates` directory + +## Criteria + +All the templates must be named with the `*.metrics-dashboard.yml` suffix. + +The file must follow the [custom dashboard syntax](../../../operations/metrics/dashboards/yaml.md). + +### Make sure the new template can be selected in the UI + +All the templates available in `lib/gitlab/metrics/templates` are selectable in the **New File** UI from the repository view as well from the **WebIDE** New File template selector. + + + diff --git a/ee/app/finders/ee/template_finder.rb b/ee/app/finders/ee/template_finder.rb index 759087d8336..1d0885c3138 100644 --- a/ee/app/finders/ee/template_finder.rb +++ b/ee/app/finders/ee/template_finder.rb @@ -7,7 +7,8 @@ module EE CUSTOM_TEMPLATES = HashWithIndifferentAccess.new( dockerfiles: ::Gitlab::Template::CustomDockerfileTemplate, gitignores: ::Gitlab::Template::CustomGitignoreTemplate, - gitlab_ci_ymls: ::Gitlab::Template::CustomGitlabCiYmlTemplate + gitlab_ci_ymls: ::Gitlab::Template::CustomGitlabCiYmlTemplate, + metrics_dashboard_ymls: ::Gitlab::Template::MetricsDashboardTemplate ).freeze attr_reader :custom_templates diff --git a/lib/api/project_templates.rb b/lib/api/project_templates.rb index f0fe4d85c8f..400893bc659 100644 --- a/lib/api/project_templates.rb +++ b/lib/api/project_templates.rb @@ -4,7 +4,7 @@ module API class ProjectTemplates < Grape::API::Instance include PaginationParams - TEMPLATE_TYPES = %w[dockerfiles gitignores gitlab_ci_ymls licenses].freeze + TEMPLATE_TYPES = %w[dockerfiles gitignores gitlab_ci_ymls licenses metrics_dashboard_ymls].freeze # The regex is needed to ensure a period (e.g. agpl-3.0) # isn't confused with a format type. We also need to allow encoded # values (e.g. C%2B%2B for C++), so allow % and + as well. @@ -14,7 +14,7 @@ module API params do requires :id, type: String, desc: 'The ID of a project' - requires :type, type: String, values: TEMPLATE_TYPES, desc: 'The type (dockerfiles|gitignores|gitlab_ci_ymls|licenses) of the template' + requires :type, type: String, values: TEMPLATE_TYPES, desc: 'The type (dockerfiles|gitignores|gitlab_ci_ymls|licenses|metrics_dashboard_ymls) of the template' end resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do desc 'Get a list of templates available to this project' do diff --git a/lib/gitlab/metrics/templates/Default.metrics-dashboard.yml b/lib/gitlab/metrics/templates/Default.metrics-dashboard.yml new file mode 100644 index 00000000000..cd425c06651 --- /dev/null +++ b/lib/gitlab/metrics/templates/Default.metrics-dashboard.yml @@ -0,0 +1,24 @@ +# Only one dashboard should be defined per file +# More info: https://docs.gitlab.com/ee/operations/metrics/dashboards/yaml.html +dashboard: 'Single Stat' + +# This is where all of the variables that can be manipulated via the UI +# are initialized +# Check out: https://docs.gitlab.com/ee/operations/metrics/dashboards/templating_variables.html#templating-variables-for-metrics-dashboards-core +templating: + variables: + job: 'prometheus' + +# For more information about the required properties of panel_groups +# please visit: https://docs.gitlab.com/ee/operations/metrics/dashboards/yaml.html#panel-group-panel_groups-properties +panel_groups: + - group: 'Memory' + panels: + - title: Prometheus + type: single-stat + metrics: + # Queries that make use of variables need to have double curly brackets {} + # set to the variables, per the example below + query: 'max(go_memstats_alloc_bytes{job="{{job}}"}) / 1024 /1024' + unit: '%' + label: "Max" diff --git a/lib/gitlab/metrics/templates/index.md b/lib/gitlab/metrics/templates/index.md new file mode 100644 index 00000000000..59fc85899da --- /dev/null +++ b/lib/gitlab/metrics/templates/index.md @@ -0,0 +1,3 @@ +# Development guide for Metrics Dashboard templates + +Please follow [the development guideline](../../../../doc/development/operations/metrics/templates.md) diff --git a/lib/gitlab/template/metrics_dashboard_template.rb b/lib/gitlab/template/metrics_dashboard_template.rb new file mode 100644 index 00000000000..88fc3007b63 --- /dev/null +++ b/lib/gitlab/template/metrics_dashboard_template.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Gitlab + module Template + class MetricsDashboardTemplate < BaseTemplate + def content + explanation = "# This file is a template, and might need editing before it works on your project." + [explanation, super].join("\n") + end + + class << self + def extension + '.metrics-dashboard.yml' + end + + def categories + { + "General" => '' + } + end + + def base_dir + Rails.root.join('lib/gitlab/metrics/templates') + end + + def finder(project = nil) + Gitlab::Template::Finders::GlobalTemplateFinder.new(self.base_dir, self.extension, self.categories) + end + end + end + end +end diff --git a/spec/lib/gitlab/template/metrics_dashboard_template_spec.rb b/spec/lib/gitlab/template/metrics_dashboard_template_spec.rb new file mode 100644 index 00000000000..163e4349b70 --- /dev/null +++ b/spec/lib/gitlab/template/metrics_dashboard_template_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Template::MetricsDashboardTemplate do + subject { described_class } + + describe '.all' do + it 'strips the metrics-dashboard suffix' do + expect(subject.all.first.name).not_to end_with('metrics-dashboard.yml') + end + + it 'combines the globals and rest' do + all = subject.all.map(&:name) + + expect(all).to include('Default') + end + + it 'ensures that the template name is used exactly once' do + all = subject.all.group_by(&:name) + duplicates = all.select { |_, templates| templates.length > 1 } + + expect(duplicates).to be_empty + end + end + + describe '.find' do + it 'returns nil if the file does not exist' do + expect(subject.find('nonexistent-file')).to be nil + end + + it 'returns the MetricsDashboardYml object of a valid file' do + default_dashboard = subject.find('Default') + + expect(default_dashboard).to be_a described_class + expect(default_dashboard.name).to eq('Default') + end + end + + describe '.by_category' do + it 'returns sorted results' do + result = described_class.by_category('General') + + expect(result).to eq(result.sort) + end + end + + describe '#content' do + it 'loads the full file' do + example_dashboard = subject.new(Rails.root.join('lib/gitlab/metrics/templates/Default.metrics-dashboard.yml')) + + expect(example_dashboard.name).to eq 'Default' + expect(example_dashboard.content).to start_with('#') + end + end + + describe '#<=>' do + it 'sorts lexicographically' do + one = described_class.new('a.metrics-dashboard.yml') + other = described_class.new('z.metrics-dashboard.yml') + + expect(one.<=>(other)).to be(-1) + expect([other, one].sort).to eq([one, other]) + end + end +end diff --git a/spec/requests/api/project_templates_spec.rb b/spec/requests/api/project_templates_spec.rb index 59b2b09f0bf..51123837a50 100644 --- a/spec/requests/api/project_templates_spec.rb +++ b/spec/requests/api/project_templates_spec.rb @@ -62,6 +62,15 @@ RSpec.describe API::ProjectTemplates do expect(json_response).to satisfy_one { |template| template['key'] == 'mit' } end + it 'returns metrics_dashboard_ymls' do + get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls") + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to include_pagination_headers + expect(response).to match_response_schema('public_api/v4/template_list') + expect(json_response).to satisfy_one { |template| template['key'] == 'Default' } + end + it 'returns 400 for an unknown template type' do get api("/projects/#{public_project.id}/templates/unknown") @@ -136,6 +145,14 @@ RSpec.describe API::ProjectTemplates do expect(json_response['name']).to eq('Android') end + it 'returns a specific metrics_dashboard_yml' do + get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls/Default") + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to match_response_schema('public_api/v4/template') + expect(json_response['name']).to eq('Default') + end + it 'returns a specific license' do get api("/projects/#{public_project.id}/templates/licenses/mit") @@ -166,6 +183,10 @@ RSpec.describe API::ProjectTemplates do subject { get api("/projects/#{url_encoded_path}/templates/gitlab_ci_ymls/Android") } end + it_behaves_like 'accepts project paths with dots' do + subject { get api("/projects/#{url_encoded_path}/templates/metrics_dashboard_ymls/Default") } + end + shared_examples 'path traversal attempt' do |template_type| it 'rejects invalid filenames' do get api("/projects/#{public_project.id}/templates/#{template_type}/%2e%2e%2fPython%2ea") -- 2.30.9