package de.is24.util.monitoring.state2graphite;
import de.is24.util.monitoring.tools.ConnectionState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
public class GraphiteConnection {
private static final Logger LOGGER = LoggerFactory.getLogger(GraphiteConnection.class);
private final String graphiteHost;
private final int graphitePort;
private ConnectionState connectionState = ConnectionState.UNKNOWN;
private long lastReportTimestamp = 0;
private static long connectionFailureLogDelay = 10 * 60 * 1000; // 10 minutes in milliseconds
public GraphiteConnection(String graphiteHost, int graphitePort) {
this.graphiteHost = graphiteHost;
this.graphitePort = graphitePort;
}
/**
* Part of this code taken from http://neopatel.blogspot.de/2011/04/logging-to-graphite-monitoring-tool.html
*/
public void send(String msg) {
try {
Socket socket = new Socket(graphiteHost, graphitePort);
try {
Writer writer = new OutputStreamWriter(socket.getOutputStream());
try {
writer.write(msg);
writer.flush();
} finally {
try {
writer.close();
} catch (IOException ioe) {
//ignore, we want to see the outer exception if any
LOGGER.info("could not close writer");
}
}
if (connectionState != ConnectionState.SUCCESS) {
LOGGER.info("Connection to graphite Host {}",
((connectionState == ConnectionState.UNKNOWN) ? "established" : "recovered"));
connectionState = ConnectionState.SUCCESS;
}
} catch (IOException e) {
String action = "write";
handleException(e, action);
} finally {
socket.close();
}
} catch (IOException e) {
String action = "connect";
handleException(e, action);
}
}
private void handleException(IOException e, String action) {
// we log on state transition and every 10 minutes
if (connectionState != ConnectionState.FAILED) {
connectionState = ConnectionState.FAILED;
LOGGER.warn("could not " + action + " to graphite host " + graphiteHost + " on port " + graphitePort, e);
lastReportTimestamp = System.currentTimeMillis();
}
if ((System.currentTimeMillis() - lastReportTimestamp) > connectionFailureLogDelay) {
LOGGER.warn("could not " + action + " to graphite host " + graphiteHost + " on port " + graphitePort, e);
lastReportTimestamp = System.currentTimeMillis();
}
}
@Override
public String toString() {
return "GraphiteConection:" + graphiteHost + "," + graphitePort;
}
}