com.netflix.servo.examples.JvmMetricExample.java Source code

Java tutorial

Introduction

Here is the source code for com.netflix.servo.examples.JvmMetricExample.java

Source

/**
 * Copyright 2013 Netflix, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.netflix.servo.examples;

import com.google.common.collect.Maps;

import com.netflix.servo.publish.BasicMetricFilter;
import com.netflix.servo.publish.CounterToRateMetricTransform;
import com.netflix.servo.publish.FileMetricObserver;
import com.netflix.servo.publish.JmxMetricPoller;
import com.netflix.servo.publish.LocalJmxConnector;
import com.netflix.servo.publish.MetricFilter;
import com.netflix.servo.publish.MetricObserver;
import com.netflix.servo.publish.MetricPoller;
import com.netflix.servo.publish.PollRunnable;
import com.netflix.servo.publish.PollScheduler;
import com.netflix.servo.publish.PrefixMetricFilter;
import com.netflix.servo.publish.RegexMetricFilter;

import javax.management.ObjectName;
import java.io.File;
import java.util.NavigableMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;

/**
 * Example of collecting arbitrary JMX metrics, in this case the standard
 * metrics exposed under java.lang by the JVM.
 */
public final class JvmMetricExample {

    private JvmMetricExample() {
    }

    public static void main(String[] args) throws Exception {
        // Filter used to identify metrics that are counters
        NavigableMap<String, MetricFilter> counters = Maps.newTreeMap();

        // ClassLoadingMXBean
        counters.put("LoadedClassCount", BasicMetricFilter.MATCH_ALL);
        counters.put("TotalLoadedClassCount", BasicMetricFilter.MATCH_ALL);
        counters.put("UnloadedClassCount", BasicMetricFilter.MATCH_ALL);

        // CompilationMXBean
        counters.put("TotalCompilationTime", BasicMetricFilter.MATCH_ALL);

        // GarbageCollectorMXBean
        counters.put("CollectionCount", BasicMetricFilter.MATCH_ALL);
        counters.put("CollectionTime", BasicMetricFilter.MATCH_ALL);

        // MemoryPoolMXBean
        counters.put("CollectionUsageThresholdCount", BasicMetricFilter.MATCH_ALL);
        counters.put("UsageThresholdCount", BasicMetricFilter.MATCH_ALL);

        // RuntimeMXBean
        counters.put("Uptime", BasicMetricFilter.MATCH_ALL);

        // ThreadMXBean
        counters.put("TotalStartedThreadCount", BasicMetricFilter.MATCH_ALL);

        // Create prefix filter on the metric name, default to match none if
        // no match is found so that by default metrics will be GAUGEs
        MetricFilter counterFilter = new PrefixMetricFilter(null, // Tag key, null means use metric name
                BasicMetricFilter.MATCH_NONE, // Root filter if no better match
                counters); // Specific filters

        // Create a new poller for the local JMX server that queries all
        // metrics from the java.lang domain
        MetricPoller poller = new JmxMetricPoller(new LocalJmxConnector(), new ObjectName("java.lang:type=*,*"),
                counterFilter);

        // Filter to restrict the set of metrics returned, in this case ignore
        // many of the flags indicating whether or not certain features are
        // suported or enabled
        MetricFilter filter = new RegexMetricFilter(null, // Tag key, null means use metric name
                Pattern.compile(".*Supported$|.*Enabled$|^Valid$|^Verbose$"), false, // Match if the tag is missing
                true); // Invert the pattern match

        // Create a new observer that records observations to files in the
        // current working directory
        MetricObserver observer = new FileMetricObserver("jvmstats", new File("."));

        // Sampling interval
        final long samplingInterval = 10;
        TimeUnit samplingUnit = TimeUnit.SECONDS;

        // Transform used to convert counter metrics into a rate per second
        MetricObserver transform = new CounterToRateMetricTransform(observer, 2 * samplingInterval, samplingUnit);

        // Schedule metrics to be collected in the background every 10 seconds
        PollRunnable task = new PollRunnable(poller, filter, transform);
        PollScheduler scheduler = PollScheduler.getInstance();
        scheduler.start();
        scheduler.addPoller(task, samplingInterval, samplingUnit);

        // Do main work of program
        while (true) {
            System.out.println("Doing work...");
            Thread.sleep(samplingUnit.toMillis(samplingInterval));
        }
    }
}