001package io.prometheus.metrics.instrumentation.jvm;
002
003import io.prometheus.metrics.config.PrometheusProperties;
004import io.prometheus.metrics.model.registry.PrometheusRegistry;
005
006import java.util.concurrent.atomic.AtomicBoolean;
007
008/**
009 * Registers all JVM metrics. Example usage:
010 * <pre>{@code
011 *   JvmMetrics.builder().register();
012 * }</pre>
013 */
014public class JvmMetrics {
015
016    private static AtomicBoolean registeredWithTheDefaultRegistry = new AtomicBoolean(false);
017
018    public static Builder builder() {
019        return new Builder(PrometheusProperties.get());
020    }
021
022    // Note: Currently there is no configuration for JVM metrics, so it doesn't matter whether you pass a config or not.
023    // However, we will add config options in the future, like whether you want to use Prometheus naming conventions
024    //'or OpenTelemetry semantic conventions for JVM metrics.
025    public static Builder builder(PrometheusProperties config) {
026        return new Builder(config);
027    }
028
029    public static class Builder {
030
031        private final PrometheusProperties config;
032
033        private Builder(PrometheusProperties config) {
034            this.config = config;
035        }
036
037        /**
038         * Register all JVM metrics with the default registry.
039         * <p>
040         * It's safe to call this multiple times:
041         * Only the first call will register the metrics, all subsequent calls will be ignored.
042         */
043        public void register() {
044            if (!registeredWithTheDefaultRegistry.getAndSet(true)) {
045                register(PrometheusRegistry.defaultRegistry);
046            }
047        }
048
049        /**
050         * Register all JVM metrics with the {@code registry}.
051         * <p>
052         * You must make sure to call this only once per {@code registry}, otherwise it will
053         * throw an Exception because you are trying to register duplicate metrics.
054         */
055        public void register(PrometheusRegistry registry) {
056            JvmThreadsMetrics.builder(config).register(registry);
057            JvmBufferPoolMetrics.builder(config).register(registry);
058            JvmClassLoadingMetrics.builder(config).register(registry);
059            JvmCompilationMetrics.builder(config).register(registry);
060            JvmGarbageCollectorMetrics.builder(config).register(registry);
061            JvmMemoryPoolAllocationMetrics.builder(config).register(registry);
062            JvmMemoryMetrics.builder(config).register(registry);
063            JvmNativeMemoryMetrics.builder(config).register(registry);
064            JvmRuntimeInfoMetric.builder(config).register(registry);
065            ProcessMetrics.builder(config).register(registry);
066        }
067    }
068}