@Override public DefaultTraversalMetrics get() { return new DefaultTraversalMetrics(); }
@Override public String toString() { // Build a pretty table of metrics data. // Append headers final StringBuilder sb = new StringBuilder("Traversal Metrics\n") .append(String.format("%-50s %21s %11s %15s %8s", HEADERS)); sb.append("\n============================================================================================================="); appendMetrics(this.positionIndexedMetrics.values(), sb, 0); // Append total duration sb.append(String.format("%n%50s %21s %11s %15.3f %8s", ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-")); return sb.toString(); }
/** * Extracts metrics from the provided {@code traversal} and computes metrics. Calling this method finalizes the * metrics such that their values can no longer be modified. */ public synchronized void setMetrics(final Traversal.Admin traversal, final boolean onGraphComputer) { if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified"); finalized = true; handleNestedTraversals(traversal, null, onGraphComputer); addTopLevelMetrics(traversal, onGraphComputer); }
@Override public DefaultTraversalMetrics generateFinalResult(final DefaultTraversalMetrics tm) { if (this.onGraphComputer && !tm.isFinalized()) tm.setMetrics(this.getTraversal(), true); return tm; }
final int leftover = 110 - valueIndentLen; final String[] splitValues = splitOnSize(kv.getValue().toString(), leftover); for (int ix = 0; ix < splitValues.length; ix++) { sb.append(String.format("%n%s", k + separator + splitValues[ix])); } else { sb.append(String.format("%n%s", padLeft(splitValues[ix], valueIndentLen - 1))); appendMetrics(m.getNested(), sb, indent + 1);
@Override public OResult transform(DefaultTraversalMetrics value) { OResultInternal result = new OResultInternal(); result.setProperty("time (ms)", value.getDuration(TimeUnit.MILLISECONDS)); List<OResultInternal> steps = value.getMetrics().stream().map((m) -> { OResultInternal internal = new OResultInternal(); internal.setProperty("id", m.getId()); internal.setProperty("time (ms)", m.getDuration(TimeUnit.MILLISECONDS)); internal.setProperty("name", m.getName()); return internal; }).collect(Collectors.toList()); result.setProperty("steps", steps); return result; } }
handleNestedTraversals(t, metrics, onGraphComputer); handleNestedTraversals(t, metrics, onGraphComputer);
@Override public boolean hasNext() { boolean start = super.hasNext(); if (!this.onGraphComputer && !start) { final DefaultTraversalMetrics m = getTraversalMetricsFromSideEffects(); if (!m.isFinalized()) m.setMetrics(this.getTraversal(), false); } return start; }
final int leftover = 110 - valueIndentLen; final String[] splitValues = splitOnSize(kv.getValue().toString(), leftover); for (int ix = 0; ix < splitValues.length; ix++) { sb.append(String.format("%n%s", k + separator + splitValues[ix])); } else { sb.append(String.format("%n%s", padLeft(splitValues[ix], valueIndentLen - 1))); appendMetrics(m.getNested(), sb, indent + 1);
handleNestedTraversals(t, metrics, onGraphComputer); handleNestedTraversals(t, metrics, onGraphComputer);
@Override public TraversalMetrics createObject(final Map<String, Object> traversalMetricsData) { return new DefaultTraversalMetrics( Math.round((Double) traversalMetricsData.get(GraphSONTokens.DURATION) * 1000000), (List<MutableMetrics>) traversalMetricsData.get(GraphSONTokens.METRICS) ); } }
@Override public Traverser.Admin<S> next() { Traverser.Admin<S> start = null; try { start = super.next(); return start; } finally { if (!this.onGraphComputer && start == null) { final DefaultTraversalMetrics m = getTraversalMetricsFromSideEffects(); if (!m.isFinalized()) m.setMetrics(this.getTraversal(), false); } } }
@Override public String toString() { // Build a pretty table of metrics data. // Append headers final StringBuilder sb = new StringBuilder("Traversal Metrics\n") .append(String.format("%-50s %21s %11s %15s %8s", HEADERS)); sb.append("\n============================================================================================================="); appendMetrics(this.positionIndexedMetrics.values(), sb, 0); // Append total duration sb.append(String.format("%n%50s %21s %11s %15.3f %8s", ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-")); return sb.toString(); }
/** * Extracts metrics from the provided {@code traversal} and computes metrics. Calling this method finalizes the * metrics such that their values can no longer be modified. */ public synchronized void setMetrics(final Traversal.Admin traversal, final boolean onGraphComputer) { if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified"); finalized = true; handleNestedTraversals(traversal, null, onGraphComputer); addTopLevelMetrics(traversal, onGraphComputer); }
@Override public TraversalMetrics deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { final Map<String, Object> traversalMetricsData = deserializationContext.readValue(jsonParser, Map.class); return new DefaultTraversalMetrics( Math.round((Double) traversalMetricsData.get(GraphSONTokens.DURATION) * 1000000), (List<MutableMetrics>) traversalMetricsData.get(GraphSONTokens.METRICS) ); }
@Override public DefaultTraversalMetrics generateFinalResult(final DefaultTraversalMetrics tm) { if (this.onGraphComputer && !tm.isFinalized()) tm.setMetrics(this.getTraversal(), true); return tm; }
@Override public <I extends InputShim> TraversalMetrics read(final KryoShim<I, ?> kryo, final I input, final Class<TraversalMetrics> clazz) { final double duration = input.readDouble(); final int size = input.readInt(); final List<MutableMetrics> orderedMetrics = new ArrayList<>(); for (int ix = 0; ix < size; ix++) { orderedMetrics.add(kryo.readObject(input, MutableMetrics.class)); } return new DefaultTraversalMetrics(Math.round(duration * 1000000), orderedMetrics); } }
@Override public boolean hasNext() { boolean start = super.hasNext(); if (!this.onGraphComputer && !start) { final DefaultTraversalMetrics m = getTraversalMetricsFromSideEffects(); if (!m.isFinalized()) m.setMetrics(this.getTraversal(), false); } return start; }
private static DefaultTraversalMetrics createStaticTraversalMetrics() { // based on g.V().hasLabel("person").out().out().tree().profile().next() final List<MutableMetrics> traversalMutableMetrics = new ArrayList<>(); final MutableMetrics m7 = new MutableMetrics("7.0.0()", "TinkerGraphStep(vertex,[~label.eq(person)])"); m7.setDuration(100, TimeUnit.MILLISECONDS); m7.setCount("traverserCount", 4); m7.setCount("elementCount", 4); m7.setAnnotation("percentDur", 25.0d); traversalMutableMetrics.add(m7); final MutableMetrics m2 = new MutableMetrics("2.0.0()", "VertexStep(OUT,vertex)"); m2.setDuration(100, TimeUnit.MILLISECONDS); m2.setCount("traverserCount", 13); m2.setCount("elementCount", 13); m2.setAnnotation("percentDur", 25.0d); traversalMutableMetrics.add(m2); final MutableMetrics m3 = new MutableMetrics("3.0.0()", "VertexStep(OUT,vertex)"); m3.setDuration(100, TimeUnit.MILLISECONDS); m3.setCount("traverserCount", 7); m3.setCount("elementCount", 7); m3.setAnnotation("percentDur", 25.0d); traversalMutableMetrics.add(m3); final MutableMetrics m4 = new MutableMetrics("4.0.0()", "TreeStep"); m4.setDuration(100, TimeUnit.MILLISECONDS); m4.setCount("traverserCount", 1); m4.setCount("elementCount", 1); m4.setAnnotation("percentDur", 25.0d); traversalMutableMetrics.add(m4); return new DefaultTraversalMetrics(4000, traversalMutableMetrics); }
@Override public Traverser.Admin<S> next() { Traverser.Admin<S> start = null; try { start = super.next(); return start; } finally { if (!this.onGraphComputer && start == null) { final DefaultTraversalMetrics m = getTraversalMetricsFromSideEffects(); if (!m.isFinalized()) m.setMetrics(this.getTraversal(), false); } } }