Search code examples
javamavenguicedropwizardcodahale-metrics

What metrics-core does Dropwizard uses by default?


I've been trying to figure out MetricRegistry details for one of my project based out on dropwizard:1.1.0

enter image description here

A minor confusion here is that I see the version used for localhost:8181/metrics (adminConnector) by my service is 3.1.3 which is not the latest and the one included in dropwizard-core (Note : +- io.dropwizard.metrics:metrics-core:jar:3.2.2 in the dependency:tree below)

Relative POM dependencies used are :

<dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-core</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>io.federecio</groupId>
    <artifactId>dropwizard-swagger</artifactId>
    <version>0.7.0</version>
</dependency>

mvn dependency:tree for the projects is as follows :

 +- io.dropwizard:dropwizard-core:jar:1.1.0:compile
[INFO] |  +- io.dropwizard:dropwizard-util:jar:1.1.0:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] |  |  +- com.google.code.findbugs:jsr305:jar:3.0.1:compile
[INFO] |  |  \- joda-time:joda-time:jar:2.9.7:compile
[INFO] |  +- io.dropwizard:dropwizard-jackson:jar:1.1.0:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-core:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.module:jackson-module-afterburner:jar:2.8.7:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-joda:jar:2.8.7:compile
[INFO] |  |  +- org.slf4j:slf4j-api:jar:1.7.24:compile
[INFO] |  |  \- ch.qos.logback:logback-classic:jar:1.2.1:compile
[INFO] |  +- io.dropwizard:dropwizard-validation:jar:1.1.0:compile
[INFO] |  |  +- org.hibernate:hibernate-validator:jar:5.3.4.Final:compile
[INFO] |  |  |  +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
[INFO] |  |  |  \- com.fasterxml:classmate:jar:1.3.1:compile
[INFO] |  |  \- org.glassfish:javax.el:jar:3.0.0:compile
[INFO] |  +- io.dropwizard:dropwizard-configuration:jar:1.1.0:compile
[INFO] |  |  \- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.8.7:compile
[INFO] |  |     \- org.yaml:snakeyaml:jar:1.17:compile
[INFO] |  +- io.dropwizard:dropwizard-logging:jar:1.1.0:compile
[INFO] |  |  +- io.dropwizard.metrics:metrics-logback:jar:3.2.2:compile
[INFO] |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.24:compile
[INFO] |  |  +- ch.qos.logback:logback-core:jar:1.2.1:compile
[INFO] |  |  +- org.slf4j:log4j-over-slf4j:jar:1.7.24:compile
[INFO] |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.24:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-util:jar:9.4.2.v20170220:compile
[INFO] |  +- io.dropwizard:dropwizard-metrics:jar:1.1.0:compile
[INFO] |  +- io.dropwizard:dropwizard-jersey:jar:1.1.0:compile
[INFO] |  |  +- org.glassfish.jersey.core:jersey-server:jar:2.25.1:compile
[INFO] |  |  |  +- org.glassfish.jersey.core:jersey-common:jar:2.25.1:compile
[INFO] |  |  |  |  +- org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1:compile
[INFO] |  |  |  |  \- org.glassfish.hk2:osgi-resource-locator:jar:1.0.1:compile
[INFO] |  |  |  +- org.glassfish.jersey.core:jersey-client:jar:2.25.1:compile
[INFO] |  |  |  +- org.glassfish.jersey.media:jersey-media-jaxb:jar:2.25.1:compile
[INFO] |  |  |  +- javax.annotation:javax.annotation-api:jar:1.2:compile
[INFO] |  |  |  +- org.glassfish.hk2:hk2-api:jar:2.5.0-b32:compile
[INFO] |  |  |  |  +- org.glassfish.hk2:hk2-utils:jar:2.5.0-b32:compile
[INFO] |  |  |  |  \- org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b32:compile
[INFO] |  |  |  +- org.glassfish.hk2.external:javax.inject:jar:2.5.0-b32:compile
[INFO] |  |  |  \- org.glassfish.hk2:hk2-locator:jar:2.5.0-b32:compile
[INFO] |  |  |     \- org.javassist:javassist:jar:3.20.0-GA:compile
[INFO] |  |  +- org.glassfish.jersey.ext:jersey-metainf-services:jar:2.25.1:compile
[INFO] |  |  +- org.glassfish.jersey.ext:jersey-bean-validation:jar:2.25.1:compile
[INFO] |  |  |  +- javax.el:javax.el-api:jar:2.2.4:compile
[INFO] |  |  |  \- org.glassfish.web:javax.el:jar:2.2.4:compile
[INFO] |  |  +- io.dropwizard.metrics:metrics-jersey2:jar:3.2.2:compile
[INFO] |  |  +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.8.7:compile
[INFO] |  |  |  +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.8.7:compile
[INFO] |  |  |  \- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.8.7:compile
[INFO] |  |  +- org.glassfish.jersey.containers:jersey-container-servlet:jar:2.25.1:compile
[INFO] |  |  |  \- org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.25.1:compile
[INFO] |  |  +- org.eclipse.jetty:jetty-server:jar:9.4.2.v20170220:compile
[INFO] |  |  |  +- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] |  |  |  \- org.eclipse.jetty:jetty-io:jar:9.4.2.v20170220:compile
[INFO] |  |  +- org.eclipse.jetty:jetty-webapp:jar:9.4.2.v20170220:compile
[INFO] |  |  |  \- org.eclipse.jetty:jetty-xml:jar:9.4.2.v20170220:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-continuation:jar:9.4.2.v20170220:compile
[INFO] |  +- io.dropwizard:dropwizard-servlets:jar:1.1.0:compile
[INFO] |  |  \- io.dropwizard.metrics:metrics-annotation:jar:3.2.2:compile
[INFO] |  +- io.dropwizard:dropwizard-jetty:jar:1.1.0:compile
[INFO] |  |  +- io.dropwizard.metrics:metrics-jetty9:jar:3.2.2:compile
[INFO] |  |  +- org.eclipse.jetty:jetty-servlet:jar:9.4.2.v20170220:compile
[INFO] |  |  |  \- org.eclipse.jetty:jetty-security:jar:9.4.2.v20170220:compile
[INFO] |  |  +- org.eclipse.jetty:jetty-servlets:jar:9.4.2.v20170220:compile
[INFO] |  |  \- org.eclipse.jetty:jetty-http:jar:9.4.2.v20170220:compile
[INFO] |  +- io.dropwizard:dropwizard-lifecycle:jar:1.1.0:compile
[INFO] |  +- io.dropwizard.metrics:metrics-core:jar:3.2.2:compile
[INFO] |  +- io.dropwizard.metrics:metrics-jvm:jar:3.2.2:compile
[INFO] |  +- io.dropwizard.metrics:metrics-servlets:jar:3.2.2:compile
[INFO] |  |  +- io.dropwizard.metrics:metrics-json:jar:3.2.2:compile
[INFO] |  |  \- com.papertrail:profiler:jar:1.0.2:compile
[INFO] |  +- io.dropwizard.metrics:metrics-healthchecks:jar:3.2.2:compile
[INFO] |  +- io.dropwizard:dropwizard-request-logging:jar:1.1.0:compile
[INFO] |  |  \- ch.qos.logback:logback-access:jar:1.2.1:compile
[INFO] |  +- net.sourceforge.argparse4j:argparse4j:jar:0.7.0:compile
[INFO] |  \- org.eclipse.jetty.toolchain.setuid:jetty-setuid-java:jar:1.0.3:compile
[INFO] +- io.federecio:dropwizard-swagger:jar:0.7.0:compile
[INFO] |  +- io.dropwizard:dropwizard-assets:jar:0.8.0:compile
[INFO] |  +- io.dropwizard:dropwizard-views:jar:0.8.0:compile
[INFO] |  +- io.dropwizard:dropwizard-views-freemarker:jar:0.8.0:compile
[INFO] |  |  \- org.freemarker:freemarker:jar:2.3.21:compile
[INFO] |  +- com.wordnik:swagger-jersey2-jaxrs:jar:1.5.1-M2:compile
[INFO] |  |  \- com.wordnik:swagger-jaxrs:jar:1.5.1-M2:compile
[INFO] |  |     +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.4.2:compile
[INFO] |  |     |  \- org.codehaus.woodstox:stax2-api:jar:3.1.4:compile
[INFO] |  |     +- com.wordnik:swagger-core:jar:1.5.1-M2:compile
[INFO] |  |     |  \- com.wordnik:swagger-models:jar:1.5.1-M2:compile
[INFO] |  |     |     \- com.wordnik:swagger-annotations:jar:1.5.1-M2:compile
[INFO] |  |     \- org.reflections:reflections:jar:0.9.9:compile
[INFO] |  |        \- com.google.code.findbugs:annotations:jar:2.0.1:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- com.google.inject:guice:jar:4.1.0:compile
[INFO] |  +- javax.inject:javax.inject:jar:1:compile
[INFO] |  +- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  \- com.google.guava:guava:jar:19.0:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.3:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.4.6:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  \- commons-codec:commons-codec:jar:1.9:compile
[INFO] +- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile
[INFO] \- org.junit.jupiter:junit-jupiter-api:jar:5.0.0-M4:test
[INFO]    +- org.opentest4j:opentest4j:jar:1.0.0-M2:test
[INFO]    \- org.junit.platform:junit-platform-commons:jar:1.0.0-M4:test

Just wanted to know, how does Dropwizard configure the MetricRegistry?


Futher Details (if required) :-

I am using guice injection to bind the MetricRegistry in a module extending AbstractModule as

bind(MetricRegistry.class).toInstance(environment.metrics());

and in a service class calling this injector as

public static void main(String[] args) throws Exception {
    new Service().run(args);
}

@Override
public void run(ServiceConfig config, Environment environment) throws Exception {
    Injector injector = Guice.createInjector(new ExtendingModule(config, environment));
    .... // not altering metrics here
}

Solution

  • DW simply creates a metric registry, no magic or nothing involved. See the Bootstrap class for that:

    public Bootstrap(Application<T> application) {
        this.application = application;
        this.objectMapper = Jackson.newObjectMapper();
        this.bundles = new ArrayList<>();
        this.configuredBundles = new ArrayList<>();
        this.commands = new ArrayList<>();
        this.validatorFactory = Validators.newValidatorFactory();
        this.metricRegistry = new MetricRegistry();
        this.configurationSourceProvider = new FileConfigurationSourceProvider();
        this.classLoader = Thread.currentThread().getContextClassLoader();
        this.configurationFactoryFactory = new DefaultConfigurationFactoryFactory<>();
        this.healthCheckRegistry = new HealthCheckRegistry();
    }
    

    in particular:

    this.metricRegistry = new MetricRegistry();
    

    That is pretty much it.

    Forgot, they also register some standard modules:

    /**
         * Registers the JVM metrics to the metric registry and start to report
         * the registry metrics via JMX.
         */
        public void registerMetrics() {
            if (metricsAreRegistered) {
                return;
            }
            getMetricRegistry().register("jvm.attribute", new JvmAttributeGaugeSet());
            getMetricRegistry().register("jvm.buffers", new BufferPoolMetricSet(ManagementFactory
                                                                                   .getPlatformMBeanServer()));
            getMetricRegistry().register("jvm.classloader", new ClassLoadingGaugeSet());
            getMetricRegistry().register("jvm.filedescriptor", new FileDescriptorRatioGauge());
            getMetricRegistry().register("jvm.gc", new GarbageCollectorMetricSet());
            getMetricRegistry().register("jvm.memory", new MemoryUsageGaugeSet());
            getMetricRegistry().register("jvm.threads", new ThreadStatesGaugeSet());
    
            JmxReporter.forRegistry(metricRegistry).build().start();
            metricsAreRegistered = true;
        }
    

    The version is not tied to the Metric library version you are using, but to the MetricsModule registered with the ObjectMapper for serialisation. In my case, the class looks like that:

    public class MetricsModule extends Module {
        static final Version VERSION = new Version(3, 0, 0, "", "com.codahale.metrics", "metrics-json");
    

    in the serialiser, the first line then does:

    @Override
            public void serialize(MetricRegistry registry,
                                  JsonGenerator json,
                                  SerializerProvider provider) throws IOException {
                json.writeStartObject();
                json.writeStringField("version", VERSION.toString());
    

    This is where your version is from.

    Admittedly, this is not very intuitive. I reckon that this is more of an internal versioning and it gets updated whenever the code in that particular serialising module is changing - but you'd have to ask the DW guys for the details on that. My Metrics are 3.1.2 or something similar and it prints 3.0.0 for me.

    -- Artur