Merge "Add metrics for monitoring Java memory pools" into stable-3.4
This commit is contained in:
@@ -50,6 +50,9 @@ etc.
|
|||||||
objects needing finalization.
|
objects needing finalization.
|
||||||
* `proc/jvm/gc/count`: Number of GCs.
|
* `proc/jvm/gc/count`: Number of GCs.
|
||||||
* `proc/jvm/gc/time`: Approximate accumulated GC elapsed time.
|
* `proc/jvm/gc/time`: Approximate accumulated GC elapsed time.
|
||||||
|
* `proc/jvm/memory/pool/committed/<pool name>`: Committed amount of memory for pool.
|
||||||
|
* `proc/jvm/memory/pool/max/<pool name>`: Maximum amount of memory for pool.
|
||||||
|
* `proc/jvm/memory/pool/used/<pool name>`: Used amount of memory for pool.
|
||||||
* `proc/jvm/thread/num_live`: Current live thread count.
|
* `proc/jvm/thread/num_live`: Current live thread count.
|
||||||
* `proc/jvm/thread/num_daemon_live`: Current live daemon threads count.
|
* `proc/jvm/thread/num_daemon_live`: Current live daemon threads count.
|
||||||
* `proc/jvm/thread/num_peak_live`: Peak live thread count since the Java virtual machine started or peak was reset.
|
* `proc/jvm/thread/num_peak_live`: Peak live thread count since the Java virtual machine started or peak was reset.
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.google.gerrit.server.logging.Metadata;
|
|||||||
import java.lang.management.GarbageCollectorMXBean;
|
import java.lang.management.GarbageCollectorMXBean;
|
||||||
import java.lang.management.ManagementFactory;
|
import java.lang.management.ManagementFactory;
|
||||||
import java.lang.management.MemoryMXBean;
|
import java.lang.management.MemoryMXBean;
|
||||||
|
import java.lang.management.MemoryPoolMXBean;
|
||||||
import java.lang.management.MemoryUsage;
|
import java.lang.management.MemoryUsage;
|
||||||
import java.lang.management.OperatingSystemMXBean;
|
import java.lang.management.OperatingSystemMXBean;
|
||||||
import java.lang.management.ThreadMXBean;
|
import java.lang.management.ThreadMXBean;
|
||||||
@@ -41,6 +42,7 @@ public class ProcMetricModule extends MetricModule {
|
|||||||
procCpuLoad(metrics);
|
procCpuLoad(metrics);
|
||||||
procJvmGc(metrics);
|
procJvmGc(metrics);
|
||||||
procJvmMemory(metrics);
|
procJvmMemory(metrics);
|
||||||
|
procJvmMemoryPool(metrics);
|
||||||
procJvmThread(metrics);
|
procJvmThread(metrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,6 +169,50 @@ public class ProcMetricModule extends MetricModule {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void procJvmMemoryPool(MetricMaker metrics) {
|
||||||
|
Field<String> poolName =
|
||||||
|
Field.ofString("pool_name", Metadata.Builder::memoryPoolName)
|
||||||
|
.description("The name of the memory pool")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
CallbackMetric1<String, Long> committed =
|
||||||
|
metrics.newCallbackMetric(
|
||||||
|
"proc/jvm/memory/pool/committed",
|
||||||
|
Long.class,
|
||||||
|
new Description("Committed pool size").setUnit(Units.BYTES),
|
||||||
|
poolName);
|
||||||
|
|
||||||
|
CallbackMetric1<String, Long> max =
|
||||||
|
metrics.newCallbackMetric(
|
||||||
|
"proc/jvm/memory/pool/max",
|
||||||
|
Long.class,
|
||||||
|
new Description("Max pool size").setUnit(Units.BYTES),
|
||||||
|
poolName);
|
||||||
|
|
||||||
|
CallbackMetric1<String, Long> used =
|
||||||
|
metrics.newCallbackMetric(
|
||||||
|
"proc/jvm/memory/pool/used",
|
||||||
|
Long.class,
|
||||||
|
new Description("Used pool size").setUnit(Units.BYTES),
|
||||||
|
poolName);
|
||||||
|
|
||||||
|
metrics.newTrigger(
|
||||||
|
committed,
|
||||||
|
max,
|
||||||
|
used,
|
||||||
|
() -> {
|
||||||
|
for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {
|
||||||
|
if (!pool.isValid()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
MemoryUsage u = pool.getUsage();
|
||||||
|
committed.set(pool.getName(), u.getCommitted());
|
||||||
|
max.set(pool.getName(), u.getMax());
|
||||||
|
used.set(pool.getName(), u.getUsed());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void procJvmGc(MetricMaker metrics) {
|
private void procJvmGc(MetricMaker metrics) {
|
||||||
Field<String> gcNameField =
|
Field<String> gcNameField =
|
||||||
Field.ofString("gc_name", Metadata.Builder::garbageCollectorName)
|
Field.ofString("gc_name", Metadata.Builder::garbageCollectorName)
|
||||||
|
|||||||
@@ -102,6 +102,9 @@ public abstract class Metadata {
|
|||||||
/** The version of a secondary index. */
|
/** The version of a secondary index. */
|
||||||
public abstract Optional<Integer> indexVersion();
|
public abstract Optional<Integer> indexVersion();
|
||||||
|
|
||||||
|
/** The name of the implementation method. */
|
||||||
|
public abstract Optional<String> memoryPoolName();
|
||||||
|
|
||||||
/** The name of the implementation method. */
|
/** The name of the implementation method. */
|
||||||
public abstract Optional<String> methodName();
|
public abstract Optional<String> methodName();
|
||||||
|
|
||||||
@@ -309,6 +312,8 @@ public abstract class Metadata {
|
|||||||
|
|
||||||
public abstract Builder indexVersion(int indexVersion);
|
public abstract Builder indexVersion(int indexVersion);
|
||||||
|
|
||||||
|
public abstract Builder memoryPoolName(@Nullable String memoryPoolName);
|
||||||
|
|
||||||
public abstract Builder methodName(@Nullable String methodName);
|
public abstract Builder methodName(@Nullable String methodName);
|
||||||
|
|
||||||
public abstract Builder multiple(boolean multiple);
|
public abstract Builder multiple(boolean multiple);
|
||||||
|
|||||||
Reference in New Issue
Block a user