def check_queue(mpc, min_consumers, max_consumers, rabbitmq_server, rabbitmq_vhost, rabbitmq_queue, instance_group): cl = Client(rabbitmq_server, 'admin', 'rabbit4ever') try: messages = cl.get_queue(rabbitmq_vhost, rabbitmq_queue).get('messages') except: bash_delete_auto_resize = "sed -i '/" + rabbitmq_queue + " " + instance_group + " " + mpc + " /d' " + file_path os.system(bash_delete_auto_resize) else: bash_instance_group_info = "gcloud compute instance-groups managed describe " + instance_group + " --zone=us-central1-a" instance_group_info = subprocess.check_output(bash_instance_group_info, shell=True) cur_size = re.findall("targetSize:.*", instance_group_info, re.MULTILINE) if not cur_size: print("Instance group %s does not exist" % instance_group) bash_delete_auto_resize = "sed -i '/" + rabbitmq_queue + " " + instance_group + " " + mpc + " /d' " + file_path os.system(bash_delete_auto_resize) else: cur_max_replicas = re.findall("maxNumReplicas:.*", instance_group_info, re.MULTILINE) if max_consumers == 0: if not cur_max_replicas: print( "Auto scaling for instance group %s is already disabled" % instance_group) else: resize_instance_group(instance_group, 0, 0) bash_delete_auto_resize = "sed -i '/" + rabbitmq_queue + " " + instance_group + " " + mpc + " /d' " + file_path os.system(bash_delete_auto_resize) else: if messages == 0: if not cur_max_replicas: print( "Auto scaling for instance group %s is already disabled" % instance_group) else: resize_instance_group(instance_group, 0, 0) else: consumers = cl.get_queue(rabbitmq_vhost, rabbitmq_queue).get('consumers') if (messages / mpc) != consumers: if not cur_max_replicas: print( "Auto scaling for instance group %s is disabled, going to resize instance group" % instance_group) resize_instance_group(instance_group, min_consumers, max_consumers) else: cur_max_replicas = int( cur_max_replicas[0].split(": ")[1]) max_replicas = max(cur_max_replicas, max_consumers) min_replicas = min( max(messages / mpc, min_consumers), max_replicas) resize_instance_group(instance_group, min_replicas, max_replicas)
def health_iogt(request): status_code = status.HTTP_200_OK if settings.RABBITMQ_MANAGEMENT_INTERFACE: rx = re.compile(r"amqp://(?P<username>[^:]+).*?:(?P<password>[^@]+)." "*/(?P<vhost>[^&]+)") match = rx.search(settings.BROKER_URL) username = match.groupdict()['username'] password = match.groupdict()['password'] vhost = match.groupdict()['vhost'] base_url = settings.RABBITMQ_MANAGEMENT_INTERFACE mq_client = Client(base_url, username, password) queue_data = mq_client.get_queue(vhost, 'celery') messages = queue_data['messages'] rate = queue_data['messages_details']['rate'] if (messages > 0 and rate == 0): status_code = status.HTTP_500_INTERNAL_SERVER_ERROR app_id = environ.get('MARATHON_APP_ID', None) ver = environ.get('MARATHON_APP_VERSION', None) return JsonResponse({'id': app_id, 'version': ver}, status=status_code)
def getRabbitmqQueueDetails(queueName, host='/'): cluster = constant.config['cluster'] url = constant.rabbitmqCred[cluster] user = constant.rabbitmqCred['username'] passwd = constant.rabbitmqCred['passwd'] obj = Client(url, user, passwd) try: return obj.get_queue(vhost=host, name=queueName) except pyrabbit.http.HTTPError: return {}