package com.github.digital_wonderland.sling_metrics.listener;
import com.codahale.metrics.Counter;
import com.github.digital_wonderland.sling_metrics.service.MetricService;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.event.EventUtil;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(metatype = false, immediate = true)
@Service(value = EventHandler.class)
@Property(name="event.topics", value = "metric/counters", propertyPrivate = true)
public class CounterEventListener implements EventHandler {
private static final Logger LOG = LoggerFactory.getLogger(CounterEventListener.class);
@Reference
protected MetricService metricService;
@Override
public void handleEvent(final Event event) {
if(EventUtil.isLocal(event) && metricService.isEnabled()) {
final String name = (String) event.getProperty(MetricEvent.NAME);
final String value = (String) event.getProperty(MetricEvent.VALUE);
if(StringUtils.isNotEmpty(name)) {
if(StringUtils.isEmpty(value)) {
try {
final long l = Long.parseLong(value);
final Counter counter = metricService.counter(name);
if(0 < l) {
counter.inc(l);
} else {
counter.dec(l);
}
} catch(NumberFormatException e) {
LOG.error(e.getMessage(), e);
}
} else {
LOG.warn("Received counter metric event without value: [{}]", event);
}
} else {
LOG.warn("Received metric event without name: [{}]", event);
}
}
}
}