From f05453020a8cee75346f1a8c9512fb15c7129f42 Mon Sep 17 00:00:00 2001 From: Ladislav Smola Date: Thu, 11 Sep 2014 11:33:29 +0200 Subject: [PATCH] Add aggregated stat to nodes index Adding aggregated stats to node index page. Change-Id: I5c2c523037e7310c646ff05de71c0a6c11bf3419 --- tuskar_ui/infrastructure/nodes/tabs.py | 19 +++- .../nodes/templates/nodes/_overview.html | 101 ++++++++++++++++++ tuskar_ui/infrastructure/nodes/urls.py | 2 + tuskar_ui/infrastructure/nodes/views.py | 25 +++-- tuskar_ui/utils/metering.py | 5 + 5 files changed, 140 insertions(+), 12 deletions(-) diff --git a/tuskar_ui/infrastructure/nodes/tabs.py b/tuskar_ui/infrastructure/nodes/tabs.py index 6709c3b7f..42a28772b 100644 --- a/tuskar_ui/infrastructure/nodes/tabs.py +++ b/tuskar_ui/infrastructure/nodes/tabs.py @@ -50,7 +50,7 @@ class OverviewTab(tabs.Tab): total_nodes_healthy = api.node.filter_nodes(total_nodes, healthy=True) total_nodes_up = api.node.filter_nodes(total_nodes, power_state=True) - return { + context = { 'cpus': cpus, 'memory_gb': memory_mb / 1024.0, 'local_gb': local_gb, @@ -66,6 +66,23 @@ class OverviewTab(tabs.Tab): 'free_nodes_down': free_nodes_down, } + if api_base.is_service_enabled(self.request, 'metering'): + context['meter_conf'] = ( + (_('System Load'), + metering_utils.url_part('hardware.cpu.load.1min', False), + None), + (_('CPU Utilization'), + metering_utils.url_part('hardware.system_stats.cpu.util', + True), + '100'), + (_('Swap Utilization'), + metering_utils.url_part('hardware.memory.swap.util', + True), + '100'), + ) + + return context + class RegisteredTab(tabs.TableTab): table_classes = (tables.RegisteredNodesTable,) diff --git a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html index 724a0fdce..75553ef7f 100644 --- a/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html +++ b/tuskar_ui/infrastructure/nodes/templates/nodes/_overview.html @@ -46,3 +46,104 @@ + +
+
+

{% trans "Provisioned nodes" %}

+ {% if meter_conf %} + {% url 'horizon:infrastructure:nodes:nodes_performance' as node_perf_url %} +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ + {% for meter_label, url_part, y_max in meter_conf %} +
+ {% include "infrastructure/_performance_chart.html" with label=meter_label y_max=y_max url=node_perf_url|add:"?"|add:url_part only %} +
+ {% endfor %} + + {% else %} +

{% trans 'Metering service is not enabled.' %}

+ {% endif %} +
+
+
diff --git a/tuskar_ui/infrastructure/nodes/urls.py b/tuskar_ui/infrastructure/nodes/urls.py index 8ef7ee21d..6260cbb4c 100644 --- a/tuskar_ui/infrastructure/nodes/urls.py +++ b/tuskar_ui/infrastructure/nodes/urls.py @@ -24,6 +24,8 @@ urlpatterns = urls.patterns( name='register'), urls.url(r'^auto-discover/$', views.AutoDiscoverView.as_view(), name='auto-discover'), + urls.url(r'^nodes_performance/$', + views.PerformanceView.as_view(), name='nodes_performance'), urls.url(r'^(?P[^/]+)/$', views.DetailView.as_view(), name='detail'), urls.url(r'^(?P[^/]+)/performance/$', diff --git a/tuskar_ui/infrastructure/nodes/views.py b/tuskar_ui/infrastructure/nodes/views.py index 8afae03a9..6038e35b9 100644 --- a/tuskar_ui/infrastructure/nodes/views.py +++ b/tuskar_ui/infrastructure/nodes/views.py @@ -108,18 +108,21 @@ class PerformanceView(base.TemplateView): stats_attr = request.GET.get('stats_attr', 'avg') barchart = bool(request.GET.get('barchart')) - node_uuid = kwargs.get('node_uuid') - node = api.node.Node.get(request, node_uuid) - - try: - instance_uuid = node.instance_uuid - except AttributeError: - json_output = None + node_uuid = kwargs.get('node_uuid', None) + if node_uuid: + node = api.node.Node.get(request, node_uuid) + try: + instance_uuid = node.instance_uuid + except AttributeError: + json_output = None else: - json_output = metering_utils.get_nodes_stats( - request, instance_uuid, meter, date_options=date_options, - date_from=date_from, date_to=date_to, stats_attr=stats_attr, - barchart=barchart) + # Aggregated stats for all nodes + instance_uuid = None + + json_output = metering_utils.get_nodes_stats( + request, instance_uuid, meter, date_options=date_options, + date_from=date_from, date_to=date_to, + stats_attr=stats_attr, barchart=barchart) return http.HttpResponse(json.dumps(json_output), content_type='application/json') diff --git a/tuskar_ui/utils/metering.py b/tuskar_ui/utils/metering.py index 5a8319221..a766ebe7e 100644 --- a/tuskar_ui/utils/metering.py +++ b/tuskar_ui/utils/metering.py @@ -270,6 +270,11 @@ def get_nodes_stats(request, uuid, meter, date_options=None, date_from=None, query = [{'field': 'resource_id', 'op': 'eq', 'value': uuid}] + else: + # query will be aggregated across all resources + group_by = "all" + query = {} + query['all'] = [] # Disk and Network I/O: data from 2 meters in one chart if meter == 'disk-io':