def get_partition_handling(self): """Get the partition handling settings.""" results = self.results.find_by_tag("cluster_partition_handling") if not results: return setting = results[0].get(1) if setting == "ignore": msg = "Cluster partition handling is currently set to ignore. " \ "This is potentially dangerous and a setting of " \ "pause_minority is recommended." issues_utils.add_issue(issue_types.RabbitMQWarning(msg)) self.resources["cluster-partition-handling"] = setting
def check_log_errors(self): path = os.path.join(constants.DATA_ROOT, 'var/log/rabbitmq/rabbit@*.log') if constants.USE_ALL_LOGS: path = f"{path}*" self.searcher.add_search_term(SearchDef(r".+ \S+_partitioned_network", tag="partitions"), path=path) results = self.searcher.search() if results.find_by_tag("partitions"): msg = ("cluster either has or has had partitions - check " "cluster_status") issues_utils.add_issue(issue_types.RabbitMQWarning(msg))
def get_queues(self): """Get distribution of queues across cluster.""" sd = self._sequences["queues"]["searchdef"] vhost_queues = {} raise_issues = [] for results in self.results.find_sequence_sections(sd).values(): vhost = None queues = {} for result in results: if result.tag == sd.start_tag: vhost = result.get(1) elif result.tag == sd.body_tag: info = {"pid_name": result.get(1), "queue": result.get(2)} if info["pid_name"] not in queues: queues[info["pid_name"]] = 1 else: queues[info["pid_name"]] += 1 vhost_queues[vhost] = {} if len(queues.keys()) == 0: continue total = functools.reduce(lambda x, y: x + y, list(queues.values()), 0) vhost_queues[vhost] = {} for pid in queues: if total > 0: fraction = queues[pid] / total fraction_string = "{:.2f}%".format(fraction * 100) if fraction > 2 / 3: raise_issues.append( "{} holds more than 2/3 of queues".format(pid)) else: fraction_string = "N/A" vhost_queues[vhost][pid] = "{:d} ({})".format( queues[pid], fraction_string) for issue in raise_issues: issues_utils.add_issue(issue_types.RabbitMQWarning(issue)) if vhost_queues: # list all vhosts but only show their queues if not [] self.resources["vhosts"] = sorted(list(vhost_queues.keys())) self.resources["vhost-queue-distributions"] = \ {k: v for k, v in vhost_queues.items() if v}
def get_queue_info(self): """Get distribution of queues across cluster.""" sd = self._sequences["queues"]["searchdef"] vhost_queues = {} issues_raised = {} skewed_queue_nodes = {} for results in self.results.find_sequence_sections(sd).values(): vhost = None queues = {} for result in results: if result.tag == sd.start_tag: # check both report formats vhost = result.get(1) elif result.tag == sd.body_tag: node_name = result.get(1) or result.get(4) # if we matched the section header, skip if node_name == "pid": continue queue = result.get(2) or result.get(3) # if we matched the section header, skip if queue == "name": continue if node_name not in queues: queues[node_name] = 0 queues[node_name] += 1 vhost_queues[vhost] = {} if not queues: continue total = sum(queues.values()) for node_name in queues: if total > 0: fraction = queues[node_name] / total fraction_string = "{:.2f}%".format(fraction * 100) if fraction > 2 / 3: if node_name not in skewed_queue_nodes: skewed_queue_nodes[node_name] = 0 skewed_queue_nodes[node_name] += 1 else: fraction_string = "N/A" vhost_queues[vhost][node_name] = "{:d} ({})".format( queues[node_name], fraction_string) # Report the node with the greatest skew of queues/vhost if skewed_queue_nodes: max_node = None for node_name in skewed_queue_nodes: if max_node is None: max_node = node_name elif (skewed_queue_nodes[node_name] >= skewed_queue_nodes[max_node]): max_node = node_name if (skewed_queue_nodes[max_node] > issues_raised.get(max_node, 0)): issues_raised[max_node] = skewed_queue_nodes[max_node] # this should only actually ever report one node for node_name in issues_raised: msg = ("{} holds more than 2/3 of queues for {}/{} vhost(s)". format(node_name, issues_raised[node_name], len(vhost_queues))) issues_utils.add_issue(issue_types.RabbitMQWarning(msg)) if vhost_queues: # list all vhosts but only show their queues if not [] self.resources["vhosts"] = sorted(list(vhost_queues.keys())) self.resources["vhost-queue-distributions"] = \ {k: v for k, v in vhost_queues.items() if v}