Skip to content

Instantly share code, notes, and snippets.

@aldrinleal
Last active January 2, 2016 06:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aldrinleal/8262171 to your computer and use it in GitHub Desktop.
Save aldrinleal/8262171 to your computer and use it in GitHub Desktop.
Camel / Metrics Event Publishing
package yourcompany.camel.metrics;
import com.codahale.metrics.MetricRegistry;
import org.apache.camel.Exchange;
import org.apache.camel.management.event.AbstractExchangeEvent;
import org.apache.camel.management.event.ExchangeCompletedEvent;
import org.apache.camel.management.event.ExchangeFailedEvent;
import org.apache.camel.management.event.ExchangeRedeliveryEvent;
import org.apache.camel.support.EventNotifierSupport;
import org.joda.time.Period;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.EventObject;
import java.util.concurrent.TimeUnit;
import static com.codahale.metrics.MetricRegistry.name;
@Component("camelMetricsUpdater")
public class CamelMetricsUpdater extends EventNotifierSupport {
private static final Logger logger = LoggerFactory.getLogger(CamelMetricsUpdater.class);
@Autowired
MetricRegistry metrics;
@Override
public void notify(EventObject event) throws Exception {
boolean covered = false;
if (event instanceof AbstractExchangeEvent) {
AbstractExchangeEvent ev = AbstractExchangeEvent.class.cast(event);
final Exchange exchange = ev.getExchange();
String metricPrefix = "";
if ((metricPrefix = exchange.getProperty("CamelMetricSuffix", "", String.class)).equals(""))
return;
if (ev instanceof ExchangeCompletedEvent || ev instanceof ExchangeFailedEvent || ev instanceof ExchangeRedeliveryEvent) {
onExchangeCompletedEvent(ev, metricPrefix);
covered = true;
} else {
metrics.meter(name(event.getClass(), metricPrefix)).mark();
}
}
if (! covered)
logger.debug("Not covered: Type {} ({})", event.getClass(), event);
}
protected void onExchangeCompletedEvent(AbstractExchangeEvent event, String metricPrefix) {
Period p = new Period(event.getExchange().getProperty(Exchange.CREATED_TIMESTAMP, Date.class).getTime(), System.currentTimeMillis());
metrics.timer(name(event.getClass(), metricPrefix)).update(p.getMillis(), TimeUnit.MILLISECONDS);
}
@Override
public boolean isEnabled(EventObject event) {
return true;
}
@Override
protected void doStart() throws Exception {
setIgnoreCamelContextEvents(true);
setIgnoreExchangeEvents(false);
setIgnoreExchangeCreatedEvent(true);
setIgnoreExchangeRedeliveryEvents(true);
setIgnoreExchangeSendingEvents(true);
setIgnoreExchangeSentEvents(true);
setIgnoreRouteEvents(true);
setIgnoreServiceEvents(true);
}
}
<route>
<from uri="ref:gcsLogger" />
<setExchangePattern pattern="InOnly" />
<setProperty propertyName="CamelMetricSuffix">
<constant>yourcompany-logger</constant>
</setProperty>
<process ref="gcsProcessor" />
</route>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment