All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.librato.metrics.LibratoUtil Maven / Gradle / Ivy

package com.librato.metrics;

import com.librato.metrics.LibratoBatch;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.VirtualMachineMetrics;

import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;

/**
 * User: mihasya
 * Date: 6/14/12
 * Time: 2:05 PM
 * keeping general Librato utilities out of the way
 */
public class LibratoUtil {
    /**
     * turn a MetricName into a Librato-able string key
     */
    public String nameToString(MetricName name) {
        StringBuilder builder = new StringBuilder();
        builder
                .append(name.getGroup()).append(".")
                .append(name.getType()).append(".")
                .append(name.getName());

        if (name.hasScope()) {
            builder.append(".").append(name.getScope());
        }

        return builder.toString();
    }

    /**
     * helper method for adding VM metrics to a batch
     */
    public void addVmMetricsToBatch(VirtualMachineMetrics vm, LibratoBatch batch) {
        // memory
        batch.addGaugeMeasurement("jvm.memory.heap_usage", vm.heapUsage());
        batch.addGaugeMeasurement("jvm.memory.non_heap_usage", vm.nonHeapUsage());
        for (Map.Entry pool : vm.memoryPoolUsage().entrySet()) {
            batch.addGaugeMeasurement("jvm.memory.memory_pool_usages."+pool.getKey(), pool.getValue());
        }

        // threads
        batch.addGaugeMeasurement("jvm.daemon_thread_count", vm.daemonThreadCount());
        batch.addGaugeMeasurement("jvm.thread_count", vm.threadCount());
        batch.addGaugeMeasurement("jvm.uptime", vm.uptime());
        batch.addGaugeMeasurement("jvm.fd_usage", vm.fileDescriptorUsage());

        for (Map.Entry entry : vm.threadStatePercentages().entrySet()) {
            batch.addGaugeMeasurement("jvm.thread-states." + entry.getKey().toString().toLowerCase(), entry.getValue());
        }

        // garbage collection
        for (Map.Entry entry : vm.garbageCollectors().entrySet()) {
            final String name = "jvm.gc." + entry.getKey();
            batch.addCounterMeasurement(name +".time", entry.getValue().getTime(TimeUnit.MILLISECONDS));
            batch.addCounterMeasurement(name +".runs", entry.getValue().getRuns());
        }
    }

    public static interface Sanitizer {
        public String apply(String name);
    }

    private static final Pattern disallowed = Pattern.compile("([^A-Za-z0-9.:-_]|[\\[\\]])");
    private static final int LENGTH_LIMIT = 256;

    /**
     * Metric names restrictions are described here.
     */
    public static final Sanitizer lastPassSanitizer = new Sanitizer() {
        // not sure I understand why brackets need to be specified separately, but behavior is the same in python
        @Override
        public String apply(String name) {
            name = disallowed.matcher(name).replaceAll("");
            if (name.length() > LENGTH_LIMIT) {
                name = name.substring(name.length() - LENGTH_LIMIT, name.length());
            }
            return name;
        }
    };

    /**
     * a stub to be used when the user doesn't specify a sanitizer
     */
    public static final Sanitizer noopSanitizer = new Sanitizer() {
        @Override
        public String apply(String name) {
            return name;
        }
    };
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy