Skip to content

Commit

Permalink
Configures Metrics via Spring annotations.
Browse files Browse the repository at this point in the history
  • Loading branch information
Edwin Shin committed Jun 12, 2013
1 parent ed0af97 commit b01b335
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 55 deletions.
8 changes: 8 additions & 0 deletions fcrepo-metrics/pom.xml
Expand Up @@ -31,6 +31,14 @@
<artifactId>metrics-servlets</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
Expand Down
79 changes: 79 additions & 0 deletions fcrepo-metrics/src/main/java/org/fcrepo/metrics/MetricsConfig.java
@@ -0,0 +1,79 @@

package org.fcrepo.metrics;

import java.net.InetSocketAddress;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import com.codahale.metrics.JmxReporter;
import com.codahale.metrics.graphite.Graphite;
import com.codahale.metrics.graphite.GraphiteReporter;

/**
* Configuration class for Metrics reporting to Graphite and JMX.
*
* <p>To enable Metrics reporting to Graphite, activate the Spring profile
* "metrics.graphite". The system properties fcrepo.metrics.host and
* fcrepo.metrics.port can also be set (defaults to "localhost" and 2003,
* respectively.</p>
*
* <p>To enable Metrics reporting to JMX, activate the Spring profile
* "metrics.jmx".</p>
*
* <p>To enable both Graphite and JMX reporting, the Spring profile "metrics",
* can be used instead of specifying both metrics.graphite and metrics.jmx,
* e.g.:</p>
* <blockquote><code>-Dspring.profiles.active="metrics"</code></blockquote>
*
* @author Edwin Shin
*
*/
@Configuration
public class MetricsConfig {

@Bean
public ReporterFactory reporterFactory() {
return new ReporterFactory();
}

@Configuration
@Profile({"metrics", "metrics.graphite"})
public static class GraphiteConfig {

@Bean
public Graphite graphiteClient() {
String hostname =
System.getProperty("fcrepo.metrics.host", "localhost");
int port =
Integer.parseInt(System.getProperty("fcrepo.metrics.port",
"2003"));

return new Graphite(new InetSocketAddress(hostname, port));
}

@Bean
public GraphiteReporter graphiteReporter() {
MetricsConfig cfg = new MetricsConfig();
String prefix =
System.getProperty("fcrepo.metrics.prefix", "org.fcrepo");
return cfg.reporterFactory().getGraphiteReporter(prefix,
graphiteClient());
}
}

@Configuration
@Profile({"metrics", "metrics.jmx"})
public static class JmxConfig {

String prefix = System.getProperty("fcrepo.metrics.prefix",
"org.fcrepo");

@Bean
public JmxReporter jmxReporter() {
MetricsConfig cfg = new MetricsConfig();
return cfg.reporterFactory().getJmxReporter(prefix);
}
}
}
Expand Up @@ -2,69 +2,23 @@
package org.fcrepo.metrics;

import static org.fcrepo.metrics.RegistryService.getMetrics;
import static org.slf4j.LoggerFactory.getLogger;

import java.lang.management.ManagementFactory;
import java.util.concurrent.TimeUnit;

import javax.management.MBeanServer;
import javax.servlet.ServletContextEvent;
import javax.servlet.annotation.WebListener;

import org.slf4j.Logger;

import com.codahale.metrics.JmxReporter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheckRegistry;
import com.codahale.metrics.servlets.AdminServletContextListener;

/**
* A ServletContextListener to set the ServletContext attributes that the
* Metrics servlets expect and initialize JMX reporting if the System property
* <code>fcrepo.metrics.jms</code> is set to "true".
* Metrics servlets expect.
*
* @author Edwin Shin
* @see <a href="http://metrics.codahale.com/manual/servlets/">http://metrics.codahale.com/manual/servlets/</a>
*/
@WebListener
public class MetricsContextListener extends AdminServletContextListener {

private static final Logger LOGGER =
getLogger(AdminServletContextListener.class);

@Override
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);

if (reportMetricsViaJmx()) {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final JmxReporter reporter =
JmxReporter.forRegistry(getMetrics()).registerWith(mbs)
.inDomain("org.fcrepo").convertDurationsTo(
TimeUnit.MILLISECONDS).convertRatesTo(
TimeUnit.SECONDS).filter(MetricFilter.ALL)
.build();
reporter.start();
}
}

/**
*
* @return true iff the System property <code>fcrepo.metrics.jmx</code> is
* true.
*/
public boolean reportMetricsViaJmx() {
String useJmx = System.getProperty("fcrepo.metrics.jmx");
if (useJmx != null && useJmx.equalsIgnoreCase(Boolean.toString(true))) {
LOGGER.info("fcrepo.metrics.jmx == true");
return true;
} else {
LOGGER.info("System property fcrepo.metrics.jmx != true");
return false;
}
}

@Override
protected MetricRegistry getMetricRegistry() {
return getMetrics();
Expand Down
Expand Up @@ -6,11 +6,18 @@

package org.fcrepo.metrics;

import static com.codahale.metrics.graphite.GraphiteReporter.forRegistry;
import static java.util.concurrent.TimeUnit.MINUTES;
import static org.fcrepo.metrics.RegistryService.getMetrics;
import static org.slf4j.LoggerFactory.getLogger;

import com.codahale.metrics.ScheduledReporter;
import java.lang.management.ManagementFactory;
import java.util.concurrent.TimeUnit;

import javax.management.MBeanServer;

import org.slf4j.Logger;

import com.codahale.metrics.JmxReporter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.graphite.Graphite;
import com.codahale.metrics.graphite.GraphiteReporter;

Expand All @@ -21,14 +28,34 @@
*/
public class ReporterFactory {

private static final Logger logger = getLogger(ReporterFactory.class);

/**
* @todo Add Documentation.
*/
public ScheduledReporter registerGraphiteReporter(final Graphite g,
final String prefix) {
final GraphiteReporter r = forRegistry(getMetrics()).build(g);
r.start(1, MINUTES);
return r;
public GraphiteReporter getGraphiteReporter(final String prefix,
final Graphite g) {
final GraphiteReporter reporter =
GraphiteReporter.forRegistry(getMetrics()).prefixedWith(prefix)
.convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(
TimeUnit.MILLISECONDS).filter(MetricFilter.ALL)
.build(g);
reporter.start(1, TimeUnit.MINUTES);
logger.debug("Started GraphiteReporter");
return reporter;
}

public JmxReporter getJmxReporter(final String prefix) {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final JmxReporter reporter =
JmxReporter.forRegistry(getMetrics()).registerWith(mbs)
.inDomain("org.fcrepo").convertDurationsTo(
TimeUnit.MILLISECONDS).convertRatesTo(
TimeUnit.SECONDS).filter(MetricFilter.ALL)
.build();
reporter.start();
logger.debug("Started JmxReporter");
return reporter;
}

/**
Expand Down
3 changes: 3 additions & 0 deletions fcrepo-webapp/src/main/resources/spring/repo.xml
Expand Up @@ -21,5 +21,8 @@
<bean class="org.fcrepo.services.DatastreamService"/>
<bean class="org.fcrepo.services.LowLevelStorageService"/>
<bean class="org.fcrepo.services.NodeService"/>

<!-- For the time being, load annotation config here too -->
<bean class="org.fcrepo.metrics.MetricsConfig"/>

</beans>

0 comments on commit b01b335

Please sign in to comment.