From 9ae038868cc22b422473c3fff99cd8c2bd352e7c Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Wed, 4 Dec 2019 19:16:31 +0530 Subject: [PATCH 1/2] adding instance consumed and remaining capacity to metrics --- awx/main/analytics/collectors.py | 6 +++++- awx/main/analytics/metrics.py | 4 ++++ awx/main/tests/functional/analytics/test_metrics.py | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/awx/main/analytics/collectors.py b/awx/main/analytics/collectors.py index efd3847c8f..1b52f413db 100644 --- a/awx/main/analytics/collectors.py +++ b/awx/main/analytics/collectors.py @@ -174,7 +174,11 @@ def instance_info(since, include_hostnames=False): 'memory': instance['memory'], 'managed_by_policy': instance['managed_by_policy'], 'last_isolated_check': _get_isolated_datetime(instance['last_isolated_check']), - 'enabled': instance['enabled'] + 'enabled': instance['enabled'], + 'consumed_capacity': sum(x.task_impact for x in models.UnifiedJob.objects.filter(execution_node=instance['hostname'], + status__in=('running', 'waiting'))), + 'remaining_capacity': instance['capacity'] - sum(x.task_impact for x in models.UnifiedJob.objects.filter(execution_node=instance['hostname'], + status__in=('running', 'waiting'))) } if include_hostnames is True: instance_info['hostname'] = instance['hostname'] diff --git a/awx/main/analytics/metrics.py b/awx/main/analytics/metrics.py index a418f271db..1dd85eb6a7 100644 --- a/awx/main/analytics/metrics.py +++ b/awx/main/analytics/metrics.py @@ -46,6 +46,8 @@ INSTANCE_MEMORY = Gauge('awx_instance_memory', 'RAM (Kb) on each node in a Tower INSTANCE_INFO = Info('awx_instance', 'Info about each node in a Tower system', ['hostname', 'instance_uuid',]) INSTANCE_LAUNCH_TYPE = Gauge('awx_instance_launch_type_total', 'Type of Job launched', ['node', 'launch_type',]) INSTANCE_STATUS = Gauge('awx_instance_status_total', 'Status of Job launched', ['node', 'status',]) +INSTANCE_CONSUMED_CAPACITY = Gauge('awx_instance_consumed_capacity', 'Consumed capacity of each node in a Tower system', ['hostname', 'instance_uuid',]) +INSTANCE_REMAINING_CAPACITY = Gauge('awx_instance_remaining_capacity', 'Remaining capacity of each node in a Tower system', ['hostname', 'instance_uuid',]) LICENSE_INSTANCE_TOTAL = Gauge('awx_license_instance_total', 'Total number of managed hosts provided by your license') LICENSE_INSTANCE_FREE = Gauge('awx_license_instance_free', 'Number of remaining managed hosts provided by your license') @@ -104,6 +106,8 @@ def metrics(): INSTANCE_CAPACITY.labels(hostname=hostname, instance_uuid=uuid).set(instance_data[uuid]['capacity']) INSTANCE_CPU.labels(hostname=hostname, instance_uuid=uuid).set(instance_data[uuid]['cpu']) INSTANCE_MEMORY.labels(hostname=hostname, instance_uuid=uuid).set(instance_data[uuid]['memory']) + INSTANCE_CONSUMED_CAPACITY.labels(hostname=hostname, instance_uuid=uuid).set(instance_data[uuid]['consumed_capacity']) + INSTANCE_REMAINING_CAPACITY.labels(hostname=hostname, instance_uuid=uuid).set(instance_data[uuid]['remaining_capacity']) INSTANCE_INFO.labels(hostname=hostname, instance_uuid=uuid).info({ 'enabled': str(instance_data[uuid]['enabled']), 'last_isolated_check': getattr(instance_data[uuid], 'last_isolated_check', 'None'), diff --git a/awx/main/tests/functional/analytics/test_metrics.py b/awx/main/tests/functional/analytics/test_metrics.py index c4d7c517c7..3853f083b7 100644 --- a/awx/main/tests/functional/analytics/test_metrics.py +++ b/awx/main/tests/functional/analytics/test_metrics.py @@ -25,6 +25,8 @@ EXPECTED_VALUES = { 'awx_custom_virtualenvs_total':0.0, 'awx_running_jobs_total':0.0, 'awx_instance_capacity':100.0, + 'awx_instance_consumed_capacity':0.0, + 'awx_instance_remaining_capacity':100.0, 'awx_instance_cpu':0.0, 'awx_instance_memory':0.0, 'awx_instance_info':1.0, From 0d4e6d7e0bf0177d70f8bafca4b8f8aa7daf9f29 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Wed, 11 Dec 2019 16:04:04 +0530 Subject: [PATCH 2/2] do the sum once and store it in a variable which will be reused --- awx/main/analytics/collectors.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/awx/main/analytics/collectors.py b/awx/main/analytics/collectors.py index 1b52f413db..6027bf1556 100644 --- a/awx/main/analytics/collectors.py +++ b/awx/main/analytics/collectors.py @@ -166,6 +166,8 @@ def instance_info(since, include_hostnames=False): instances = models.Instance.objects.values_list('hostname').values( 'uuid', 'version', 'capacity', 'cpu', 'memory', 'managed_by_policy', 'hostname', 'last_isolated_check', 'enabled') for instance in instances: + consumed_capacity = sum(x.task_impact for x in models.UnifiedJob.objects.filter(execution_node=instance['hostname'], + status__in=('running', 'waiting'))) instance_info = { 'uuid': instance['uuid'], 'version': instance['version'], @@ -175,10 +177,8 @@ def instance_info(since, include_hostnames=False): 'managed_by_policy': instance['managed_by_policy'], 'last_isolated_check': _get_isolated_datetime(instance['last_isolated_check']), 'enabled': instance['enabled'], - 'consumed_capacity': sum(x.task_impact for x in models.UnifiedJob.objects.filter(execution_node=instance['hostname'], - status__in=('running', 'waiting'))), - 'remaining_capacity': instance['capacity'] - sum(x.task_impact for x in models.UnifiedJob.objects.filter(execution_node=instance['hostname'], - status__in=('running', 'waiting'))) + 'consumed_capacity': consumed_capacity, + 'remaining_capacity': instance['capacity'] - consumed_capacity } if include_hostnames is True: instance_info['hostname'] = instance['hostname']