/** * AlertsManager.java * * Copyright (c) 2011 Gluster, Inc. * This file is part of Gluster Management Console. * * Gluster Management Console is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Gluster Management Console is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License * for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see * . */ package org.gluster.storage.management.console; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; import org.gluster.storage.management.console.preferences.PreferenceConstants; import org.gluster.storage.management.core.model.Alert; import org.gluster.storage.management.core.model.Brick; import org.gluster.storage.management.core.model.Cluster; import org.gluster.storage.management.core.model.Disk; import org.gluster.storage.management.core.model.GlusterServer; import org.gluster.storage.management.core.model.Partition; import org.gluster.storage.management.core.model.Volume; import org.gluster.storage.management.core.model.Alert.ALERT_TYPES; import org.gluster.storage.management.core.model.Brick.BRICK_STATUS; import org.gluster.storage.management.core.model.Server.SERVER_STATUS; import org.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import org.gluster.storage.management.core.utils.NumberUtil; public class AlertsManager { private List alerts = new ArrayList(); private Cluster cluster; private Double CPU_USAGE_THRESHOLD; private Double MEMORY_USAGE_THRESHOLD; private Double DISK_SPACE_USAGE_THRESHOLD; public AlertsManager(Cluster cluster) { this.cluster = cluster; IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); CPU_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD); MEMORY_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_MEMORY_USAGE_THRESHOLD); DISK_SPACE_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD); } public List getAlerts() { return alerts; } public Alert getAlert(String id) { for (Alert alert : getAlerts()) { if (alert.getId().equals(id)) { return alert; } } return null; } public void addAlert(Alert alert) { alerts.add(alert); } public void addAlerts(List alerts) { this.alerts.addAll(alerts); } public void setAlerts(List alerts) { this.alerts = alerts; } public Boolean removeAlert(String id) { for (int i = 0; i < alerts.size(); i++) { if (alerts.get(i).getId().equals(id)) { return (alerts.remove(i) != null); } } return false; } public void clearAll() { this.alerts.clear(); } public void buildAlerts() { clearAll(); addAlerts(getServerAlerts()); addAlerts(getVolumeAlerts()); } private List getServerAlerts() { List serverAlerts = new ArrayList(); Alert offlineServerAlert = getOfflineServerAlerts(); if (offlineServerAlert != null) { serverAlerts.add(offlineServerAlert); // Single alert for offline servers } for (GlusterServer server : cluster.getServers()) { // To check off line servers // if (server.getStatus() == SERVER_STATUS.OFFLINE) { // serverAlerts.add(new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, server.getName(), "Server [" // + server.getName() + "] is Offline")); // continue; // If the server is Offline skip other Alert builds // } // To check High CPU usage if (server.getCpuUsage() >= CPU_USAGE_THRESHOLD) { serverAlerts.add(new Alert(ALERT_TYPES.CPU_USAGE_ALERT, server.getName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.CPU_USAGE_ALERT.ordinal()] + " [" + NumberUtil.formatNumber(server.getCpuUsage()) + "] in server [" + server.getName() + "]")); } // To check High Memory usage Double memoryUtilized = server.getMemoryInUse() / server.getTotalMemory() * 100d; if (memoryUtilized >= MEMORY_USAGE_THRESHOLD) { serverAlerts.add(new Alert(ALERT_TYPES.MEMORY_USAGE_ALERT, server.getName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.MEMORY_USAGE_ALERT.ordinal()] + " [" + NumberUtil.formatNumber(memoryUtilized) + "%] in server [" + server.getName() + "]")); } // To Check low disk space serverAlerts.addAll(getLowDiskAlerts(server)); } return serverAlerts; } private Alert getOfflineServerAlerts() { List offlineServers = new ArrayList(); for (GlusterServer server : cluster.getServers()) { if (server.getStatus() == SERVER_STATUS.OFFLINE) { offlineServers.add(server.getName()); } } if (offlineServers.size() > 0) { return new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, "Server", Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_SERVERS_ALERT.ordinal()] + "(s) " + offlineServers.toString()); } return null; } private List getLowDiskAlerts(GlusterServer server) { List diskAlerts = new ArrayList(); boolean hasPartition; Double deviceSpaceUsed; for (Disk disk : server.getDisks()) { hasPartition = false; for (Partition partition : disk.getPartitions()) { hasPartition = true; deviceSpaceUsed = partition.getSpaceInUse() / partition.getSpace() * 100d; if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, partition.getQualifiedName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + NumberUtil.formatNumber(deviceSpaceUsed) + "% used] in disk [" + partition.getQualifiedName() + "]")); } } if (hasPartition) { continue; // Do not check disk usage } // If it is disk deviceSpaceUsed = disk.getSpaceInUse() / disk.getSpace() * 100d; if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, disk.getQualifiedName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + NumberUtil.formatNumber(deviceSpaceUsed) + "% used] in [" + disk.getQualifiedName() + "]")); } } return diskAlerts; } private List getVolumeAlerts() { List volumeAlerts = new ArrayList(); List offlineBricks = new ArrayList(); for (Volume volume : cluster.getVolumes()) { if (volume.getStatus() == VOLUME_STATUS.OFFLINE) { volumeAlerts.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_ALERT, volume.getName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_ALERT.ordinal()] + " [" + volume.getName() + "]")); continue; } // To check off line bricks offlineBricks = new ArrayList(); for (Brick brick : volume.getBricks()) { if (brick.getStatus() == BRICK_STATUS.OFFLINE) { offlineBricks.add(brick.getQualifiedName()); } } // One offline brick alert per volume if (offlineBricks.size() > 0) { volumeAlerts.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT, volume.getName(), Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT.ordinal()] + " " + offlineBricks.toString() + " in volume " + volume.getName())); } } return volumeAlerts; } }