/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.view.slider;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.Exception;
import java.util.*;
@Singleton
public class SliderAppsAlerts {
private static final Logger logger = LoggerFactory
.getLogger(SliderAppsAlerts.class);
public Map<String, Object> generateComponentsAlerts(Map<String, SliderAppComponent> components, String service){
HashMap<String, Object> result = new HashMap<String, Object>();
Set<Map<AlertField,Object>> details = buildAlertsDetails(components, service);
result.put("detail", details);
result.put("summary", buildAlertsSummary(details));
return result;
}
private Map<AlertState,Integer> buildAlertsSummary(Set<Map<AlertField,Object>> details){
Map<AlertState,Integer> result = new HashMap<AlertState, Integer>();
// Initial filling of map with available states
for (AlertState state:AlertState.values()){
result.put(state, 0);
}
for(Map<AlertField,Object> item:details){
AlertState state = (AlertState)item.get(AlertField.status);
result.put(state,result.get(state)+1);
}
return result;
}
private Set<Map<AlertField,Object>> buildAlertsDetails(Map<String, SliderAppComponent> components, String service){
HashSet<Map<AlertField,Object>> resultList = new HashSet<Map<AlertField, Object>>();
for (String componentKey:components.keySet()){
resultList.add(buildComponentAlert(components.get(componentKey), service));
}
return resultList;
}
private Map<AlertField,Object> buildComponentAlert(SliderAppComponent component, String service){
HashMap<AlertField,Object> alertItem = new HashMap<AlertField, Object>();
Date date = Calendar.getInstance().getTime();
int totalContainerCount = component.getInstanceCount();
int activeContainerCount = component.getActiveContainers() != null ? component
.getActiveContainers().size() : 0;
AlertState state = AlertState.UNKNOWN;
String message = String.format("%s out of %s active", activeContainerCount,
totalContainerCount);
if (totalContainerCount == activeContainerCount || totalContainerCount < 1) {
// Everything OK
state = AlertState.OK;
} else {
float fraction = (float) activeContainerCount / (float) totalContainerCount;
if (fraction <= 0.2) { // less than or equal to 20%
state = AlertState.WARNING;
} else {
state = AlertState.CRITICAL;
}
}
alertItem.put(AlertField.description, String.format("%s component",component.getComponentName()));
alertItem.put(AlertField.host_name, getComponentHostName(component));
alertItem.put(AlertField.last_status, state);
alertItem.put(AlertField.last_status_time, new java.sql.Timestamp(date.getTime()));
alertItem.put(AlertField.service_name, service.toUpperCase());
alertItem.put(AlertField.component_name, component.getComponentName());
alertItem.put(AlertField.status, state);
alertItem.put(AlertField.status_time, new java.sql.Timestamp(date.getTime()));
alertItem.put(AlertField.output, message);
alertItem.put(AlertField.actual_status, state);
return alertItem;
}
@SuppressWarnings("unchecked")
private String getComponentHostName(SliderAppComponent component){
Map<String,Map<String,String>> containers = null;
if (component.getActiveContainers().size() > 0){
containers = component.getActiveContainers();
}
if (component.getCompletedContainers().size() > 0 && containers == null) {
containers =component.getCompletedContainers();
}
if (containers != null){
try {
// try to obtain host name from any first available container
return ((Map<String,String>)containers.values().toArray()[0]).get("host");
} catch (Exception e){
if (logger.isDebugEnabled()){
logger.warn("Couldn't obtain host name for the component", e);
}
}
}
return null;
}
}