io.helixservice.feature.metrics.MetricsFeature.java Source code

Java tutorial

Introduction

Here is the source code for io.helixservice.feature.metrics.MetricsFeature.java

Source

/*
 * @author Les Novell
 *
 *   All rights reserved. This program and the accompanying materials
 *   are made available under the terms of the Eclipse Public License v1.0
 *   and Apache License v2.0 which accompanies this distribution.
 *
 *      The Apache License v2.0 is available at
 *      http://www.opensource.org/licenses/apache2.0.php
 *
 */

package io.helixservice.feature.metrics;

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
import io.helixservice.core.feature.AbstractFeature;
import io.helixservice.core.container.Container;
import io.helixservice.feature.restservice.controller.component.Controller;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.Message;

import java.util.concurrent.TimeUnit;

/**
 * Provides Metrics Collection based on codahale metrics library.
 * <p>
 * Registers Thread, GC, and Memory usage metrics by default.
 * In addition, accepts metrics reported via the Vert.x event bus.
 * <h2>Vert.x Event Bus Consumers (Local Consumer only):</h2>
 * <pre>
 * Address: "metrics.histogram"  Body: "metricKey=metricValue"
 * Address: "metrics.timer"      Body: "metricKey=metricValueInMillis"
 * Address: "metrics.counter"    Body: "metricKey=metricValue"
 * </pre>
 * <h2>Metrics Publishing</h2>
 * Metric publishing can be configured by getting the MetricRegistry
 * and adding the desired publisher.  Currently, the only publishing
 * mechanism is through a HTTP request "GET /metrics".
 */
public class MetricsFeature extends AbstractFeature {
    private static final String SEPARATOR_REGEX = "=";
    private MetricRegistry metricRegistry;

    public MetricsFeature() {
        metricRegistry = new MetricRegistry();
        metricRegistry.registerAll(new ThreadStatesGaugeSet());
        metricRegistry.registerAll(new GarbageCollectorMetricSet());
        metricRegistry.registerAll(new MemoryUsageGaugeSet());

        MetricsController metricsController = new MetricsController(metricRegistry);
        register(Controller.fromAnnotationsOn(metricsController));
    }

    public MetricRegistry metricRegistry() {
        return metricRegistry;
    }

    @Override
    public void start(Container container) {
        addEventBusConsumers(container.getVertx().get());
    }

    private void addEventBusConsumers(Vertx vertx) {
        EventBus eventBus = vertx.eventBus();

        eventBus.localConsumer("metrics.histogram").handler(histogram -> {
            String[] bodySplit = splitRequest(histogram);
            metricRegistry.histogram(bodySplit[0]).update(Long.valueOf(bodySplit[1]));
        });

        eventBus.localConsumer("metrics.timer").handler(timer -> {
            String[] bodySplit = splitRequest(timer);
            metricRegistry.timer(bodySplit[0]).update(Long.valueOf(bodySplit[1]), TimeUnit.MILLISECONDS);
        });

        eventBus.localConsumer("metrics.counter").handler(timer -> {
            String[] bodySplit = splitRequest(timer);
            metricRegistry.counter(bodySplit[0]).inc(Long.valueOf(bodySplit[1]));
        });
    }

    private String[] splitRequest(Message<Object> histogram) {
        String body = (String) histogram.body();
        return body.split(SEPARATOR_REGEX);
    }
}