diff --git a/hugegraph-api/src/main/java/com/baidu/hugegraph/api/GremlinAPI.java b/hugegraph-api/src/main/java/com/baidu/hugegraph/api/GremlinAPI.java index ae1efa1599..3973f4d1eb 100644 --- a/hugegraph-api/src/main/java/com/baidu/hugegraph/api/GremlinAPI.java +++ b/hugegraph-api/src/main/java/com/baidu/hugegraph/api/GremlinAPI.java @@ -38,12 +38,19 @@ import com.baidu.hugegraph.api.filter.CompressInterceptor.Compress; import com.baidu.hugegraph.config.HugeConfig; import com.baidu.hugegraph.config.ServerOptions; +import com.baidu.hugegraph.metric.MetricsUtil; +import com.codahale.metrics.Histogram; import com.codahale.metrics.annotation.Timed; @Path("gremlin") @Singleton public class GremlinAPI extends API { + private static final Histogram gremlinInputHistogram = + MetricsUtil.registerHistogram(GremlinAPI.class, "gremlin-input"); + private static final Histogram gremlinOutputHistogram = + MetricsUtil.registerHistogram(GremlinAPI.class, "gremlin-output"); + private Client client = ClientBuilder.newClient(); private Response doGetRequest(String location, String auth, String query) { @@ -60,10 +67,12 @@ private Response doGetRequest(String location, String auth, String query) { r.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, r.getMediaType().withCharset(CHARSET)); } + gremlinInputHistogram.update(query.length()); + gremlinOutputHistogram.update(r.getLength()); return r; } - private Response doPostRequest(String location, String auth, Object req) { + private Response doPostRequest(String location, String auth, String req) { Entity body = Entity.entity(req, MediaType.APPLICATION_JSON); Response r = this.client.target(location) .request() @@ -77,6 +86,8 @@ private Response doPostRequest(String location, String auth, Object req) { r.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, r.getMediaType().withCharset(CHARSET)); } + gremlinInputHistogram.update(req.length()); + gremlinOutputHistogram.update(r.getLength()); return r; } diff --git a/hugegraph-api/src/main/java/com/baidu/hugegraph/api/job/GremlinAPI.java b/hugegraph-api/src/main/java/com/baidu/hugegraph/api/job/GremlinAPI.java index bd8dec7687..45ec879118 100644 --- a/hugegraph-api/src/main/java/com/baidu/hugegraph/api/job/GremlinAPI.java +++ b/hugegraph-api/src/main/java/com/baidu/hugegraph/api/job/GremlinAPI.java @@ -41,11 +41,13 @@ import com.baidu.hugegraph.core.GraphManager; import com.baidu.hugegraph.job.Job; import com.baidu.hugegraph.job.JobBuilder; +import com.baidu.hugegraph.metric.MetricsUtil; import com.baidu.hugegraph.server.RestServer; import com.baidu.hugegraph.traversal.optimize.HugeScriptTraversal; import com.baidu.hugegraph.util.E; import com.baidu.hugegraph.util.JsonUtil; import com.baidu.hugegraph.util.Log; +import com.codahale.metrics.Histogram; import com.codahale.metrics.annotation.Timed; import jersey.repackaged.com.google.common.collect.ImmutableMap; @@ -56,6 +58,9 @@ public class GremlinAPI extends API { private static final Logger LOG = Log.logger(RestServer.class); + private static final Histogram gremlinJobInputHistogram = + MetricsUtil.registerHistogram(GremlinAPI.class, "gremlin-input"); + @POST @Timed @Status(Status.CREATED) @@ -66,6 +71,7 @@ public Map post(@Context GraphManager manager, GremlinRequest request) { LOG.debug("Graph [{}] schedule gremlin job: {}", graph, request); checkCreatingBody(request); + gremlinJobInputHistogram.update(request.gremlin.length()); HugeGraph g = graph(manager, graph); request.aliase(graph, "graph"); diff --git a/hugegraph-api/src/main/java/com/baidu/hugegraph/core/GraphManager.java b/hugegraph-api/src/main/java/com/baidu/hugegraph/core/GraphManager.java index 2b39c45ff6..da7e5bce0d 100644 --- a/hugegraph-api/src/main/java/com/baidu/hugegraph/core/GraphManager.java +++ b/hugegraph-api/src/main/java/com/baidu/hugegraph/core/GraphManager.java @@ -193,9 +193,9 @@ private void checkBackendVersionOrExit() { } private void addMetrics(HugeConfig config) { - final MetricManager metrics = MetricManager.INSTANCE; + final MetricManager metric = MetricManager.INSTANCE; // Force to add server reporter - ServerReporter reporter = ServerReporter.instance(metrics.getRegistry()); + ServerReporter reporter = ServerReporter.instance(metric.getRegistry()); reporter.start(60L, TimeUnit.SECONDS); // Add metrics for MAX_WRITE_THREADS diff --git a/hugegraph-api/src/main/java/com/baidu/hugegraph/metric/SystemMetrics.java b/hugegraph-api/src/main/java/com/baidu/hugegraph/metric/SystemMetrics.java index faf0a760b0..161a041373 100644 --- a/hugegraph-api/src/main/java/com/baidu/hugegraph/metric/SystemMetrics.java +++ b/hugegraph-api/src/main/java/com/baidu/hugegraph/metric/SystemMetrics.java @@ -42,16 +42,25 @@ public Map> metrics() { metrics.put("heap", this.getHeapMetrics()); metrics.put("nonheap", this.getNonHeapMetrics()); metrics.put("thread", this.getThreadMetrics()); - metrics.put("class-loading", this.getClassLoadingMetrics()); - metrics.put("garbage-collector", this.getGarbageCollectionMetrics()); + metrics.put("class_loading", this.getClassLoadingMetrics()); + metrics.put("garbage_collector", this.getGarbageCollectionMetrics()); return metrics; } private Map getBasicMetrics() { Map metrics = new LinkedHashMap<>(); Runtime runtime = Runtime.getRuntime(); - metrics.put("mem", (runtime.totalMemory() + totalNonHeapMemory()) / MB); - metrics.put("mem_free", runtime.freeMemory() / MB); + // Heap allocated memory (measured in bytes) + long total = runtime.totalMemory(); + // Heap free memory + long free = runtime.freeMemory(); + long used = total - free; + + metrics.put("mem", (total + totalNonHeapMemory()) / MB); + metrics.put("mem_total", total / MB); + metrics.put("mem_used", used / MB); + metrics.put("mem_free", free / MB); + metrics.put("mem_unit", "MB"); metrics.put("processors", runtime.availableProcessors()); metrics.put("uptime", ManagementFactory.getRuntimeMXBean().getUptime()); metrics.put("systemload_average", @@ -60,11 +69,12 @@ private Map getBasicMetrics() { return metrics; } - private long totalNonHeapMemory() { + private static long totalNonHeapMemory() { try { return ManagementFactory.getMemoryMXBean() - .getNonHeapMemoryUsage().getUsed(); - } catch (Throwable ex) { + .getNonHeapMemoryUsage() + .getCommitted(); + } catch (Throwable ignored) { return 0; } }