16
16
17
17
package com .palantir .tritium .metrics .jvm ;
18
18
19
+ import com .codahale .metrics .Gauge ;
20
+ import com .codahale .metrics .RatioGauge ;
19
21
import com .codahale .metrics .jvm .BufferPoolMetricSet ;
20
- import com .codahale .metrics .jvm .MemoryUsageGaugeSet ;
21
22
import com .codahale .metrics .jvm .ThreadDeadlockDetector ;
22
23
import com .google .common .base .Suppliers ;
23
- import com .google .common .collect .Maps ;
24
24
import com .palantir .logsafe .Preconditions ;
25
+ import com .palantir .logsafe .logger .SafeLogger ;
26
+ import com .palantir .logsafe .logger .SafeLoggerFactory ;
25
27
import com .palantir .tritium .metrics .MetricRegistries ;
26
28
import com .palantir .tritium .metrics .registry .TaggedMetricRegistry ;
27
29
import java .lang .management .ClassLoadingMXBean ;
28
30
import java .lang .management .ManagementFactory ;
31
+ import java .lang .management .MemoryMXBean ;
32
+ import java .lang .management .MemoryUsage ;
29
33
import java .lang .management .RuntimeMXBean ;
30
34
import java .lang .management .ThreadInfo ;
31
35
import java .lang .management .ThreadMXBean ;
37
41
38
42
/** {@link JvmMetrics} provides a standard set of metrics for debugging java services. */
39
43
public final class JvmMetrics {
44
+ private static final SafeLogger log = SafeLoggerFactory .get (JvmMetrics .class );
40
45
41
46
/**
42
47
* Registers a default set of metrics.
@@ -58,12 +63,7 @@ public static void register(TaggedMetricRegistry registry) {
58
63
MetricRegistries .registerAll (
59
64
registry , "jvm.buffers" , new BufferPoolMetricSet (ManagementFactory .getPlatformMBeanServer ()));
60
65
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 );
67
67
registerThreads (metrics );
68
68
}
69
69
@@ -126,6 +126,54 @@ private static Map<Thread.State, Integer> threadsByState(ThreadMXBean threads) {
126
126
return threadsByState ;
127
127
}
128
128
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
+
129
177
private JvmMetrics () {
130
178
throw new UnsupportedOperationException ();
131
179
}
0 commit comments