Skip to content

Commit f3527e1

Browse files
author
Carter Kozak
authored
Port memory metrics to metric-schema for docs and validation (#1391)
Port memory metrics (`jvm.memory`) to metric-schema for better documentation and validation
1 parent b905e61 commit f3527e1

File tree

3 files changed

+107
-8
lines changed

3 files changed

+107
-8
lines changed

changelog/@unreleased/pr-1391.v2.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type: improvement
2+
improvement:
3+
description: Port memory metrics (`jvm.memory`) to metric-schema for better documentation
4+
and validation
5+
links:
6+
- https://github.com/palantir/tritium/pull/1391

tritium-metrics-jvm/src/main/java/com/palantir/tritium/metrics/jvm/JvmMetrics.java

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,20 @@
1616

1717
package com.palantir.tritium.metrics.jvm;
1818

19+
import com.codahale.metrics.Gauge;
20+
import com.codahale.metrics.RatioGauge;
1921
import com.codahale.metrics.jvm.BufferPoolMetricSet;
20-
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
2122
import com.codahale.metrics.jvm.ThreadDeadlockDetector;
2223
import com.google.common.base.Suppliers;
23-
import com.google.common.collect.Maps;
2424
import com.palantir.logsafe.Preconditions;
25+
import com.palantir.logsafe.logger.SafeLogger;
26+
import com.palantir.logsafe.logger.SafeLoggerFactory;
2527
import com.palantir.tritium.metrics.MetricRegistries;
2628
import com.palantir.tritium.metrics.registry.TaggedMetricRegistry;
2729
import java.lang.management.ClassLoadingMXBean;
2830
import java.lang.management.ManagementFactory;
31+
import java.lang.management.MemoryMXBean;
32+
import java.lang.management.MemoryUsage;
2933
import java.lang.management.RuntimeMXBean;
3034
import java.lang.management.ThreadInfo;
3135
import java.lang.management.ThreadMXBean;
@@ -37,6 +41,7 @@
3741

3842
/** {@link JvmMetrics} provides a standard set of metrics for debugging java services. */
3943
public final class JvmMetrics {
44+
private static final SafeLogger log = SafeLoggerFactory.get(JvmMetrics.class);
4045

4146
/**
4247
* Registers a default set of metrics.
@@ -58,12 +63,7 @@ public static void register(TaggedMetricRegistry registry) {
5863
MetricRegistries.registerAll(
5964
registry, "jvm.buffers", new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer()));
6065
registerClassLoading(metrics);
61-
MetricRegistries.registerAll(
62-
registry,
63-
"jvm.memory",
64-
() -> Maps.filterKeys(
65-
// Memory pool metrics are already provided by MetricRegistries.registerMemoryPools
66-
new MemoryUsageGaugeSet().getMetrics(), name -> !name.startsWith("pools")));
66+
registerJvmMemory(registry);
6767
registerThreads(metrics);
6868
}
6969

@@ -126,6 +126,54 @@ private static Map<Thread.State, Integer> threadsByState(ThreadMXBean threads) {
126126
return threadsByState;
127127
}
128128

129+
private static void registerJvmMemory(TaggedMetricRegistry registry) {
130+
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
131+
if (memoryBean == null) {
132+
log.warn("Failed to load the MemoryMXBean, jvm.memory metrics will not be recorded");
133+
return;
134+
}
135+
JvmMemoryMetrics metrics = JvmMemoryMetrics.of(registry);
136+
// jvm.memory.total
137+
metrics.totalInit((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getInit()
138+
+ memoryBean.getNonHeapMemoryUsage().getInit());
139+
metrics.totalUsed((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getUsed()
140+
+ memoryBean.getNonHeapMemoryUsage().getUsed());
141+
metrics.totalMax((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getMax()
142+
+ memoryBean.getNonHeapMemoryUsage().getMax());
143+
metrics.totalCommitted(
144+
(Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getCommitted()
145+
+ memoryBean.getNonHeapMemoryUsage().getCommitted());
146+
// jvm.memory.heap
147+
metrics.heapInit((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getInit());
148+
metrics.heapUsed((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getUsed());
149+
metrics.heapMax((Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getMax());
150+
metrics.heapCommitted(
151+
(Gauge<Long>) () -> memoryBean.getHeapMemoryUsage().getCommitted());
152+
metrics.heapUsage(new RatioGauge() {
153+
@Override
154+
protected Ratio getRatio() {
155+
MemoryUsage heapMemoryUsage = memoryBean.getHeapMemoryUsage();
156+
return Ratio.of(heapMemoryUsage.getUsed(), heapMemoryUsage.getMax());
157+
}
158+
});
159+
// jvm.memory.non-heap
160+
metrics.nonHeapInit(
161+
(Gauge<Long>) () -> memoryBean.getNonHeapMemoryUsage().getInit());
162+
metrics.nonHeapUsed(
163+
(Gauge<Long>) () -> memoryBean.getNonHeapMemoryUsage().getUsed());
164+
metrics.nonHeapMax(
165+
(Gauge<Long>) () -> memoryBean.getNonHeapMemoryUsage().getMax());
166+
metrics.nonHeapCommitted(
167+
(Gauge<Long>) () -> memoryBean.getNonHeapMemoryUsage().getCommitted());
168+
metrics.nonHeapUsage(new RatioGauge() {
169+
@Override
170+
protected Ratio getRatio() {
171+
MemoryUsage nonHeapMemoryUsage = memoryBean.getNonHeapMemoryUsage();
172+
return Ratio.of(nonHeapMemoryUsage.getUsed(), nonHeapMemoryUsage.getMax());
173+
}
174+
});
175+
}
176+
129177
private JvmMetrics() {
130178
throw new UnsupportedOperationException();
131179
}

tritium-metrics-jvm/src/main/metrics/metrics.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,48 @@ namespaces:
7777
threads.terminated.count:
7878
type: gauge
7979
docs: Number of live threads in the `TERMINATED` state.
80+
jvm.memory:
81+
docs: Java virtual machine memory usage metrics.
82+
metrics:
83+
total.init:
84+
type: gauge
85+
docs: Initial amount of memory requested by the JVM.
86+
total.used:
87+
type: gauge
88+
docs: Total non-native memory used by the JVM.
89+
total.max:
90+
type: gauge
91+
docs: Maximum amount of memory that may be used by the JVM before allocations fail.
92+
total.committed:
93+
type: gauge
94+
docs: Amount of committed memory in bytes for the JVM to use.
95+
heap.init:
96+
type: gauge
97+
docs: Initial amount of heap memory requested by the JVM.
98+
heap.used:
99+
type: gauge
100+
docs: Heap memory used by the JVM.
101+
heap.max:
102+
type: gauge
103+
docs: Maximum amount of heap that may be used by the JVM before allocations fail.
104+
heap.committed:
105+
type: gauge
106+
docs: Amount of committed memory in bytes for the JVM heap.
107+
heap.usage:
108+
type: gauge
109+
docs: Ratio of `jvm.memory.heap.used` to `jvm.memory.heap.max`.
110+
non-heap.init:
111+
type: gauge
112+
docs: Initial amount of non-heap memory requested by the JVM.
113+
non-heap.used:
114+
type: gauge
115+
docs: Non-heap memory used by the JVM.
116+
non-heap.max:
117+
type: gauge
118+
docs: Maximum amount of non-heap that may be used by the JVM before direct allocations fail.
119+
non-heap.committed:
120+
type: gauge
121+
docs: Amount of committed memory in bytes for the JVM non-heap (e.g. direct memory).
122+
non-heap.usage:
123+
type: gauge
124+
docs: Ratio of `jvm.memory.non-heap.used` to `jvm.memory.non-heap.max`.

0 commit comments

Comments
 (0)