/* Released under the GPL2. See license.txt for details. */
package br.com.centralit.nagios;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class PerformanceData {
private final TreeMap<String, PerformanceDataPerElement> map = new TreeMap<String, PerformanceDataPerElement>();
public PerformanceData() {}
public PerformanceData(final String fileName) throws Exception {
String line;
try (final BufferedReader in = new BufferedReader(new FileReader(fileName))) {
while ((line = in.readLine()) != null) {
// thegate | HTTP;time;0.009249|0.009249
final String[] parts = line.split(";");
PerformanceDataPerElement newElement = map.get(parts[0]);
if (newElement == null) {
newElement = new PerformanceDataPerElement();
map.put(parts[0], newElement);
}
final DataSource dataSource = newElement.add(parts[1]);
final String[] values = parts[2].split("\\|");
for (final String value : values) {
dataSource.add(Double.valueOf(value));
}
}
}
}
public PerformanceDataPerElement get(final String element) {
return map.get(element);
}
public PerformanceDataPerElement get(final String host, final String service) {
if (service != null) {
return map.get(host + " | " + service);
}
return map.get(host);
}
public void add(final String element, final String nagiosPerfomanceDataLine, final String checkTime) {
PerformanceDataPerElement current = map.get(element);
if (current == null) {
current = new PerformanceDataPerElement();
map.put(element, current);
}
if (current.getCheckTime().equals(checkTime) == true) {
return;
}
current.setCheckTime(checkTime);
// rta=0.168000ms;1000.000000;2000.000000;0.000000 pl=0%;20;60;0
final String[] sets = nagiosPerfomanceDataLine.split(" ");
for (final String currentSet : sets) {
final int is = currentSet.indexOf("=");
if (is == -1) {
continue;
}
final String name = currentSet.substring(0, is);
int data = is + 1;
while (data < currentSet.length()
&& (currentSet.charAt(data) == '.' || currentSet.charAt(data) == '-' || currentSet.charAt(data) >= '0' && currentSet.charAt(data) <= '9')) {
data++;
}
final String valueStr = currentSet.substring(is + 1, data).trim();
if (valueStr.equals("") == false) {
final double value = Double.valueOf(valueStr);
current.add(name, value);
final String afterValue = currentSet.substring(data);
final int semiColon = afterValue.indexOf(";");
if (semiColon > 0) {
final String unit = afterValue.substring(0, semiColon);
current.setDataSourceUnit(name, unit);
} else if (afterValue.length() > 0 && semiColon != 0) {
current.setDataSourceUnit(name, afterValue);
}
}
}
}
public List<PerformanceDataPerElement> getAllElements() {
return new ArrayList<PerformanceDataPerElement>(map.values());
}
void writeLine(final BufferedWriter out, final String line) throws Exception {
out.write(line, 0, line.length());
out.newLine();
}
public void dump(final String fileName) throws Exception {
try (final BufferedWriter out = new BufferedWriter(new FileWriter(fileName))) {
for (final Map.Entry<String, PerformanceDataPerElement> entry : map.entrySet()) {
for (final DataSource currentDataSource : entry.getValue().getAllDataSources()) {
final StringBuilder output = new StringBuilder();
boolean first = true;
output.append(entry.getKey());
output.append(";");
output.append(currentDataSource.getDataSourceName());
output.append(";");
for (final Double currentData : currentDataSource.getData()) {
if (first) {
first = false;
} else {
output.append("|");
}
output.append("" + currentData);
}
this.writeLine(out, output.toString());
}
}
}
}
}