def database_periodic(self, event_mgr): try: cassandra_data_dirs = self._get_cassandra_config_option( "data_file_directories") cassandra_data_dir_exists = False total_disk_space_used = 0 total_disk_space_available = 0 total_db_size = 0 for data_dir in cassandra_data_dirs: cdir = None if self._db_owner == 'analytics': data = self.exec_cmd("ls -1 {}/".format(data_dir)) all_analytics_dirs = [ n.strip() for n in data.split('\n') if n.startswith("ContrailAnalyticsCql") ] if all_analytics_dirs: # for now we assume the partition for all analytics # clusters are the same cdir = data_dir + '/' + all_analytics_dirs[0] elif self._db_owner == 'config': cdir = data_dir if not cdir: continue cassandra_data_dir_exists = True msg = "dir for " + self._db_owner + " is " + cdir event_mgr.msg_log(msg, level=SandeshLevel.SYS_DEBUG) (disk_space_used, disk_space_available) = (self.disk_free(cdir)) total_disk_space_used += int(disk_space_used) total_disk_space_available += int(disk_space_available) db_size = self.disk_usage(cdir) total_db_size += int(db_size) if not cassandra_data_dir_exists: if self._db_owner not in self.contrail_databases: event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_DISK_SPACE_NA else: event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA else: event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_DISK_SPACE_NA disk_space = int(total_disk_space_used) + int( total_disk_space_available) if (disk_space / (1024 * 1024) < self.minimum_diskgb): # TODO: here was a call that stops cassandra's service event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE db_stat = DatabaseUsageStats() db_info = DatabaseUsageInfo() db_stat.disk_space_used_1k = int(total_disk_space_used) db_stat.disk_space_available_1k = int( total_disk_space_available) if self._db_owner == 'analytics': db_stat.analytics_db_size_1k = int(total_db_size) elif self._db_owner == 'config': db_stat.config_db_size_1k = int(total_db_size) db_info.name = self.hostname db_info.database_usage = [db_stat] usage_stat = DatabaseUsage(data=db_info) usage_stat.send() except Exception as e: msg = "Failed to get database usage: " + str(e) event_mgr.msg_log(msg, level=SandeshLevel.SYS_ERR) event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA # just check connectivity if (self.db_user and self.db_password): cqlsh_cmd = "cqlsh -u {} -p {} {} {} -e quit".format( self.db_user, self.db_password, self.hostip, self.db_port) else: cqlsh_cmd = "cqlsh {} {} -e quit".format(self.hostip, self.db_port) try: self.exec_cmd(cqlsh_cmd) event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_SERVER_PORT except: msg = "Failed to connect to database by CQL: " + str(e) event_mgr.msg_log(msg, level=SandeshLevel.SYS_ERR) event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_SERVER_PORT event_mgr.send_nodemgr_process_status() # Send cassandra nodetool information self.send_database_status(event_mgr) # Record cluster status and shut down cassandra if needed self.status()
def database_periodic(self, event_mgr): try: cassandra_data_dirs = self._get_cassandra_config_option( "data_file_directories") cassandra_data_dir_exists = False total_disk_space_used = 0 total_disk_space_available = 0 total_db_size = 0 for cassandra_data_dir in cassandra_data_dirs: if CassandraManager.cassandra_old(): analytics_dir = cassandra_data_dir + '/ContrailAnalytics' else: import glob all_analytics_dirs = glob.glob(cassandra_data_dir + '/ContrailAnalyticsCql*') if all_analytics_dirs: #for now we assume the partition for all analytics clusters is same analytics_dir = all_analytics_dirs[0] if self._db_name == 'analyticsDb' and os.path.exists( analytics_dir): cassandra_data_dir_exists = True msg = "analytics_dir is " + analytics_dir event_mgr.msg_log(msg, level=SandeshLevel.SYS_DEBUG) (disk_space_used, disk_space_available) = ( self.disk_space_helper(analytics_dir)) total_disk_space_used += int(disk_space_used) total_disk_space_available += int(disk_space_available) du = subprocess.Popen(["du", "-skl", analytics_dir], stdout=subprocess.PIPE, close_fds=True) db_size, directory = du.communicate()[0].split() total_db_size += int(db_size) elif os.path.exists( cassandra_data_dir) and self._db_name == 'configDb': cassandra_data_dir_exists = True msg = "cassandra_dir is " + cassandra_data_dir (disk_space_used, disk_space_available) = ( self.disk_space_helper(cassandra_data_dir)) total_disk_space_used += int(disk_space_used) total_disk_space_available += int(disk_space_available) du = subprocess.Popen(["du", "-skl", cassandra_data_dir], stdout=subprocess.PIPE, close_fds=True) db_size, directory = du.communicate()[0].split() total_db_size += int(db_size) if cassandra_data_dir_exists == False: if ((self._db_name == 'analyticsDb' and 'analytics' not in self.contrail_databases) or (self._db_name == 'configDb' and 'config' not in self.contrail_databases)): event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_DISK_SPACE_NA else: event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA else: event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_DISK_SPACE_NA db_stat = DatabaseUsageStats() db_info = DatabaseUsageInfo() db_stat.disk_space_used_1k = int(total_disk_space_used) db_stat.disk_space_available_1k = int( total_disk_space_available) if self._db_name == 'analyticsDb': db_stat.analytics_db_size_1k = int(total_db_size) elif self._db_name == 'configDb': db_stat.config_db_size_1k = int(total_db_size) db_info.name = socket.gethostname() db_info.database_usage = [db_stat] usage_stat = DatabaseUsage(data=db_info) usage_stat.send() except: msg = "Failed to get database usage" event_mgr.msg_log(msg, level=SandeshLevel.SYS_ERR) event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA cqlsh_cmd = "cqlsh " + self.hostip + " " + self.db_port + " -e quit" proc = subprocess.Popen(cqlsh_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) (output, errout) = proc.communicate() if proc.returncode != 0: event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_SERVER_PORT else: event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_SERVER_PORT event_mgr.send_nodemgr_process_status() # Send cassandra nodetool information self.send_database_status(event_mgr) # Record cluster status and shut down cassandra if needed self.status()
def database_periodic(self, event_mgr): try: cassandra_data_dirs = self._get_cassandra_config_option( "data_file_directories") cassandra_data_dir_exists = False total_disk_space_used = 0 total_disk_space_available = 0 total_db_size = 0 for cdir in cassandra_data_dirs: cassandra_data_dir_exists = True msg = "dir for " + self._db_owner + " is " + cdir event_mgr.msg_log(msg, level=SandeshLevel.SYS_DEBUG) (disk_space_used, disk_space_available) = (self.disk_free(cdir)) total_disk_space_used += int(disk_space_used) total_disk_space_available += int(disk_space_available) db_size = self.disk_usage(cdir) total_db_size += int(db_size) if not cassandra_data_dir_exists: event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA else: event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_DISK_SPACE_NA disk_space = int(total_disk_space_used) + int( total_disk_space_available) if (disk_space / (1024 * 1024) < self.minimum_diskgb): # TODO: here was a call that stops cassandra's service event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE db_stat = DatabaseUsageStats() db_info = DatabaseUsageInfo() db_stat.disk_space_used_1k = int(total_disk_space_used) db_stat.disk_space_available_1k = int( total_disk_space_available) if self._db_owner == 'analytics': db_stat.analytics_db_size_1k = int(total_db_size) elif self._db_owner == 'config': db_stat.config_db_size_1k = int(total_db_size) db_info.name = self.hostname db_info.database_usage = [db_stat] usage_stat = DatabaseUsage(table=self.table, data=db_info) usage_stat.send() except Exception as e: msg = "Failed to get database usage: " + str(e) event_mgr.msg_log(msg, level=SandeshLevel.SYS_ERR) event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_DISK_SPACE_NA # just check connectivity cqlsh_cmd = "cqlsh" if self.db_use_ssl: cqlsh_cmd += " --ssl" if (self.db_user and self.db_password): cqlsh_cmd += " -u {} -p {}".format(self.db_user, self.db_password) cqlsh_cmd += " {} {} -e quit".format(self.hostip, self.db_port) try: self.exec_cmd(cqlsh_cmd) event_mgr.fail_status_bits &= ~event_mgr.FAIL_STATUS_SERVER_PORT except Exception as e: msg = "Failed to connect to database by CQL: " + str(e) event_mgr.msg_log(msg, level=SandeshLevel.SYS_ERR) event_mgr.fail_status_bits |= event_mgr.FAIL_STATUS_SERVER_PORT event_mgr.send_nodemgr_process_status() # Send cassandra nodetool information self.send_database_status(event_mgr) # Record cluster status and shut down cassandra if needed self.status()