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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
 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 {}