|
|
@@ -0,0 +1,94 @@
|
|
|
+define([
|
|
|
+ 'angular',
|
|
|
+ 'app',
|
|
|
+ 'lodash',
|
|
|
+ 'kbn'
|
|
|
+],
|
|
|
+function (angular, app, _, kbn) {
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ var module = angular.module('grafana.controllers');
|
|
|
+
|
|
|
+ module.controller('GraphiteImportCtrl', function($scope, datasourceSrv, dashboardSrv, $location) {
|
|
|
+
|
|
|
+ $scope.init = function() {
|
|
|
+ $scope.datasources = [];
|
|
|
+ _.each(datasourceSrv.getAll(), function(ds) {
|
|
|
+ if (ds.type === 'graphite') {
|
|
|
+ $scope.sourceName = ds.name;
|
|
|
+ $scope.datasources.push(ds.name);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ $scope.listAll = function() {
|
|
|
+ $scope.datasource = datasourceSrv.get($scope.sourceName);
|
|
|
+
|
|
|
+ $scope.datasource.listDashboards('').then(function(results) {
|
|
|
+ $scope.dashboards = results;
|
|
|
+ }, function(err) {
|
|
|
+ var message = err.message || err.statusText || 'Error';
|
|
|
+ $scope.appEvent('alert-error', ['Failed to load dashboard list from graphite', message]);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ $scope.import = function(dashName) {
|
|
|
+ $scope.datasource.loadDashboard(dashName).then(function(results) {
|
|
|
+ if (!results.data || !results.data.state) {
|
|
|
+ throw { message: 'no dashboard state received from graphite' };
|
|
|
+ }
|
|
|
+
|
|
|
+ graphiteToGrafanaTranslator(results.data.state, $scope.datasource.name);
|
|
|
+ }, function(err) {
|
|
|
+ var message = err.message || err.statusText || 'Error';
|
|
|
+ $scope.appEvent('alert-error', ['Failed to load dashboard from graphite', message]);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ function graphiteToGrafanaTranslator(state, datasource) {
|
|
|
+ var graphsPerRow = 2;
|
|
|
+ var rowHeight = 300;
|
|
|
+ var rowTemplate;
|
|
|
+ var currentRow;
|
|
|
+ var panel;
|
|
|
+
|
|
|
+ rowTemplate = {
|
|
|
+ title: '',
|
|
|
+ panels: [],
|
|
|
+ height: rowHeight
|
|
|
+ };
|
|
|
+
|
|
|
+ currentRow = angular.copy(rowTemplate);
|
|
|
+
|
|
|
+ var newDashboard = dashboardSrv.create({});
|
|
|
+ newDashboard.rows = [];
|
|
|
+ newDashboard.title = state.name;
|
|
|
+ newDashboard.rows.push(currentRow);
|
|
|
+
|
|
|
+ _.each(state.graphs, function(graph, index) {
|
|
|
+ if (currentRow.panels.length === graphsPerRow) {
|
|
|
+ currentRow = angular.copy(rowTemplate);
|
|
|
+ newDashboard.rows.push(currentRow);
|
|
|
+ }
|
|
|
+
|
|
|
+ panel = {
|
|
|
+ type: 'graph',
|
|
|
+ span: 12 / graphsPerRow,
|
|
|
+ title: graph[1].title,
|
|
|
+ targets: [],
|
|
|
+ datasource: datasource,
|
|
|
+ id: index + 1
|
|
|
+ };
|
|
|
+
|
|
|
+ _.each(graph[1].target, function(target) {
|
|
|
+ panel.targets.push({ target: target });
|
|
|
+ });
|
|
|
+
|
|
|
+ currentRow.panels.push(panel);
|
|
|
+ });
|
|
|
+
|
|
|
+ window.grafanaImportDashboard = newDashboard;
|
|
|
+ $location.path('/dashboard/import/' + kbn.slugifyForUrl(newDashboard.title));
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|