All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.metricssampler.extensions.graphite.GraphiteMetricsWriter Maven / Gradle / Ivy

The newest version!
package org.metricssampler.extensions.graphite;

import org.metricssampler.reader.Metric;
import org.metricssampler.reader.MetricValue;
import org.metricssampler.reader.Metrics;
import org.metricssampler.writer.MetricWriteException;
import org.metricssampler.writer.MetricsWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

import static org.apache.commons.io.IOUtils.closeQuietly;
import static org.metricssampler.util.Preconditions.checkArgumentNotNull;

/**
 * Send metrics to graphite. This class is not thread safe and should not be used by multiple samplers.
 */
public class GraphiteMetricsWriter implements MetricsWriter {
	private final Logger logger;

	private final GraphiteOutputConfig config;

	private Socket socket;
	private Writer writer;

	public GraphiteMetricsWriter(final GraphiteOutputConfig config) {
		checkArgumentNotNull(config, "config");
		this.config = config;
		this.logger = LoggerFactory.getLogger("writer."+config.getName());
	}

	@Override
	public void open() throws MetricWriteException {
		if (!isConnected()) {
	        try {
				socket = new Socket(config.getHost(), config.getPort());
				writer = new OutputStreamWriter(socket.getOutputStream());
			} catch (final IOException e) {
				throw new MetricWriteException(e);
			}
		}
	}

	protected boolean isConnected() {
		return socket != null;
	}

	@Override
	public void close() throws MetricWriteException {
		if (isConnected()) {
			closeQuietly(writer);
			closeQuietly(socket);
			writer = null;
			socket = null;
		}
	}

	@Override
	public void write(final Metrics metrics) {
		checkArgumentNotNull(metrics, "metrics");
		assertIsConnected();
		final StringBuilder builder = new StringBuilder();
		for (final Metric entry : metrics) {
			final MetricValue value = entry.getValue();
			if (value.getValue() != null) {
				final String msg = serializeValue(entry.getName().getName(), value);
				builder.append(msg);
			} else {
				logger.debug("Skipping null value for metric [{}]", entry.getName().getName());
			}
		}
		try {
			logger.debug("Sending to graphite:\n"+builder.toString());
			writer.write(builder.toString());
			writer.flush();
		} catch (final IOException e) {
			throw new MetricWriteException(e);
		}
	}

	protected String serializeValue(final String name, final MetricValue value) {
		checkArgumentNotNull(name, "name");
		checkArgumentNotNull(value, "value");
		final long timestamp = value.getTimestamp()/1000;
		final String prefixedName = (config.getPrefix() != null ? config.getPrefix() : "") + name;
		final String graphiteName = prefixedName.replaceAll(" ", "_");
		return graphiteName + " " + value.getValue()+" " + timestamp + "\n";
	}

	protected void assertIsConnected() {
		if (!isConnected()) {
			throw new IllegalStateException("Not connected");
		}
	}

	@Override
	public String toString() {
		return getClass().getSimpleName()+"["+config.getHost()+":"+config.getPort()+"]";
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy