diff --git a/cloudstats/templates/cloudstats/index.html b/cloudstats/templates/cloudstats/index.html index fd36b4e..bc4ab44 100644 --- a/cloudstats/templates/cloudstats/index.html +++ b/cloudstats/templates/cloudstats/index.html @@ -26,18 +26,28 @@

{% translate "CPU used" %}

{% translate "Memory used" %}

+

{% translate "Projects" %}

+ Total physical cores: {{physical_cores | floatformat:0}}
+ Total physical memory: {{physical_memory | floatformat:0}} GB
+ - + + + + {% for project in all_projects %} - + + + + {% endfor %} diff --git a/cloudstats/views.py b/cloudstats/views.py index 7fbac91..3daddf5 100644 --- a/cloudstats/views.py +++ b/cloudstats/views.py @@ -7,6 +7,7 @@ from django.contrib.auth.decorators import login_required from django.utils.translation import gettext as _ from collections import Counter +import statistics prom = Prometheus(settings.PROMETHEUS) @@ -18,15 +19,84 @@ def index(request): if request.user.is_staff: context['all_projects'] = [] - query_projects = 'count(libvirtd_domain_vcpu_time{{ {filter} }}) by (project_name)'.format( + all_projects = {} + + query_count_cores = 'count(libvirtd_domain_vcpu_time{{ {filter} }}) by (project_name)'.format( + filter=prom.get_filter('cloudstats'), + ) + stats_avg_cores = prom.query_prometheus_multiple(query_count_cores, datetime.now() - timedelta(days=31), datetime.now(), step='1d') + for line in stats_avg_cores: + all_projects[line['metric']['project_name']] = {'cores': statistics.mean(line['y'])} + + query_used_cores = 'sum(rate(libvirtd_domain_vcpu_time{{ {filter} }}[1h])/1000/1000/1000) by (project_name)'.format( filter=prom.get_filter('cloudstats'), ) - for project in prom.query_last(query_projects): + stats_avg_used_cores = prom.query_prometheus_multiple(query_used_cores, datetime.now() - timedelta(days=31), datetime.now(), step='1d') + for line in stats_avg_used_cores: + all_projects[line['metric']['project_name']]['used_cores'] = statistics.mean(line['y']) + + query_memory = 'sum(libvirtd_domain_balloon_current{{ {filter} }}/1024/1024) by (project_name)'.format( + filter=prom.get_filter('cloudstats'), + ) + stats_memory = prom.query_prometheus_multiple(query_memory, datetime.now() - timedelta(days=31), datetime.now(), step='1d') + for line in stats_memory: + all_projects[line['metric']['project_name']]['memory'] = statistics.mean(line['y']) + + query_used_memory = 'sum((libvirtd_domain_balloon_current{{ {filter} }} - libvirtd_domain_balloon_usable{{ {filter} }})/1024/1024) by (project_name)'.format( + filter=prom.get_filter('cloudstats'), + ) + stats_used_memory = prom.query_prometheus_multiple(query_used_memory, datetime.now() - timedelta(days=31), datetime.now(), step='1d') + for line in stats_used_memory: + all_projects[line['metric']['project_name']]['used_memory'] = statistics.mean(line['y']) + + context['total_projects'] = {'cores': 0, 'used_cores': 0, 'memory': 0, 'used_memory': 0} + for project in sorted(all_projects): context['all_projects'].append({ - 'id': project['metric']['project_name'], - 'name': project['metric']['project_name'], - 'cores': - int(project['value'][1])}) + 'id': project, + 'name': project, + 'cores': all_projects[project]['cores'], + 'used_cores': all_projects[project]['used_cores'], + 'memory': all_projects[project]['memory'], + 'used_memory': all_projects[project]['used_memory'], + }) + context['total_projects']['cores'] += all_projects[project]['cores'] + context['total_projects']['used_cores'] += all_projects[project]['used_cores'] + context['total_projects']['memory'] += all_projects[project]['memory'] + context['total_projects']['used_memory'] += all_projects[project]['used_memory'] + + context['all_projects'].append({ + 'id': 'total', + 'name': _('Total'), + 'cores': context['total_projects']['cores'], + 'used_cores': context['total_projects']['used_cores'], + 'memory': context['total_projects']['memory'], + 'used_memory': context['total_projects']['used_memory'], + }) + + # Grab the hypervisors hostnames + query_hypervisors = 'libvirtd_info{{ {filter} }}'.format( + filter=prom.get_filter('cloudstats'), + ) + stats_hypervisors = prom.query_prometheus_multiple(query_hypervisors, datetime.now() - timedelta(days=31), datetime.now(), step='1d') + context['hypervisors'] = [] + for line in stats_hypervisors: + context['hypervisors'].append(line['metric']['instance'].split(':')[0]) + + # get the physical cores + query_physical_cores = 'count(node_cpu_seconds_total{{ {filter}, mode="idle", instance=~"({instances}).*" }})'.format( + filter=prom.get_filter('cloudstats'), + instances='|'.join(context['hypervisors']) + ) + stats_physical_cores = prom.query_last(query_physical_cores) + context['physical_cores'] = stats_physical_cores[0]['value'][1] + + # get the physical memory + query_physical_memory = 'sum(node_memory_MemTotal_bytes{{ {filter}, instance=~"({instances}).*" }})/1024/1024/1024'.format( + filter=prom.get_filter('cloudstats'), + instances='|'.join(context['hypervisors']) + ) + stats_physical_memory = prom.query_last(query_physical_memory) + context['physical_memory'] = stats_physical_memory[0]['value'][1] return render(request, 'cloudstats/index.html', context)
{% translate "Project" %}{% translate "Allocated cores" %}{% translate "Running cores" %}{% translate "Used cores" %}{% translate "Running memory (GB)" %}{% translate "Used memory (GB)" %}
{{project.name | anonymize }}{{project.cores}}{{project.cores | floatformat:1}}{{project.used_cores | floatformat:1}}{{project.memory | floatformat:1}}{{project.used_memory | floatformat:1}}