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

com.flozano.metrics.client.log.LogMetricsClient Maven / Gradle / Ivy

The newest version!
package com.flozano.metrics.client.log;

import static java.util.Objects.requireNonNull;

import java.time.Instant;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;

import org.slf4j.Logger;

import com.flozano.metrics.Tags.Tag;
import com.flozano.metrics.client.MetricValue;
import com.flozano.metrics.client.MetricsClient;

public class LogMetricsClient implements MetricsClient {
	private final Logger logger;

	public LogMetricsClient(Logger logger) {
		this.logger = requireNonNull(logger);
	}

	@Override
	public CompletableFuture send(MetricValue... metrics) {
		String t = time();
		for (MetricValue m : metrics) {
			metric(t, m);
		}
		return CompletableFuture.completedFuture(null);
	}

	@Override
	public CompletableFuture send(Stream metrics) {
		String t = time();
		metrics.forEach(m -> metric(t, m));
		return CompletableFuture.completedFuture(null);
	}

	private void metric(String t, MetricValue m) {
		String key = formatKey(m);
		String value = formatValue(m);
		StringBuilder sb = new StringBuilder("time:").append(t).append(key).append(value);
		apply(m, key, sb.toString());
	}

	protected void apply(MetricValue m, String key, String value) {
		logger.info(value);
	}

	private String formatValue(MetricValue m) {
		StringBuilder sb = new StringBuilder("\t").append(m.getCode()).append(':').append(m.getValue());
		if (m.getSampleRate() != null && m.getSampleRate() < 1) {
			sb.append("\tr:").append(m.getSampleRate());
		}
		return sb.toString();
	}

	private String formatKey(MetricValue m) {
		StringBuilder sb = new StringBuilder("\tm:").append(m.getName());
		m.getTags().stream().map(this::formatTag).forEach(sb::append);
		return sb.toString();
	}

	private CharSequence formatTag(Tag tag) {
		return new StringBuilder("\t").append(tag.name).append(':').append(tag.value);
	}

	@Override
	public MetricsClient batch() {
		return new Batch();
	}

	@Override
	public void close() {

	}

	private static String time() {
		return Instant.now().toString();
	}

	private class Batch implements MetricsClient {

		List pending = new LinkedList<>();
		String t = Instant.now().toString();

		@Override
		public CompletableFuture send(MetricValue... metrics) {
			for (MetricValue m : metrics) {
				pending.add(m);
			}
			return CompletableFuture.completedFuture(null);
		}

		@Override
		public MetricsClient batch() {
			return this;
		}

		@Override
		public void close() {
			for (MetricValue m : pending) {
				metric(t, m);
			}
		}

	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy