package com.outbrain.gruffalo.netty;
import org.springframework.util.Assert;
import com.outbrain.gruffalo.publish.MetricsPublisher;
import com.outbrain.swinfra.metrics.api.Counter;
import com.outbrain.swinfra.metrics.api.MetricFactory;
import com.outbrain.swinfra.metrics.api.Timer;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
@Sharable
class MetricPublishHandler extends SimpleChannelInboundHandler<Batch> {
private final MetricsPublisher publisher;
private final Timer publishTimer;
private final Counter metricsCounter;
public MetricPublishHandler(final MetricsPublisher publisher, final MetricFactory metricFactory) {
Assert.notNull(publisher, "publisher may not be null");
Assert.notNull(metricFactory, "metricFactory may not be null");
this.publisher = publisher;
String component = getClass().getSimpleName();
publishTimer = metricFactory.createTimer(component, "publishMetricsBatch");
metricsCounter = metricFactory.createCounter(component, "metricsSent");
}
@Override
public void channelRead0(final ChannelHandlerContext ctx, final Batch msg) throws Exception {
Timer.Context timerContext = publishTimer.time();
try {
publisher.publishMetrics(msg.payload.toString());
metricsCounter.inc(msg.batchSize);
} finally {
timerContext.stop();
}
}
}