mirror of
https://github.com/grafana/grafana.git
synced 2024-12-01 13:09:22 -06:00
b6e46c9eb8
A simple version control system for dashboards. Closes #1504. Goals 1. To create a new dashboard version every time a dashboard is saved. 2. To allow users to view all versions of a given dashboard. 3. To allow users to rollback to a previous version of a dashboard. 4. To allow users to compare two versions of a dashboard. Usage Navigate to a dashboard, and click the settings cog. From there, click the "Changelog" button to be brought to the Changelog view. In this view, a table containing each version of a dashboard can be seen. Each entry in the table represents a dashboard version. A selectable checkbox, the version number, date created, name of the user who created that version, and commit message is shown in the table, along with a button that allows a user to restore to a previous version of that dashboard. If a user wants to restore to a previous version of their dashboard, they can do so by clicking the previously mentioned button. If a user wants to compare two different versions of a dashboard, they can do so by clicking the checkbox of two different dashboard versions, then clicking the "Compare versions" button located below the dashboard. From there, the user is brought to a view showing a summary of the dashboard differences. Each summarized change contains a link that can be clicked to take the user a JSON diff highlighting the changes line by line. Overview of Changes Backend Changes - A `dashboard_version` table was created to store each dashboard version, along with a dashboard version model and structs to represent the queries and commands necessary for the dashboard version API methods. - API endpoints were created to support working with dashboard versions. - Methods were added to create, update, read, and destroy dashboard versions in the database. - Logic was added to compute the diff between two versions, and display it to the user. - The dashboard migration logic was updated to save a "Version 1" of each existing dashboard in the database. Frontend Changes - New views - Methods to pull JSON and HTML from endpoints New API Endpoints Each endpoint requires the authorization header to be sent in the format, ``` Authorization: Bearer <jwt> ``` where `<jwt>` is a JSON web token obtained from the Grafana admin panel. `GET "/api/dashboards/db/:dashboardId/versions?orderBy=<string>&limit=<int>&start=<int>"` Get all dashboard versions for the given dashboard ID. Accepts three URL parameters: - `orderBy` String to order the results by. Possible values are `version`, `created`, `created_by`, `message`. Default is `versions`. Ordering is always in descending order. - `limit` Maximum number of results to return - `start` Position in results to start from `GET "/api/dashboards/db/:dashboardId/versions/:id"` Get an individual dashboard version by ID, for the given dashboard ID. `POST "/api/dashboards/db/:dashboardId/restore"` Restore to the given dashboard version. Post body is of content-type `application/json`, and must contain. ```json { "dashboardId": <int>, "version": <int> } ``` `GET "/api/dashboards/db/:dashboardId/compare/:versionA...:versionB"` Compare two dashboard versions by ID for the given dashboard ID, returning a JSON delta formatted representation of the diff. The URL format follows what GitHub does. For example, visiting [/api/dashboards/db/18/compare/22...33](http://ec2-54-80-139-44.compute-1.amazonaws.com:3000/api/dashboards/db/18/compare/22...33) will return the diff between versions 22 and 33 for the dashboard ID 18. Dependencies Added - The Go package [gojsondiff](https://github.com/yudai/gojsondiff) was added and vendored.
198 lines
5.1 KiB
JavaScript
198 lines
5.1 KiB
JavaScript
define([],
|
|
function() {
|
|
'use strict';
|
|
|
|
return {
|
|
versions: function() {
|
|
return [{
|
|
id: 4,
|
|
dashboardId: 1,
|
|
parentVersion: 3,
|
|
restoredFrom: 0,
|
|
version: 4,
|
|
created: '2017-02-22T17:43:01-08:00',
|
|
createdBy: 'admin',
|
|
message: '',
|
|
},
|
|
{
|
|
id: 3,
|
|
dashboardId: 1,
|
|
parentVersion: 1,
|
|
restoredFrom: 1,
|
|
version: 3,
|
|
created: '2017-02-22T17:43:01-08:00',
|
|
createdBy: 'admin',
|
|
message: '',
|
|
},
|
|
{
|
|
id: 2,
|
|
dashboardId: 1,
|
|
parentVersion: 0,
|
|
restoredFrom: -1,
|
|
version: 2,
|
|
created: '2017-02-22T17:29:52-08:00',
|
|
createdBy: 'admin',
|
|
message: '',
|
|
},
|
|
{
|
|
id: 1,
|
|
dashboardId: 1,
|
|
parentVersion: 0,
|
|
restoredFrom: -1,
|
|
slug: 'audit-dashboard',
|
|
version: 1,
|
|
created: '2017-02-22T17:06:37-08:00',
|
|
createdBy: 'admin',
|
|
message: '',
|
|
}];
|
|
},
|
|
compare: function(type) {
|
|
return type === 'basic' ? '<div></div>' : '<pre><code></code></pre>';
|
|
},
|
|
restore: function(version, restoredFrom) {
|
|
return {
|
|
dashboard: {
|
|
meta: {
|
|
type: 'db',
|
|
canSave: true,
|
|
canEdit: true,
|
|
canStar: true,
|
|
slug: 'audit-dashboard',
|
|
expires: '0001-01-01T00:00:00Z',
|
|
created: '2017-02-21T18:40:45-08:00',
|
|
updated: '2017-04-11T21:31:22.59219665-07:00',
|
|
updatedBy: 'admin',
|
|
createdBy: 'admin',
|
|
version: version,
|
|
},
|
|
dashboard: {
|
|
annotations: {
|
|
list: []
|
|
},
|
|
description: 'A random dashboard for implementing the audit log',
|
|
editable: true,
|
|
gnetId: null,
|
|
graphTooltip: 0,
|
|
hideControls: false,
|
|
id: 1,
|
|
links: [],
|
|
restoredFrom: restoredFrom,
|
|
rows: [{
|
|
collapse: false,
|
|
height: '250px',
|
|
panels: [{
|
|
aliasColors: {},
|
|
bars: false,
|
|
datasource: null,
|
|
fill: 1,
|
|
id: 1,
|
|
legend: {
|
|
avg: false,
|
|
current: false,
|
|
max: false,
|
|
min: false,
|
|
show: true,
|
|
total: false,
|
|
values: false
|
|
},
|
|
lines: true,
|
|
linewidth: 1,
|
|
nullPointMode: "null",
|
|
percentage: false,
|
|
pointradius: 5,
|
|
points: false,
|
|
renderer: 'flot',
|
|
seriesOverrides: [],
|
|
span: 12,
|
|
stack: false,
|
|
steppedLine: false,
|
|
targets: [{}],
|
|
thresholds: [],
|
|
timeFrom: null,
|
|
timeShift: null,
|
|
title: 'Panel Title',
|
|
tooltip: {
|
|
shared: true,
|
|
sort: 0,
|
|
value_type: 'individual'
|
|
},
|
|
type: 'graph',
|
|
xaxis: {
|
|
mode: 'time',
|
|
name: null,
|
|
show: true,
|
|
values: []
|
|
},
|
|
yaxes: [{
|
|
format: 'short',
|
|
label: null,
|
|
logBase: 1,
|
|
max: null,
|
|
min: null,
|
|
show: true
|
|
}, {
|
|
format: 'short',
|
|
label: null,
|
|
logBase: 1,
|
|
max: null,
|
|
min: null,
|
|
show: true
|
|
}]
|
|
}],
|
|
repeat: null,
|
|
repeatIteration: null,
|
|
repeatRowId: null,
|
|
showTitle: false,
|
|
title: 'Dashboard Row',
|
|
titleSize: 'h6'
|
|
}
|
|
],
|
|
schemaVersion: 14,
|
|
style: 'dark',
|
|
tags: [
|
|
'development'
|
|
],
|
|
templating: {
|
|
'list': []
|
|
},
|
|
time: {
|
|
from: 'now-6h',
|
|
to: 'now'
|
|
},
|
|
timepicker: {
|
|
refresh_intervals: [
|
|
'5s',
|
|
'10s',
|
|
'30s',
|
|
'1m',
|
|
'5m',
|
|
'15m',
|
|
'30m',
|
|
'1h',
|
|
'2h',
|
|
'1d',
|
|
],
|
|
time_options: [
|
|
'5m',
|
|
'15m',
|
|
'1h',
|
|
'6h',
|
|
'12h',
|
|
'24h',
|
|
'2d',
|
|
'7d',
|
|
'30d'
|
|
]
|
|
},
|
|
timezone: 'utc',
|
|
title: 'Audit Dashboard',
|
|
version: version,
|
|
}
|
|
},
|
|
message: 'Dashboard restored to version ' + version,
|
|
version: version
|
|
};
|
|
},
|
|
};
|
|
});
|