/**
* 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.server.controller.metrics.ganglia;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
/**
* Data structure for temporal data returned from Ganglia Web.
*/
public class GangliaMetric {
// Note that the member names correspond to the names in the JSON returned from Ganglia Web.
/**
* The name.
*/
private String ds_name;
/**
* The ganglia cluster name.
*/
private String cluster_name;
/**
* The graph type.
*/
private String graph_type;
/**
* The host name.
*/
private String host_name;
/**
* The metric name.
*/
private String metric_name;
/**
* The temporal data points.
*/
private Number[][] datapoints;
private static final Set<String> PERCENTAGE_METRIC;
//BUG-3386 Cluster CPU Chart is off the charts
// Here can be added other percentage metrics
static {
Set<String> temp = new HashSet<>();
temp.add("cpu_wio");
temp.add("cpu_idle");
temp.add("cpu_nice");
temp.add("cpu_aidle");
temp.add("cpu_system");
temp.add("cpu_user");
PERCENTAGE_METRIC = Collections.unmodifiableSet(temp);
}
// ----- GangliaMetric -----------------------------------------------------
public String getDs_name() {
return ds_name;
}
public void setDs_name(String ds_name) {
this.ds_name = ds_name;
}
public String getCluster_name() {
return cluster_name;
}
public void setCluster_name(String cluster_name) {
this.cluster_name = cluster_name;
}
public String getGraph_type() {
return graph_type;
}
public void setGraph_type(String graph_type) {
this.graph_type = graph_type;
}
public String getHost_name() {
return host_name;
}
public void setHost_name(String host_name) {
this.host_name = host_name;
}
public String getMetric_name() {
return metric_name;
}
public void setMetric_name(String metric_name) {
this.metric_name = metric_name;
}
public Number[][] getDatapoints() {
return datapoints;
}
public void setDatapoints(Number[][] datapoints) {
this.datapoints = datapoints;
}
public void setDatapointsFromList(List<GangliaMetric.TemporalMetric> listTemporalMetrics) {
//this.datapoints = datapoints;
Number[][] datapointsArray = new Number[listTemporalMetrics.size()][2];
int cnt = 0;
if (PERCENTAGE_METRIC.contains(metric_name)) {
int firstIndex = 0;
int lastIndex = listTemporalMetrics.size() - 1;
for (int i = firstIndex; i <= lastIndex; ++i) {
GangliaMetric.TemporalMetric m = listTemporalMetrics.get(i);
Number val = m.getValue();
if (100.0 >= val.doubleValue()) {
datapointsArray[cnt][0] = val;
datapointsArray[cnt][1] = m.getTime();
cnt++;
}
}
} else {
int firstIndex = 0;
int lastIndex = listTemporalMetrics.size() - 1;
for (int i = firstIndex; i <= lastIndex; ++i) {
GangliaMetric.TemporalMetric m = listTemporalMetrics.get(i);
datapointsArray[i][0] = m.getValue();
datapointsArray[i][1] = m.getTime();
cnt++;
}
}
this.datapoints = new Number[cnt][2];
for (int i = 0; i < this.datapoints.length; i++) {
this.datapoints[i][0] = datapointsArray[i][0];
this.datapoints[i][1] = datapointsArray[i][1];
}
}
// ----- Object overrides --------------------------------------------------
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("\n");
stringBuilder.append("name=");
stringBuilder.append(ds_name);
stringBuilder.append("\n");
stringBuilder.append("cluster name=");
stringBuilder.append(cluster_name);
stringBuilder.append("\n");
stringBuilder.append("graph type=");
stringBuilder.append(graph_type);
stringBuilder.append("\n");
stringBuilder.append("host name=");
stringBuilder.append(host_name);
stringBuilder.append("\n");
stringBuilder.append("api name=");
stringBuilder.append(metric_name);
stringBuilder.append("\n");
stringBuilder.append("datapoints (value/timestamp):");
stringBuilder.append("\n");
boolean first = true;
stringBuilder.append("[");
for (Number[] m : datapoints) {
if (!first) {
stringBuilder.append(",");
}
stringBuilder.append("[");
stringBuilder.append(m[0]);
stringBuilder.append(",");
stringBuilder.append(m[1].longValue());
stringBuilder.append("]");
first = false;
}
stringBuilder.append("]");
return stringBuilder.toString();
}
public static class TemporalMetric {
private Number m_value;
private Number m_time;
private boolean valid;
public boolean isValid() {
return valid;
}
public TemporalMetric(String value, Number time) {
valid = true;
try{
m_value = convertToNumber(value);
} catch (NumberFormatException e) {
valid = false;
}
m_time = time;
}
public Number getValue() {
return m_value;
}
public Number getTime() {
return m_time;
}
private Number convertToNumber(String s) throws NumberFormatException {
Number res;
if(s.contains(".")){
Double d = Double.parseDouble(s);
if(d.isNaN() || d.isInfinite()){
throw new NumberFormatException(s);
} else {
res = d;
}
} else {
res = Long.parseLong(s);
}
return res;
}
}
}