2018-03-17 18:26:18 +05:30
|
|
|
<script>
|
2019-12-21 20:55:43 +05:30
|
|
|
import _ from 'underscore';
|
2020-01-01 13:55:28 +05:30
|
|
|
import { mapActions, mapState, mapGetters } from 'vuex';
|
2019-12-21 20:55:43 +05:30
|
|
|
import VueDraggable from 'vuedraggable';
|
2019-10-12 21:52:04 +05:30
|
|
|
import {
|
|
|
|
GlButton,
|
|
|
|
GlDropdown,
|
|
|
|
GlDropdownItem,
|
|
|
|
GlFormGroup,
|
|
|
|
GlModal,
|
|
|
|
GlModalDirective,
|
|
|
|
GlTooltipDirective,
|
|
|
|
} from '@gitlab/ui';
|
2020-01-01 13:55:28 +05:30
|
|
|
import PanelType from 'ee_else_ce/monitoring/components/panel_type.vue';
|
2019-12-26 22:10:19 +05:30
|
|
|
import { s__ } from '~/locale';
|
2019-12-21 20:55:43 +05:30
|
|
|
import createFlash from '~/flash';
|
2018-11-08 19:23:39 +05:30
|
|
|
import Icon from '~/vue_shared/components/icon.vue';
|
2019-12-21 20:55:43 +05:30
|
|
|
import { getParameterValues, mergeUrlParams, redirectTo } from '~/lib/utils/url_utility';
|
2019-09-04 21:01:54 +05:30
|
|
|
import invalidUrl from '~/lib/utils/invalid_url';
|
2019-12-21 20:55:43 +05:30
|
|
|
import DateTimePicker from './date_time_picker/date_time_picker.vue';
|
2018-05-09 12:01:36 +05:30
|
|
|
import GraphGroup from './graph_group.vue';
|
|
|
|
import EmptyState from './empty_state.vue';
|
2020-01-01 13:55:28 +05:30
|
|
|
import GroupEmptyState from './group_empty_state.vue';
|
2019-12-21 20:55:43 +05:30
|
|
|
import TrackEventDirective from '~/vue_shared/directives/track_event';
|
2020-01-01 13:55:28 +05:30
|
|
|
import { getTimeDiff, isValidDate, getAddMetricTrackingOptions } from '../utils';
|
|
|
|
import { metricStates } from '../constants';
|
2019-03-02 22:35:43 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
export default {
|
|
|
|
components: {
|
2019-12-21 20:55:43 +05:30
|
|
|
VueDraggable,
|
2019-09-30 21:07:59 +05:30
|
|
|
PanelType,
|
2018-05-09 12:01:36 +05:30
|
|
|
GraphGroup,
|
|
|
|
EmptyState,
|
2020-01-01 13:55:28 +05:30
|
|
|
GroupEmptyState,
|
2018-11-08 19:23:39 +05:30
|
|
|
Icon,
|
2019-07-31 22:56:46 +05:30
|
|
|
GlButton,
|
2019-07-07 11:18:12 +05:30
|
|
|
GlDropdown,
|
|
|
|
GlDropdownItem,
|
2019-10-12 21:52:04 +05:30
|
|
|
GlFormGroup,
|
2019-07-31 22:56:46 +05:30
|
|
|
GlModal,
|
2019-12-21 20:55:43 +05:30
|
|
|
DateTimePicker,
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
|
|
|
directives: {
|
2019-10-12 21:52:04 +05:30
|
|
|
GlModal: GlModalDirective,
|
|
|
|
GlTooltip: GlTooltipDirective,
|
2019-12-21 20:55:43 +05:30
|
|
|
TrackEvent: TrackEventDirective,
|
2018-05-09 12:01:36 +05:30
|
|
|
},
|
|
|
|
props: {
|
2019-09-04 21:01:54 +05:30
|
|
|
externalDashboardUrl: {
|
2019-07-31 22:56:46 +05:30
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: '',
|
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
hasMetrics: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: true,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
showPanels: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: true,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
documentationPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
settingsPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
clustersPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
tagsPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
projectPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
metricsEndpoint: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
2019-09-04 21:01:54 +05:30
|
|
|
deploymentsEndpoint: {
|
2018-05-09 12:01:36 +05:30
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
emptyGettingStartedSvgPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
emptyLoadingSvgPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
emptyNoDataSvgPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
2020-01-01 13:55:28 +05:30
|
|
|
emptyNoDataSmallSvgPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
emptyUnableToConnectSvgPath: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
2018-11-08 19:23:39 +05:30
|
|
|
environmentsEndpoint: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
currentEnvironmentName: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
2019-07-31 22:56:46 +05:30
|
|
|
customMetricsAvailable: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
customMetricsPath: {
|
|
|
|
type: String,
|
2019-09-30 21:07:59 +05:30
|
|
|
required: false,
|
|
|
|
default: invalidUrl,
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
|
|
|
validateQueryPath: {
|
|
|
|
type: String,
|
2019-09-30 21:07:59 +05:30
|
|
|
required: false,
|
|
|
|
default: invalidUrl,
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
2019-09-04 21:01:54 +05:30
|
|
|
dashboardEndpoint: {
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: invalidUrl,
|
|
|
|
},
|
2019-09-30 21:07:59 +05:30
|
|
|
currentDashboard: {
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: '',
|
|
|
|
},
|
|
|
|
smallEmptyState: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
2019-12-04 20:38:33 +05:30
|
|
|
alertsEndpoint: {
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
prometheusAlertsAvailable: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
2019-12-21 20:55:43 +05:30
|
|
|
rearrangePanelsAvailable: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false,
|
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
state: 'gettingStarted',
|
2019-07-31 22:56:46 +05:30
|
|
|
formIsValid: null,
|
2019-12-21 20:55:43 +05:30
|
|
|
selectedTimeWindow: {},
|
|
|
|
isRearrangingPanels: false,
|
2019-12-26 22:10:19 +05:30
|
|
|
hasValidDates: true,
|
2018-05-09 12:01:36 +05:30
|
|
|
};
|
|
|
|
},
|
2019-07-31 22:56:46 +05:30
|
|
|
computed: {
|
|
|
|
canAddMetrics() {
|
|
|
|
return this.customMetricsAvailable && this.customMetricsPath.length;
|
|
|
|
},
|
2019-09-04 21:01:54 +05:30
|
|
|
...mapState('monitoringDashboard', [
|
2019-12-26 22:10:19 +05:30
|
|
|
'dashboard',
|
2019-09-04 21:01:54 +05:30
|
|
|
'emptyState',
|
|
|
|
'showEmptyState',
|
|
|
|
'environments',
|
|
|
|
'deploymentData',
|
|
|
|
'useDashboardEndpoint',
|
2019-09-30 21:07:59 +05:30
|
|
|
'allDashboards',
|
|
|
|
'additionalPanelTypesEnabled',
|
2019-09-04 21:01:54 +05:30
|
|
|
]),
|
2020-01-01 13:55:28 +05:30
|
|
|
...mapGetters('monitoringDashboard', ['getMetricStates']),
|
2019-10-12 21:52:04 +05:30
|
|
|
firstDashboard() {
|
2019-12-26 22:10:19 +05:30
|
|
|
return this.environmentsEndpoint.length > 0 && this.allDashboards.length > 0
|
|
|
|
? this.allDashboards[0]
|
|
|
|
: {};
|
|
|
|
},
|
|
|
|
selectedDashboard() {
|
|
|
|
return this.allDashboards.find(d => d.path === this.currentDashboard) || this.firstDashboard;
|
2019-09-04 21:01:54 +05:30
|
|
|
},
|
2019-09-30 21:07:59 +05:30
|
|
|
selectedDashboardText() {
|
2019-12-26 22:10:19 +05:30
|
|
|
return this.selectedDashboard.display_name;
|
2019-09-30 21:07:59 +05:30
|
|
|
},
|
2019-12-21 20:55:43 +05:30
|
|
|
showRearrangePanelsBtn() {
|
|
|
|
return !this.showEmptyState && this.rearrangePanelsAvailable;
|
|
|
|
},
|
2019-09-30 21:07:59 +05:30
|
|
|
addingMetricsAvailable() {
|
|
|
|
return IS_EE && this.canAddMetrics && !this.showEmptyState;
|
|
|
|
},
|
2019-12-26 22:10:19 +05:30
|
|
|
hasHeaderButtons() {
|
|
|
|
return (
|
|
|
|
this.addingMetricsAvailable ||
|
|
|
|
this.showRearrangePanelsBtn ||
|
|
|
|
this.selectedDashboard.can_edit ||
|
|
|
|
this.externalDashboardUrl.length
|
|
|
|
);
|
2019-09-30 21:07:59 +05:30
|
|
|
},
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
2018-05-09 12:01:36 +05:30
|
|
|
created() {
|
2019-09-04 21:01:54 +05:30
|
|
|
this.setEndpoints({
|
2018-05-09 12:01:36 +05:30
|
|
|
metricsEndpoint: this.metricsEndpoint,
|
2018-11-08 19:23:39 +05:30
|
|
|
environmentsEndpoint: this.environmentsEndpoint,
|
2019-09-04 21:01:54 +05:30
|
|
|
deploymentsEndpoint: this.deploymentsEndpoint,
|
|
|
|
dashboardEndpoint: this.dashboardEndpoint,
|
2019-09-30 21:07:59 +05:30
|
|
|
currentDashboard: this.currentDashboard,
|
|
|
|
projectPath: this.projectPath,
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
if (!this.hasMetrics) {
|
2019-09-04 21:01:54 +05:30
|
|
|
this.setGettingStartedEmptyState();
|
2018-05-09 12:01:36 +05:30
|
|
|
} else {
|
2019-10-12 21:52:04 +05:30
|
|
|
const defaultRange = getTimeDiff();
|
|
|
|
const start = getParameterValues('start')[0] || defaultRange.start;
|
|
|
|
const end = getParameterValues('end')[0] || defaultRange.end;
|
|
|
|
|
|
|
|
const range = {
|
|
|
|
start,
|
|
|
|
end,
|
|
|
|
};
|
|
|
|
|
2019-12-21 20:55:43 +05:30
|
|
|
this.selectedTimeWindow = range;
|
2019-10-12 21:52:04 +05:30
|
|
|
|
2019-12-21 20:55:43 +05:30
|
|
|
if (!isValidDate(start) || !isValidDate(end)) {
|
2019-12-26 22:10:19 +05:30
|
|
|
this.hasValidDates = false;
|
2019-12-21 20:55:43 +05:30
|
|
|
this.showInvalidDateError();
|
|
|
|
} else {
|
2019-12-26 22:10:19 +05:30
|
|
|
this.hasValidDates = true;
|
2019-12-21 20:55:43 +05:30
|
|
|
this.fetchData(range);
|
|
|
|
}
|
2018-05-09 12:01:36 +05:30
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
2019-09-04 21:01:54 +05:30
|
|
|
...mapActions('monitoringDashboard', [
|
|
|
|
'fetchData',
|
|
|
|
'setGettingStartedEmptyState',
|
|
|
|
'setEndpoints',
|
2019-12-26 22:10:19 +05:30
|
|
|
'setPanelGroupMetrics',
|
2019-09-04 21:01:54 +05:30
|
|
|
]),
|
2020-01-01 13:55:28 +05:30
|
|
|
updatePanels(key, panels) {
|
2019-12-26 22:10:19 +05:30
|
|
|
this.setPanelGroupMetrics({
|
2020-01-01 13:55:28 +05:30
|
|
|
panels,
|
2019-12-26 22:10:19 +05:30
|
|
|
key,
|
|
|
|
});
|
|
|
|
},
|
2020-01-01 13:55:28 +05:30
|
|
|
removePanel(key, panels, graphIndex) {
|
2019-12-26 22:10:19 +05:30
|
|
|
this.setPanelGroupMetrics({
|
2020-01-01 13:55:28 +05:30
|
|
|
panels: panels.filter((v, i) => i !== graphIndex),
|
2019-12-26 22:10:19 +05:30
|
|
|
key,
|
|
|
|
});
|
|
|
|
},
|
2019-12-21 20:55:43 +05:30
|
|
|
showInvalidDateError() {
|
|
|
|
createFlash(s__('Metrics|Link contains an invalid time window.'));
|
|
|
|
},
|
2019-10-12 21:52:04 +05:30
|
|
|
generateLink(group, title, yLabel) {
|
|
|
|
const dashboard = this.currentDashboard || this.firstDashboard.path;
|
|
|
|
const params = _.pick({ dashboard, group, title, y_label: yLabel }, value => value != null);
|
|
|
|
return mergeUrlParams(params, window.location.href);
|
|
|
|
},
|
2019-07-31 22:56:46 +05:30
|
|
|
hideAddMetricModal() {
|
|
|
|
this.$refs.addMetricModal.hide();
|
2019-07-07 11:18:12 +05:30
|
|
|
},
|
2019-12-21 20:55:43 +05:30
|
|
|
toggleRearrangingPanels() {
|
|
|
|
this.isRearrangingPanels = !this.isRearrangingPanels;
|
|
|
|
},
|
2019-07-31 22:56:46 +05:30
|
|
|
setFormValidity(isValid) {
|
|
|
|
this.formIsValid = isValid;
|
|
|
|
},
|
|
|
|
submitCustomMetricsForm() {
|
|
|
|
this.$refs.customMetricsForm.submit();
|
|
|
|
},
|
2019-12-21 20:55:43 +05:30
|
|
|
onDateTimePickerApply(timeWindowUrlParams) {
|
|
|
|
return redirectTo(mergeUrlParams(timeWindowUrlParams, window.location.href));
|
|
|
|
},
|
2020-01-01 13:55:28 +05:30
|
|
|
/**
|
|
|
|
* Return a single empty state for a group.
|
|
|
|
*
|
|
|
|
* If all states are the same a single state is returned to be displayed
|
|
|
|
* Except if the state is OK, in which case the group is displayed.
|
|
|
|
*
|
|
|
|
* @param {String} groupKey - Identifier for group
|
|
|
|
* @returns {String} state code from `metricStates`
|
|
|
|
*/
|
|
|
|
groupSingleEmptyState(groupKey) {
|
|
|
|
const states = this.getMetricStates(groupKey);
|
|
|
|
if (states.length === 1 && states[0] !== metricStates.OK) {
|
|
|
|
return states[0];
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
/**
|
|
|
|
* A group should be not collapsed if any metric is loaded (OK)
|
|
|
|
*
|
|
|
|
* @param {String} groupKey - Identifier for group
|
|
|
|
* @returns {Boolean} If the group should be collapsed
|
|
|
|
*/
|
|
|
|
collapseGroup(groupKey) {
|
|
|
|
// Collapse group if no data is available
|
|
|
|
return !this.getMetricStates(groupKey).includes(metricStates.OK);
|
|
|
|
},
|
|
|
|
getAddMetricTrackingOptions,
|
2019-07-31 22:56:46 +05:30
|
|
|
},
|
|
|
|
addMetric: {
|
|
|
|
title: s__('Metrics|Add metric'),
|
|
|
|
modalId: 'add-metric',
|
2018-05-09 12:01:36 +05:30
|
|
|
},
|
|
|
|
};
|
2018-03-17 18:26:18 +05:30
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
2019-09-30 21:07:59 +05:30
|
|
|
<div class="prometheus-graphs">
|
2019-12-21 20:55:43 +05:30
|
|
|
<div class="prometheus-graphs-header gl-p-3 pb-0 border-bottom bg-gray-light">
|
2019-10-12 21:52:04 +05:30
|
|
|
<div class="row">
|
|
|
|
<template v-if="environmentsEndpoint">
|
|
|
|
<gl-form-group
|
|
|
|
:label="__('Dashboard')"
|
|
|
|
label-size="sm"
|
|
|
|
label-for="monitor-dashboards-dropdown"
|
2019-12-21 20:55:43 +05:30
|
|
|
class="col-sm-12 col-md-6 col-lg-2"
|
2019-09-30 21:07:59 +05:30
|
|
|
>
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-dropdown
|
|
|
|
id="monitor-dashboards-dropdown"
|
|
|
|
class="mb-0 d-flex js-dashboards-dropdown"
|
|
|
|
toggle-class="dropdown-menu-toggle"
|
|
|
|
:text="selectedDashboardText"
|
2019-09-30 21:07:59 +05:30
|
|
|
>
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-dropdown-item
|
|
|
|
v-for="dashboard in allDashboards"
|
|
|
|
:key="dashboard.path"
|
|
|
|
:active="dashboard.path === currentDashboard"
|
|
|
|
active-class="is-active"
|
|
|
|
:href="`?dashboard=${dashboard.path}`"
|
|
|
|
>{{ dashboard.display_name || dashboard.path }}</gl-dropdown-item
|
|
|
|
>
|
|
|
|
</gl-dropdown>
|
|
|
|
</gl-form-group>
|
|
|
|
|
|
|
|
<gl-form-group
|
|
|
|
:label="s__('Metrics|Environment')"
|
|
|
|
label-size="sm"
|
|
|
|
label-for="monitor-environments-dropdown"
|
2019-12-21 20:55:43 +05:30
|
|
|
class="col-sm-6 col-md-6 col-lg-2"
|
2019-07-07 11:18:12 +05:30
|
|
|
>
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-dropdown
|
|
|
|
id="monitor-environments-dropdown"
|
|
|
|
class="mb-0 d-flex js-environments-dropdown"
|
|
|
|
toggle-class="dropdown-menu-toggle"
|
|
|
|
:text="currentEnvironmentName"
|
|
|
|
:disabled="environments.length === 0"
|
2019-07-31 22:56:46 +05:30
|
|
|
>
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-dropdown-item
|
|
|
|
v-for="environment in environments"
|
|
|
|
:key="environment.id"
|
|
|
|
:active="environment.name === currentEnvironmentName"
|
|
|
|
active-class="is-active"
|
|
|
|
:href="environment.metrics_path"
|
|
|
|
>{{ environment.name }}</gl-dropdown-item
|
|
|
|
>
|
|
|
|
</gl-dropdown>
|
|
|
|
</gl-form-group>
|
|
|
|
|
|
|
|
<gl-form-group
|
2019-12-26 22:10:19 +05:30
|
|
|
v-if="hasValidDates"
|
2019-10-12 21:52:04 +05:30
|
|
|
:label="s__('Metrics|Show last')"
|
|
|
|
label-size="sm"
|
|
|
|
label-for="monitor-time-window-dropdown"
|
2019-12-21 20:55:43 +05:30
|
|
|
class="col-sm-6 col-md-6 col-lg-4"
|
2019-07-31 22:56:46 +05:30
|
|
|
>
|
2019-12-21 20:55:43 +05:30
|
|
|
<date-time-picker
|
|
|
|
:selected-time-window="selectedTimeWindow"
|
|
|
|
@onApply="onDateTimePickerApply"
|
|
|
|
/>
|
2019-10-12 21:52:04 +05:30
|
|
|
</gl-form-group>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<gl-form-group
|
2019-12-26 22:10:19 +05:30
|
|
|
v-if="hasHeaderButtons"
|
2019-10-12 21:52:04 +05:30
|
|
|
label-for="prometheus-graphs-dropdown-buttons"
|
2019-12-21 20:55:43 +05:30
|
|
|
class="dropdown-buttons col-md d-md-flex col-lg d-lg-flex align-items-end"
|
2019-07-31 22:56:46 +05:30
|
|
|
>
|
2019-10-12 21:52:04 +05:30
|
|
|
<div id="prometheus-graphs-dropdown-buttons">
|
2019-12-21 20:55:43 +05:30
|
|
|
<gl-button
|
|
|
|
v-if="showRearrangePanelsBtn"
|
|
|
|
:pressed="isRearrangingPanels"
|
|
|
|
variant="default"
|
|
|
|
class="mr-2 mt-1 js-rearrange-button"
|
|
|
|
@click="toggleRearrangingPanels"
|
|
|
|
>
|
|
|
|
{{ __('Arrange charts') }}
|
|
|
|
</gl-button>
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-button
|
|
|
|
v-if="addingMetricsAvailable"
|
2020-01-01 13:55:28 +05:30
|
|
|
ref="addMetricBtn"
|
2019-10-12 21:52:04 +05:30
|
|
|
v-gl-modal="$options.addMetric.modalId"
|
2019-12-21 20:55:43 +05:30
|
|
|
variant="outline-success"
|
2020-01-01 13:55:28 +05:30
|
|
|
class="mr-2 mt-1"
|
2019-10-12 21:52:04 +05:30
|
|
|
>
|
|
|
|
{{ $options.addMetric.title }}
|
|
|
|
</gl-button>
|
|
|
|
<gl-modal
|
|
|
|
v-if="addingMetricsAvailable"
|
|
|
|
ref="addMetricModal"
|
|
|
|
:modal-id="$options.addMetric.modalId"
|
|
|
|
:title="$options.addMetric.title"
|
|
|
|
>
|
|
|
|
<form ref="customMetricsForm" :action="customMetricsPath" method="post">
|
|
|
|
<custom-metrics-form-fields
|
|
|
|
:validate-query-path="validateQueryPath"
|
|
|
|
form-operation="post"
|
|
|
|
@formValidation="setFormValidity"
|
|
|
|
/>
|
|
|
|
</form>
|
|
|
|
<div slot="modal-footer">
|
|
|
|
<gl-button @click="hideAddMetricModal">{{ __('Cancel') }}</gl-button>
|
|
|
|
<gl-button
|
2020-01-01 13:55:28 +05:30
|
|
|
ref="submitCustomMetricsFormBtn"
|
|
|
|
v-track-event="getAddMetricTrackingOptions()"
|
2019-10-12 21:52:04 +05:30
|
|
|
:disabled="!formIsValid"
|
|
|
|
variant="success"
|
|
|
|
@click="submitCustomMetricsForm"
|
|
|
|
>
|
|
|
|
{{ __('Save changes') }}
|
|
|
|
</gl-button>
|
|
|
|
</div>
|
|
|
|
</gl-modal>
|
|
|
|
|
2019-12-26 22:10:19 +05:30
|
|
|
<gl-button
|
|
|
|
v-if="selectedDashboard.can_edit"
|
|
|
|
class="mt-1 js-edit-link"
|
|
|
|
:href="selectedDashboard.project_blob_path"
|
|
|
|
>
|
|
|
|
{{ __('Edit dashboard') }}
|
|
|
|
</gl-button>
|
|
|
|
|
2019-10-12 21:52:04 +05:30
|
|
|
<gl-button
|
|
|
|
v-if="externalDashboardUrl.length"
|
|
|
|
class="mt-1 js-external-dashboard-link"
|
|
|
|
variant="primary"
|
|
|
|
:href="externalDashboardUrl"
|
|
|
|
target="_blank"
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
>
|
|
|
|
{{ __('View full dashboard') }}
|
|
|
|
<icon name="external-link" />
|
|
|
|
</gl-button>
|
|
|
|
</div>
|
|
|
|
</gl-form-group>
|
2018-11-08 19:23:39 +05:30
|
|
|
</div>
|
|
|
|
</div>
|
2019-10-12 21:52:04 +05:30
|
|
|
|
2019-09-30 21:07:59 +05:30
|
|
|
<div v-if="!showEmptyState">
|
|
|
|
<graph-group
|
2019-12-26 22:10:19 +05:30
|
|
|
v-for="(groupData, index) in dashboard.panel_groups"
|
2019-10-12 21:52:04 +05:30
|
|
|
:key="`${groupData.group}.${groupData.priority}`"
|
2019-09-30 21:07:59 +05:30
|
|
|
:name="groupData.group"
|
|
|
|
:show-panels="showPanels"
|
2020-01-01 13:55:28 +05:30
|
|
|
:collapse-group="collapseGroup(groupData.key)"
|
2019-07-07 11:18:12 +05:30
|
|
|
>
|
2020-01-01 13:55:28 +05:30
|
|
|
<div v-if="!groupSingleEmptyState(groupData.key)">
|
|
|
|
<vue-draggable
|
|
|
|
:value="groupData.panels"
|
|
|
|
group="metrics-dashboard"
|
|
|
|
:component-data="{ attrs: { class: 'row mx-0 w-100' } }"
|
|
|
|
:disabled="!isRearrangingPanels"
|
|
|
|
@input="updatePanels(groupData.key, $event)"
|
2019-12-21 20:55:43 +05:30
|
|
|
>
|
2020-01-01 13:55:28 +05:30
|
|
|
<div
|
|
|
|
v-for="(graphData, graphIndex) in groupData.panels"
|
|
|
|
:key="`panel-type-${graphIndex}`"
|
|
|
|
class="col-12 col-lg-6 px-2 mb-2 draggable"
|
|
|
|
:class="{ 'draggable-enabled': isRearrangingPanels }"
|
|
|
|
>
|
|
|
|
<div class="position-relative draggable-panel js-draggable-panel">
|
|
|
|
<div
|
|
|
|
v-if="isRearrangingPanels"
|
|
|
|
class="draggable-remove js-draggable-remove p-2 w-100 position-absolute d-flex justify-content-end"
|
|
|
|
@click="removePanel(groupData.key, groupData.panels, graphIndex)"
|
|
|
|
>
|
|
|
|
<a class="mx-2 p-2 draggable-remove-link" :aria-label="__('Remove')"
|
|
|
|
><icon name="close"
|
|
|
|
/></a>
|
|
|
|
</div>
|
2019-12-26 22:10:19 +05:30
|
|
|
|
2020-01-01 13:55:28 +05:30
|
|
|
<panel-type
|
|
|
|
:clipboard-text="
|
|
|
|
generateLink(groupData.group, graphData.title, graphData.y_label)
|
|
|
|
"
|
|
|
|
:graph-data="graphData"
|
|
|
|
:alerts-endpoint="alertsEndpoint"
|
|
|
|
:prometheus-alerts-available="prometheusAlertsAvailable"
|
|
|
|
:index="`${index}-${graphIndex}`"
|
|
|
|
/>
|
|
|
|
</div>
|
2019-10-12 21:52:04 +05:30
|
|
|
</div>
|
2020-01-01 13:55:28 +05:30
|
|
|
</vue-draggable>
|
|
|
|
</div>
|
|
|
|
<div v-else class="py-5 col col-sm-10 col-md-8 col-lg-7 col-xl-6">
|
|
|
|
<group-empty-state
|
|
|
|
ref="empty-group"
|
|
|
|
:documentation-path="documentationPath"
|
|
|
|
:settings-path="settingsPath"
|
|
|
|
:selected-state="groupSingleEmptyState(groupData.key)"
|
|
|
|
:svg-path="emptyNoDataSmallSvgPath"
|
|
|
|
/>
|
|
|
|
</div>
|
2019-09-30 21:07:59 +05:30
|
|
|
</graph-group>
|
|
|
|
</div>
|
|
|
|
<empty-state
|
|
|
|
v-else
|
|
|
|
:selected-state="emptyState"
|
|
|
|
:documentation-path="documentationPath"
|
|
|
|
:settings-path="settingsPath"
|
|
|
|
:clusters-path="clustersPath"
|
|
|
|
:empty-getting-started-svg-path="emptyGettingStartedSvgPath"
|
|
|
|
:empty-loading-svg-path="emptyLoadingSvgPath"
|
|
|
|
:empty-no-data-svg-path="emptyNoDataSvgPath"
|
2020-01-01 13:55:28 +05:30
|
|
|
:empty-no-data-small-svg-path="emptyNoDataSmallSvgPath"
|
2019-09-30 21:07:59 +05:30
|
|
|
:empty-unable-to-connect-svg-path="emptyUnableToConnectSvgPath"
|
|
|
|
:compact="smallEmptyState"
|
|
|
|
/>
|
2018-03-17 18:26:18 +05:30
|
|
|
</div>
|
|
|
|
</template>
|