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}