diff --git a/src/app/panels/overview/module.html b/src/app/panels/overview/module.html
new file mode 100644
index 00000000000..04084088adc
--- /dev/null
+++ b/src/app/panels/overview/module.html
@@ -0,0 +1,20 @@
+
diff --git a/src/app/panels/overview/module.js b/src/app/panels/overview/module.js
new file mode 100644
index 00000000000..1e71de1e847
--- /dev/null
+++ b/src/app/panels/overview/module.js
@@ -0,0 +1,117 @@
+define([
+ 'angular',
+ 'app',
+ 'underscore',
+ 'services/panelSrv'
+],
+function (angular, app, _) {
+ 'use strict';
+
+ var module = angular.module('grafana.panels.overview', []);
+ app.useModule(module);
+
+ module.controller('OverviewCtrl', function($scope, panelSrv) {
+
+ $scope.panelMeta = {
+ description : "A panel to show an overview of different metrics through avg, total, current numbers and sparklines",
+ fullEditorTabs : [
+ {
+ title: 'General',
+ src:'app/partials/panelgeneral.html'
+ },
+ {
+ title: 'Metrics',
+ src:'app/partials/metrics.html'
+ }
+ ],
+ fullscreenEdit: true,
+ };
+
+ // Set and populate defaults
+ var _d = {
+ targets: [{}]
+ };
+
+ _.defaults($scope.panel, _d);
+
+ $scope.init = function() {
+ panelSrv.init(this);
+
+ $scope.get_data();
+ //$scope.$on('refresh', $scope.render);
+ //$scope.render();
+ };
+
+ $scope.get_data = function() {
+ delete $scope.panel.error;
+ $scope.panelMeta.loading = true;
+
+ $scope.rangeUnparsed = $scope.filter.timeRange(false);
+
+ var metricsQuery = {
+ range: $scope.rangeUnparsed,
+ interval: '1min',
+ targets: $scope.panel.targets,
+ maxDataPoints: 100,
+ };
+
+ return $scope.datasource.query($scope.filter, metricsQuery)
+ .then($scope.dataHandler)
+ .then(null, function(err) {
+ $scope.panelMeta.loading = false;
+ $scope.panel.error = err.message || "Timeseries data request error";
+ $scope.inspector.error = err;
+ $scope.render([]);
+ });
+ };
+
+ $scope.dataHandler = function(results) {
+ $scope.panelMeta.loading = false;
+ var data = _.map(results.data, $scope.seriesHandler);
+ $scope.render(data);
+ };
+
+ $scope.seriesHandler = function(seriesData, index) {
+ var datapoints = seriesData.datapoints;
+ var alias = seriesData.target;
+ var color = $scope.panel.aliasColors[alias] || $scope.colors[index];
+ var yaxis = $scope.panel.aliasYAxis[alias] || 1;
+
+ var seriesInfo = {
+ alias: alias,
+ color: color,
+ enable: true,
+ yaxis: yaxis
+ };
+
+ $scope.legend.push(seriesInfo);
+
+ var series = new timeSeries.ZeroFilled({
+ datapoints: datapoints,
+ info: seriesInfo,
+ });
+
+ if (datapoints && datapoints.length > 0) {
+ var last = moment.utc(datapoints[datapoints.length - 1][1] * 1000);
+ var from = moment.utc($scope.range.from);
+ if (last - from < -10000) {
+ $scope.datapointsOutside = true;
+ }
+
+ $scope.datapointsCount += datapoints.length;
+ }
+
+ return series;
+ };
+
+ $scope.render = function() {
+
+ };
+
+ $scope.openEditor = function() {
+ };
+
+ $scope.init();
+
+ });
+});
diff --git a/src/test/specs/overview-ctrl-specs.js b/src/test/specs/overview-ctrl-specs.js
new file mode 100644
index 00000000000..7a50c9a8d4d
--- /dev/null
+++ b/src/test/specs/overview-ctrl-specs.js
@@ -0,0 +1,40 @@
+define([
+ 'panels/overview/module'
+], function() {
+ 'use strict';
+
+ describe('OverviewCtrl', function() {
+ var _controller;
+ var _scope;
+
+ beforeEach(module('grafana.services'));
+ beforeEach(module('grafana.panels.overview'));
+
+ beforeEach(module(function($provide){
+ $provide.value('datasourceSrv',{
+ getMetricSources: function() {
+ },
+ get: function() {
+ return {};
+ }
+ });
+ }));
+
+ beforeEach(inject(function($controller, $rootScope) {
+ _scope = $rootScope.$new();
+ _scope.panel = { targets: [] };
+ _controller = $controller('OverviewCtrl', {
+ $scope: _scope
+ });
+ }));
+
+ describe('init', function() {
+ beforeEach(function() {
+ });
+
+ it('description', function() {
+
+ });
+ });
+ });
+});