diff --git a/changelog/@unreleased/pr-999.v2.yml b/changelog/@unreleased/pr-999.v2.yml new file mode 100644 index 000000000..55a8dc35e --- /dev/null +++ b/changelog/@unreleased/pr-999.v2.yml @@ -0,0 +1,5 @@ +type: improvement +improvement: + description: Delegate to the jvm-diagnostics library for safepoint time access + links: + - https://github.com/palantir/tritium/pull/999 diff --git a/tritium-metrics-jvm/build.gradle b/tritium-metrics-jvm/build.gradle index a8572d9ab..83bde2f16 100644 --- a/tritium-metrics-jvm/build.gradle +++ b/tritium-metrics-jvm/build.gradle @@ -8,6 +8,7 @@ dependencies { api 'io.dropwizard.metrics:metrics-core' implementation project(':tritium-metrics') + implementation 'com.palantir.jvm.diagnostics:jvm-diagnostics' implementation 'io.dropwizard.metrics:metrics-core' implementation 'io.dropwizard.metrics:metrics-jvm' implementation 'com.google.guava:guava' diff --git a/tritium-metrics-jvm/src/main/java/com/palantir/tritium/metrics/jvm/SafepointMetrics.java b/tritium-metrics-jvm/src/main/java/com/palantir/tritium/metrics/jvm/SafepointMetrics.java index 1d151b379..3008e4034 100644 --- a/tritium-metrics-jvm/src/main/java/com/palantir/tritium/metrics/jvm/SafepointMetrics.java +++ b/tritium-metrics-jvm/src/main/java/com/palantir/tritium/metrics/jvm/SafepointMetrics.java @@ -16,10 +16,10 @@ package com.palantir.tritium.metrics.jvm; -import com.codahale.metrics.Gauge; +import com.palantir.jvm.diagnostics.JvmDiagnostics; +import com.palantir.jvm.diagnostics.SafepointTimeAccessor; import com.palantir.tritium.metrics.registry.TaggedMetricRegistry; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,27 +31,12 @@ final class SafepointMetrics { private static final Logger log = LoggerFactory.getLogger(SafepointMetrics.class); - // The reflection is so that we can use this on non-Hotspot JVMs - @SuppressWarnings("LiteralClassName") static void register(TaggedMetricRegistry registry) { - try { - Class managementFactoryHelper = Class.forName("sun.management.ManagementFactoryHelper"); - Method getHotspotRuntimeMBean = managementFactoryHelper.getMethod("getHotspotRuntimeMBean"); - Object hotspotRuntimeMBean = getHotspotRuntimeMBean.invoke(null); - Method getTotalSafepointTime = hotspotRuntimeMBean.getClass().getMethod("getTotalSafepointTime"); - getTotalSafepointTime.setAccessible(true); - Gauge gauge = () -> (Long) invoke(getTotalSafepointTime, hotspotRuntimeMBean); - InternalJvmMetrics.of(registry).safepointTime(gauge); - } catch (ReflectiveOperationException e) { - log.info("Could not get the total safepoint time, these metrics will not be registered.", e); - } - } - - private static Object invoke(Method method, Object object) { - try { - return method.invoke(object); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new IllegalStateException(e); + Optional safepointTimeAccessor = JvmDiagnostics.totalSafepointTime(); + if (safepointTimeAccessor.isPresent()) { + InternalJvmMetrics.of(registry).safepointTime(safepointTimeAccessor.get()::safepointTimeMilliseconds); + } else { + log.info("Could not get the total safepoint time, these metrics will not be registered."); } } diff --git a/versions.lock b/versions.lock index ddb4fda10..275077b5d 100644 --- a/versions.lock +++ b/versions.lock @@ -16,6 +16,7 @@ com.google.guava:failureaccess:1.0.1 (1 constraints: 140ae1b4) com.google.guava:guava:30.1-jre (6 constraints: be5513ea) com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava (1 constraints: bd17c918) com.google.j2objc:j2objc-annotations:1.3 (1 constraints: b809eda0) +com.palantir.jvm.diagnostics:jvm-diagnostics:0.0.1 (1 constraints: 0305ec35) com.palantir.remoting-api:tracing:1.9.0 (1 constraints: 520d0e26) com.palantir.remoting3:jackson-support:3.46.0 (1 constraints: 850d9c33) com.palantir.remoting3:tracing:3.46.0 (1 constraints: 3f05533b) @@ -30,7 +31,7 @@ org.checkerframework:checker-qual:3.10.0 (3 constraints: 4b1f441d) org.hdrhistogram:HdrHistogram:2.1.12 (1 constraints: 3805313b) org.immutables:value:2.8.8 (1 constraints: 14051536) org.mpierce.metrics.reservoir:hdrhistogram-metrics-reservoir:1.1.2 (1 constraints: 0605f535) -org.slf4j:slf4j-api:1.7.30 (6 constraints: ca470ac6) +org.slf4j:slf4j-api:1.7.30 (7 constraints: f15ab3d6) [Test dependencies] com.squareup.okhttp3:okhttp:4.0.0 (1 constraints: 0605ff35) diff --git a/versions.props b/versions.props index ee92f3123..ba1d674c3 100644 --- a/versions.props +++ b/versions.props @@ -6,6 +6,7 @@ com.google.code.findbugs:jFormatString = 3.0.0 com.google.code.findbugs:jsr305 = 3.0.2 com.google.errorprone:* = 2.5.1 com.google.guava:guava = 30.1-jre +com.palantir.jvm.diagnostics:* = 0.0.1 com.palantir.remoting3:* = 3.46.0 com.palantir.safe-logging:* = 1.14.0 com.palantir.tracing:* = 4.11.0