diff --git a/manage.py b/manage.py index 6f0b1d77b..1e484c945 100755 --- a/manage.py +++ b/manage.py @@ -2,12 +2,15 @@ """ CLI to manage redash. """ +import json + from flask.ext.script import Manager from redash import settings, models, __version__ from redash.wsgi import app from redash.import_export import import_manager from redash.cli import users, database, data_sources +from redash.monitor import get_status manager = Manager(app) manager.add_command("database", database.manager) @@ -21,6 +24,9 @@ def version(): """Displays re:dash version.""" print __version__ +@manager.command +def status(): + print json.dumps(get_status(), indent=2) @manager.command def runworkers(): diff --git a/rd_ui/app/scripts/visualizations/chart.js b/rd_ui/app/scripts/visualizations/chart.js index 440c3ce2d..4d5f674f9 100644 --- a/rd_ui/app/scripts/visualizations/chart.js +++ b/rd_ui/app/scripts/visualizations/chart.js @@ -163,7 +163,7 @@ scope.visualization.options.seriesOptions[s] = {'type': scope.visualization.options.globalSeriesType, 'yAxis': 0}; } scope.visualization.options.seriesOptions[s].zIndex = scope.visualization.options.seriesOptions[s].zIndex === undefined ? i : scope.visualization.options.seriesOptions[s].zIndex; - + scope.visualization.options.seriesOptions[s].index = scope.visualization.options.seriesOptions[s].index === undefined ? i : scope.visualization.options.seriesOptions[s].index; }); scope.zIndexes = _.range(scope.series.length); scope.yAxes = [[0, 'left'], [1, 'right']]; diff --git a/rd_ui/app/views/visualizations/chart_editor.html b/rd_ui/app/views/visualizations/chart_editor.html index 4e2b62420..f3f2bfdf1 100644 --- a/rd_ui/app/views/visualizations/chart_editor.html +++ b/rd_ui/app/views/visualizations/chart_editor.html @@ -108,6 +108,15 @@ class="form-control"> +
+ + +
+ +
+
diff --git a/redash/controllers.py b/redash/controllers.py index ca3096d99..93060560a 100644 --- a/redash/controllers.py +++ b/redash/controllers.py @@ -23,6 +23,7 @@ from redash.tasks import QueryTask, record_event from redash.cache import headers as cache_headers from redash.permissions import require_permission from redash.query_runner import query_runners, validate_configuration +from redash.monitor import get_status @app.route('/ping', methods=['GET']) @@ -98,34 +99,7 @@ def logout(): @auth.required @require_permission('admin') def status_api(): - status = {} - info = redis_connection.info() - status['redis_used_memory'] = info['used_memory_human'] - status['version'] = __version__ - status['queries_count'] = models.Query.select().count() - status['query_results_count'] = models.QueryResult.select().count() - status['unused_query_results_count'] = models.QueryResult.unused().count() - status['dashboards_count'] = models.Dashboard.select().count() - status['widgets_count'] = models.Widget.select().count() - - status['workers'] = [] - - manager_status = redis_connection.hgetall('redash:status') - status['manager'] = manager_status - status['manager']['outdated_queries_count'] = len(models.Query.outdated_queries()) - - queues = {} - for ds in models.DataSource.select(): - for queue in (ds.queue_name, ds.scheduled_queue_name): - queues.setdefault(queue, set()) - queues[queue].add(ds.name) - - status['manager']['queues'] = {} - for queue, sources in queues.iteritems(): - status['manager']['queues'][queue] = { - 'data_sources': ', '.join(sources), - 'size': redis_connection.llen(queue) - } + status = get_status() return jsonify(status) diff --git a/redash/monitor.py b/redash/monitor.py new file mode 100644 index 000000000..27726b35a --- /dev/null +++ b/redash/monitor.py @@ -0,0 +1,33 @@ +from redash import redis_connection, models, __version__ + +def get_status(): + status = {} + info = redis_connection.info() + status['redis_used_memory'] = info['used_memory_human'] + status['version'] = __version__ + status['queries_count'] = models.Query.select().count() + status['query_results_count'] = models.QueryResult.select().count() + status['unused_query_results_count'] = models.QueryResult.unused().count() + status['dashboards_count'] = models.Dashboard.select().count() + status['widgets_count'] = models.Widget.select().count() + + status['workers'] = [] + + manager_status = redis_connection.hgetall('redash:status') + status['manager'] = manager_status + status['manager']['outdated_queries_count'] = len(models.Query.outdated_queries()) + + queues = {} + for ds in models.DataSource.select(): + for queue in (ds.queue_name, ds.scheduled_queue_name): + queues.setdefault(queue, set()) + queues[queue].add(ds.name) + + status['manager']['queues'] = {} + for queue, sources in queues.iteritems(): + status['manager']['queues'][queue] = { + 'data_sources': ', '.join(sources), + 'size': redis_connection.llen(queue) + } + + return status