@Override public void serialize(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { // creation of the map enables all the fields to be properly written with their type if required final Map<String, Object> m = new HashMap<>(); m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final List<Metrics> metrics = new ArrayList<>(); metrics.addAll(traversalMetrics.getMetrics()); m.put(GraphSONTokens.METRICS, metrics); jsonGenerator.writeObject(m); } }
private void validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(final TraversalMetrics traversalMetrics) { traversalMetrics.toString(); // ensure no exceptions are thrown assumeThat("The following assertions apply to TinkerGraph only as provider strategies can alter the steps to not comply with expectations", graph.getClass().getSimpleName(), equalTo("TinkerGraph")); // Grab the second (sideEffect{sleep}) step and check the times. Metrics metrics = traversalMetrics.getMetrics(1); // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation. assertTrue("Duration should be at least the length of the sleep (59ms): " + metrics.getDuration(TimeUnit.MILLISECONDS), metrics.getDuration(TimeUnit.MILLISECONDS) >= 59); // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation metrics = traversalMetrics.getMetrics(2); assertTrue("Duration should be at least the length of the sleep (29ms): " + metrics.getDuration(TimeUnit.MILLISECONDS), metrics.getDuration(TimeUnit.MILLISECONDS) >= 29); double totalPercentDuration = 0; for (Metrics m : traversalMetrics.getMetrics()) { totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY); } assertEquals(100, totalPercentDuration, 0.000001); }
private void validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(final Traversal traversal, final TraversalMetrics traversalMetrics) { traversalMetrics.toString(); // ensure no exceptions are thrown assumeThat("The following assertions apply to TinkerGraph only as provider strategies can alter the steps to not comply with expectations", graph.getClass().getSimpleName(), equalTo("TinkerGraph")); assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size()); Metrics metrics = traversalMetrics.getMetrics(0); assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); metrics = traversalMetrics.getMetrics(1); assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); if (traversal.asAdmin().getStrategies().toList().stream().anyMatch(s -> s instanceof CountStrategy)) { assertEquals("Metrics 1 should have 4 nested metrics.", 4, metrics.getNested().size()); } else { assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size()); } }
@Override public void serialize(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { // creation of the map enables all the fields to be properly written with their type if required final Map<String, Object> m = new HashMap<>(); m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final List<Metrics> metrics = new ArrayList<>(); metrics.addAll(traversalMetrics.getMetrics()); m.put(GraphSONTokens.METRICS, metrics); jsonGenerator.writeObject(m); } }
assertCount(superV * 10, t); metrics = (TraversalMetrics) t.asAdmin().getSideEffects().get("~metrics").get(); verifyMetrics(metrics.getMetrics(0), true, false); verifyMetrics(metrics.getMetrics(1), true, true); assertCount(superV * numV, t); metrics = (TraversalMetrics) t.asAdmin().getSideEffects().get("~metrics").get(); verifyMetrics(metrics.getMetrics(0), true, false); verifyMetrics(metrics.getMetrics(1), true, true); metrics = (TraversalMetrics) t.asAdmin().getSideEffects().get("~metrics").get(); verifyMetrics(metrics.getMetrics(0), false, false); verifyMetrics(metrics.getMetrics(1), false, true); metrics = (TraversalMetrics) t.asAdmin().getSideEffects().get("~metrics").get(); verifyMetrics(metrics.getMetrics(0), false, false); verifyMetrics(metrics.getMetrics(1), false, true);
private static void serializeInternal(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator) throws IOException { // creation of the map enables all the fields to be properly written with their type if required final Map<String, Object> m = new HashMap<>(); m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final List<Map<String, Object>> metrics = new ArrayList<>(); traversalMetrics.getMetrics().forEach(it -> metrics.add(metricsToMap(it))); m.put(GraphSONTokens.METRICS, metrics); jsonGenerator.writeObject(m); }
private void validate_g_V_out_out_profile_modern(final Traversal traversal, final TraversalMetrics traversalMetrics) { traversalMetrics.toString(); // ensure no exceptions are thrown assumeThat("The following assertions apply to TinkerGraph only as provider strategies can alter the steps to not comply with expectations", graph.getClass().getSimpleName(), equalTo("TinkerGraph")); Metrics metrics = traversalMetrics.getMetrics(0); assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); metrics = traversalMetrics.getMetrics(1); assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); metrics = traversalMetrics.getMetrics(2); assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); if (!onGraphComputer(traversal.asAdmin())) { // Every other step should be a Profile step List<Step> steps = traversal.asAdmin().getSteps(); for (int ii = 1; ii <= 6; ii += 2) { assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass()); } } }
@Override public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final TraversalMetrics object) { output.writeDouble(object.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final Collection<? extends Metrics> metrics = object.getMetrics(); output.writeInt(metrics.size()); metrics.forEach(m -> kryo.writeObject(output, m)); }
private void validate_g_V_out_out_profile_grateful(final TraversalMetrics traversalMetrics) { traversalMetrics.toString(); // ensure no exceptions are thrown assumeThat("The following assertions apply to TinkerGraph only as provider strategies can alter the steps to not comply with expectations", graph.getClass().getSimpleName(), equalTo("TinkerGraph")); Metrics metrics = traversalMetrics.getMetrics(0); assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0); assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0); metrics = traversalMetrics.getMetrics(1); assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0); assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0); metrics = traversalMetrics.getMetrics(2); assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0); assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0); double totalPercentDuration = 0; for (Metrics m : traversalMetrics.getMetrics()) { totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY); } assertEquals(100, totalPercentDuration, 0.000001); }
@Test @LoadGraphWith(LoadGraphWith.GraphData.MODERN) public void shouldSerializeTraversalMetrics() throws Exception { final GryoIo gryoIo = graph.io(GryoIo.build(GryoVersion.V1_0)); final GryoWriter gryoWriter = gryoIo.writer().create(); final GryoReader gryoReader = gryoIo.reader().create(); final TraversalMetrics before = g.V().both().profile().next(); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); gryoWriter.writeObject(outputStream, before); final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); final TraversalMetrics after = gryoReader.readObject(inputStream, TraversalMetrics.class); assertNotNull(after); assertEquals(before.getMetrics().size(), after.getMetrics().size()); assertEquals(before.getDuration(TimeUnit.MILLISECONDS), after.getDuration(TimeUnit.MILLISECONDS)); assertEquals(before.getMetrics(0).getCounts(), after.getMetrics().stream().findFirst().get().getCounts()); }
@Test @LoadGraphWith(LoadGraphWith.GraphData.MODERN) public void shouldSerializeTraversalMetrics() throws Exception { final ObjectMapper mapper = graph.io(GraphSONIo.build(GraphSONVersion.V1_0)).mapper().version(GraphSONVersion.V1_0).create().createMapper(); final TraversalMetrics tm = g.V().both().profile().next(); final String json = mapper.writeValueAsString(tm); final Map<String, Object> m = mapper.readValue(json, mapTypeReference); assertTrue(m.containsKey(GraphSONTokens.DURATION)); assertTrue(m.containsKey(GraphSONTokens.METRICS)); final List<Map<String, Object>> metrics = (List<Map<String, Object>>) m.get(GraphSONTokens.METRICS); assertEquals(tm.getMetrics().size(), metrics.size()); final Map<String, Object> metrics0 = metrics.get(0); assertTrue(metrics0.containsKey(GraphSONTokens.ID)); assertTrue(metrics0.containsKey(GraphSONTokens.NAME)); assertTrue(metrics0.containsKey(GraphSONTokens.COUNTS)); assertTrue(metrics0.containsKey(GraphSONTokens.DURATION)); }
@Test @LoadGraphWith(LoadGraphWith.GraphData.MODERN) public void shouldSerializeTraversalMetrics() throws Exception { final GryoIo gryoIo = graph.io(GryoIo.build(GryoVersion.V3_0)); final GryoWriter gryoWriter = gryoIo.writer().create(); final GryoReader gryoReader = gryoIo.reader().create(); final TraversalMetrics before = (TraversalMetrics) g.V().both().profile().next(); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); gryoWriter.writeObject(outputStream, before); final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); final TraversalMetrics after = gryoReader.readObject(inputStream, TraversalMetrics.class); assertNotNull(after); assertEquals(before.getMetrics().size(), after.getMetrics().size()); assertEquals(before.getDuration(TimeUnit.MILLISECONDS), after.getDuration(TimeUnit.MILLISECONDS)); assertEquals(before.getMetrics(0).getCounts(), after.getMetrics().stream().findFirst().get().getCounts()); }
private void validate_g_V_repeat_both_modern_profile(final TraversalMetrics traversalMetrics, final boolean withRepeatUnrollStrategy) { traversalMetrics.toString(); // ensure no exceptions are thrown assumeThat("The following assertions apply to TinkerGraph only as provider strategies can alter the steps to not comply with expectations", graph.getClass().getSimpleName(), equalTo("TinkerGraph")); Metrics metrics = traversalMetrics.getMetrics(0); assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); metrics = traversalMetrics.getMetrics(1); assertEquals(withRepeatUnrollStrategy ? 12 : 72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); if (!withRepeatUnrollStrategy) assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0); assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0); // Test the nested global metrics of the repeat step if (!withRepeatUnrollStrategy) { final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0]; assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue()); assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue()); assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0); } double totalPercentDuration = 0; for (Metrics m : traversalMetrics.getMetrics()) { totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY); } assertEquals(100, totalPercentDuration, 0.000001); }
@Test @LoadGraphWith(LoadGraphWith.GraphData.MODERN) public void shouldSerializeTraversalMetrics() throws Exception { final ObjectMapper mapper = graph.io(GraphSONIo.build(GraphSONVersion.V3_0)).mapper().version(GraphSONVersion.V3_0).create().createMapper(); final TraversalMetrics before = g.V().both().profile().next(); final String json = mapper.writeValueAsString(before); final TraversalMetrics after = mapper.readValue(json, TraversalMetrics.class); assertNotNull(after); assertEquals(before.getMetrics().size(), after.getMetrics().size()); assertEquals(before.getDuration(TimeUnit.MILLISECONDS), after.getDuration(TimeUnit.MILLISECONDS)); assertEquals(before.getMetrics().size(), after.getMetrics().size()); before.getMetrics().forEach(b -> { final Optional<? extends Metrics> mFromA = after.getMetrics().stream().filter(a -> b.getId().equals(a.getId())).findFirst(); if (mFromA.isPresent()) { final Metrics m = mFromA.get(); assertEquals(b.getAnnotations(), m.getAnnotations()); assertEquals(b.getCounts(), m.getCounts()); assertEquals(b.getName(), m.getName()); assertEquals(b.getDuration(TimeUnit.MILLISECONDS), m.getDuration(TimeUnit.MILLISECONDS)); } else { fail("Metrics were not present after deserialization"); } }); }
@Test @LoadGraphWith(MODERN) public void testProfileStrategyCallback() { final Traversal<Vertex, TraversalMetrics> t = get_g_V_out_out_profile(); MockStep mockStep = new MockStep(t.asAdmin()); t.asAdmin().addStep(3, mockStep); TraversalMetrics traversalMetrics = t.next(); assertTrue(mockStep.callbackCalled); if (!onGraphComputer(t.asAdmin())) { assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue()); } }
@Test @LoadGraphWith(LoadGraphWith.GraphData.MODERN) public void shouldSerializeTraversalMetrics() throws Exception { final ObjectMapper mapper = graph.io(GraphSONIo.build(GraphSONVersion.V2_0)).mapper().version(GraphSONVersion.V2_0).create().createMapper(); final TraversalMetrics before = g.V().both().profile().next(); final String json = mapper.writeValueAsString(before); final TraversalMetrics after = mapper.readValue(json, TraversalMetrics.class); assertNotNull(after); assertEquals(before.getMetrics().size(), after.getMetrics().size()); assertEquals(before.getDuration(TimeUnit.MILLISECONDS), after.getDuration(TimeUnit.MILLISECONDS)); assertEquals(before.getMetrics().size(), after.getMetrics().size()); before.getMetrics().forEach(b -> { final Optional<? extends Metrics> mFromA = after.getMetrics().stream().filter(a -> b.getId().equals(a.getId())).findFirst(); if (mFromA.isPresent()) { final Metrics m = mFromA.get(); assertEquals(b.getAnnotations(), m.getAnnotations()); assertEquals(b.getCounts(), m.getCounts()); assertEquals(b.getName(), m.getName()); assertEquals(b.getDuration(TimeUnit.MILLISECONDS), m.getDuration(TimeUnit.MILLISECONDS)); } else { fail("Metrics were not present after deserialization"); } }); }
@Test @LoadGraphWith(MODERN) public void testProfileStrategyCallbackSideEffect() { final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetricsX(); MockStep mockStep = new MockStep(t.asAdmin()); t.asAdmin().addStep(3, mockStep); t.iterate(); assertTrue(mockStep.callbackCalled); if (!onGraphComputer(t.asAdmin())) { final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().get(METRICS_KEY); assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue()); } }
@Override public void serialize(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { // creation of the map enables all the fields to be properly written with their type if required final Map<String, Object> m = new HashMap<>(); m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final List<Metrics> metrics = new ArrayList<>(); metrics.addAll(traversalMetrics.getMetrics()); m.put(GraphSONTokens.METRICS, metrics); jsonGenerator.writeObject(m); } }
addGraphProcessEntry(org.apache.tinkerpop.gremlin.util.function.Lambda.function("{ it.get() }"), "Lambda", "", Compatibilities.UNTYPED_GRAPHSON.matchToArray()); final TraversalMetrics tm = createStaticTraversalMetrics(); final MutableMetrics metrics = new MutableMetrics(tm.getMetrics("7.0.0()")); metrics.addNested(new MutableMetrics(tm.getMetrics("3.0.0()"))); addGraphProcessEntry(metrics, "Metrics", "", noTypeGraphSONPlusGryo3_3_0); addGraphProcessEntry(P.gt(0), "P", "", Compatibilities.UNTYPED_GRAPHSON.matchToArray());
@Override public void serialize(final TraversalMetrics traversalMetrics, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { // creation of the map enables all the fields to be properly written with their type if required final Map<String, Object> m = new HashMap<>(); m.put(GraphSONTokens.DURATION, traversalMetrics.getDuration(TimeUnit.NANOSECONDS) / 1000000d); final List<Metrics> metrics = new ArrayList<>(); metrics.addAll(traversalMetrics.getMetrics()); m.put(GraphSONTokens.METRICS, metrics); jsonGenerator.writeObject(m); } }