You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by kb...@apache.org on 2019/10/09 14:35:43 UTC
[atlas] 01/03: ATLAS-3441 Add JVM resource metrics for Atlas
monitoring
This is an automated email from the ASF dual-hosted git repository.
kbhatt pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git
commit cc7389f861be03a0992d93d57bc7780eada64e4f
Author: nikhilbonte <ni...@freestoneinfotech.com>
AuthorDate: Fri Oct 4 18:16:18 2019 +0530
ATLAS-3441 Add JVM resource metrics for Atlas monitoring
Signed-off-by: kevalbhatt <kb...@apache.org>
(cherry picked from commit 5dffddd005827137e35b72d837fdd51cd1ce4d5b)
---
.../org/apache/atlas/services/MetricsService.java | 8 ++
.../org/apache/atlas/util/AtlasMetricJVMUtil.java | 110 +++++++++++++++++++++
2 files changed, 118 insertions(+)
diff --git a/repository/src/main/java/org/apache/atlas/services/MetricsService.java b/repository/src/main/java/org/apache/atlas/services/MetricsService.java
index 2a65b55..d566f73 100644
--- a/repository/src/main/java/org/apache/atlas/services/MetricsService.java
+++ b/repository/src/main/java/org/apache/atlas/services/MetricsService.java
@@ -27,6 +27,7 @@ import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2;
import org.apache.atlas.type.AtlasTypeRegistry;
import org.apache.atlas.util.AtlasMetricsUtil;
+import org.apache.atlas.util.AtlasMetricJVMUtil;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -50,6 +51,7 @@ public class MetricsService {
public static final String ENTITY = "entity";
public static final String TAG = "tag";
public static final String GENERAL = "general";
+ public static final String SYSTEM = "system";
// Query names
protected static final String METRIC_COLLECTION_TIME = "collectionTime";
@@ -62,6 +64,9 @@ public class MetricsService {
protected static final String METRIC_ENTITY_SHELL = ENTITY + "Shell";
protected static final String METRIC_TAG_COUNT = TAG + "Count";
protected static final String METRIC_ENTITIES_PER_TAG = TAG + "Entities";
+ protected static final String METRIC_RUNTIME = "runtime";
+ protected static final String METRIC_MEMORY = "memory";
+ protected static final String METRIC_OS = "os";
private final AtlasGraph atlasGraph;
private final AtlasTypeRegistry typeRegistry;
@@ -131,6 +136,9 @@ public class MetricsService {
metrics.addMetric(ENTITY, METRIC_ENTITY_SHELL, getShellEntityCount());
metrics.addMetric(TAG, METRIC_ENTITIES_PER_TAG, taggedEntityCount);
+ metrics.addMetric(SYSTEM, METRIC_MEMORY, AtlasMetricJVMUtil.getMemoryDetails());
+ metrics.addMetric(SYSTEM, METRIC_OS, AtlasMetricJVMUtil.getSystemInfo());
+ metrics.addMetric(SYSTEM, METRIC_RUNTIME, AtlasMetricJVMUtil.getRuntimeInfo());
return metrics;
}
diff --git a/repository/src/main/java/org/apache/atlas/util/AtlasMetricJVMUtil.java b/repository/src/main/java/org/apache/atlas/util/AtlasMetricJVMUtil.java
new file mode 100644
index 0000000..f1becf8
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/util/AtlasMetricJVMUtil.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.atlas.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryPoolMXBean;
+import java.lang.management.MemoryType;
+import java.lang.management.MemoryUsage;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+
+public class AtlasMetricJVMUtil {
+ private static final Logger LOG = LoggerFactory.getLogger(AtlasMetricJVMUtil.class);
+
+ private static final RuntimeMXBean RUNTIME;
+ private static final OperatingSystemMXBean OS;
+ private static final MemoryMXBean memBean;
+
+ static {
+ RUNTIME = ManagementFactory.getRuntimeMXBean();
+ OS = ManagementFactory.getOperatingSystemMXBean();
+ memBean = ManagementFactory.getMemoryMXBean();
+ }
+
+ /**
+ * Collect general runtime information.
+ */
+ public static Map<String, Object> getRuntimeInfo() {
+ Map<String, Object> vmDetails = new LinkedHashMap<>();
+ vmDetails.put("name", RUNTIME.getVmName());
+ vmDetails.put("version", RUNTIME.getSystemProperties().get("java.version"));
+ return vmDetails;
+ }
+
+ /**
+ * Add memory details
+ */
+ public static Map<String, Object> getMemoryDetails() {
+ Map<String, Object> memory = new LinkedHashMap<>();
+ heapDetails(memory);
+ pooldivision(memory);
+ return memory;
+ }
+
+ /**
+ * Collect system information.
+ */
+ public static Map<String, Object> getSystemInfo() {
+ Map<String, Object> values = new LinkedHashMap<>();
+ String[] osInfo = {OS.getName(), OS.getArch(), OS.getVersion()};
+ values.put("os.spec", String.join(", ", osInfo));
+ values.put("os.vcpus", String.valueOf(OS.getAvailableProcessors()));
+ return values;
+ }
+
+ /**
+ * collect the pool division of java
+ */
+ private static void pooldivision(Map<String, Object> memory) {
+ Map<String, Object> poolDivisionValues = new LinkedHashMap<>();
+ for (MemoryPoolMXBean mpBean : ManagementFactory.getMemoryPoolMXBeans()) {
+ if (mpBean.getType() == MemoryType.HEAP) {
+ poolDivisionValues.put(mpBean.getName(), mpBean.getUsage());
+ }
+ }
+ memory.put("memory_pool_usages", poolDivisionValues);
+ }
+
+ /**
+ * Collect java heap details
+ */
+ private static void heapDetails(Map<String, Object> memory) {
+ MemoryUsage memHeapUsage = memBean.getHeapMemoryUsage();
+ MemoryUsage nonHeapUsage = memBean.getNonHeapMemoryUsage();
+ memory.put("heapInit", String.valueOf(memHeapUsage.getInit()));
+ memory.put("heapMax", String.valueOf(memHeapUsage.getMax()));
+ memory.put("heapCommitted", String.valueOf(memHeapUsage.getCommitted()));
+ memory.put("heapUsed", String.valueOf(memHeapUsage.getUsed()));
+ memory.put("nonHeapInit", String.valueOf(nonHeapUsage.getInit()));
+ memory.put("nonHeapMax", String.valueOf(nonHeapUsage.getMax()));
+ memory.put("nonHeapCommitted", String.valueOf(nonHeapUsage.getCommitted()));
+ memory.put("nonHeapUsed", String.valueOf(nonHeapUsage.getUsed()));
+ }
+}
\ No newline at end of file