/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName * - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn ("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartEpochTimeMilliIfKnown(), event.getStartTimeNano(), event.getEndTimeNano())); }
/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName * - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn ("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartEpochTimeMilliIfKnown(), event.getStartTimeNano(), event.getEndTimeNano())); }
/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartTimeNano(), event.getEndTimeNano())); }
@Test public void absurdTimingWithClock() throws InterruptedException { final long startTimeMilli = System.currentTimeMillis(); final long startTimeNano = System.nanoTime(); Thread.sleep(1);// sleep for 1 millisecond final long endTimeNano = System.nanoTime(); // absurdly swap the start/end times TimingInfo ti = TimingInfo.newTimingInfoFullSupport(startTimeMilli, endTimeNano, startTimeNano); assertTrue(ti.isStartEpochTimeMilliKnown()); assertTrue(ti.getStartTimeNano() > startTimeNano); assertTrue(ti.getStartEpochTimeMilli() == startTimeMilli); assertTrue(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() < endTimeNano); long end_epoch_time = startTimeMilli + TimeUnit.NANOSECONDS.toMillis(startTimeNano - endTimeNano); assertTrue(ti.getEndEpochTimeMilli() == end_epoch_time); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); double double_diff = TimeUnit.NANOSECONDS.toMicros(startTimeNano - endTimeNano) / 1000.0; assertTrue(ti.getTimeTakenMillis() == double_diff); long long_diff = TimeUnit.NANOSECONDS.toMillis(startTimeNano - endTimeNano); assertTrue(ti.getElapsedTimeMillis() == long_diff); }
@Test public void absurdTimingWithNoClock() throws InterruptedException { final long startTimeNano = System.nanoTime(); Thread.sleep(1);// sleep for 1 millisecond final long endTimeNano = System.nanoTime(); // absurdly swap the start/end times TimingInfo ti = TimingInfo.newTimingInfoFullSupport(endTimeNano, startTimeNano); assertFalse(ti.isStartEpochTimeMilliKnown()); assertTrue(ti.getStartTimeNano() > startTimeNano); assertTrue(ti.getStartEpochTimeMilli() == UNKNOWN); assertTrue(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() < endTimeNano); assertTrue(ti.getEndEpochTimeMilli() == UNKNOWN); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); double double_diff = TimeUnit.NANOSECONDS.toMicros(startTimeNano - endTimeNano) / 1000.0; assertTrue(ti.getTimeTakenMillis() == double_diff); long long_diff = TimeUnit.NANOSECONDS.toMillis(startTimeNano - endTimeNano); assertTrue(ti.getElapsedTimeMillis() == long_diff); }
@Test public void newTimingWithClockTime() throws InterruptedException { final long startTimeMilli = System.currentTimeMillis(); final long startTimeNano = System.nanoTime(); Thread.sleep(1);// sleep for 1 millisecond final long endTimeNano = System.nanoTime(); TimingInfo ti = TimingInfo.newTimingInfoFullSupport(startTimeMilli, startTimeNano, endTimeNano); assertTrue(ti.isStartEpochTimeMilliKnown()); assertTrue(ti.getStartTimeNano() == startTimeNano); assertTrue(ti.getStartEpochTimeMilli() == startTimeMilli); assertTrue(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() > startTimeNano); assertTrue(ti.getEndEpochTimeMilli() >= startTimeMilli); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); assertTrue(ti.getTimeTakenMillis() >= 0); assertTrue(ti.getElapsedTimeMillis() >= 0); }
@Test public void newTimingWithNoClockTime() throws InterruptedException { final long startTimeNano = System.nanoTime(); Thread.sleep(1);// sleep for 1 millisecond final long endTimeNano = System.nanoTime(); TimingInfo ti = TimingInfo.newTimingInfoFullSupport(startTimeNano, endTimeNano); assertFalse(ti.isStartEpochTimeMilliKnown()); assertTrue(ti.getStartTimeNano() == startTimeNano); assertTrue(ti.getStartEpochTimeMilli() == UNKNOWN); assertTrue(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() > startTimeNano); assertTrue(ti.getEndEpochTimeMilli() == UNKNOWN); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); assertTrue(ti.getTimeTakenMillis() >= 0); assertTrue(ti.getElapsedTimeMillis() >= 0); }
@Test public void startEndTiming() { // Start timing final long startTimeNano = System.nanoTime(); final long startTimeMilli = System.currentTimeMillis(); TimingInfo[] tis = { TimingInfo.startTimingFullSupport(), TimingInfo.startTiming() }; for (TimingInfo ti : tis) { assertTrue(ti.isStartEpochTimeMilliKnown()); assertTrue(ti.getStartTimeNano() >= startTimeNano); assertTrue(ti.getStartEpochTimeMilli() >= startTimeMilli); // End time is not known assertFalse(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() == UNKNOWN); assertTrue(ti.getEndEpochTimeMilli() == UNKNOWN); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); assertTrue(ti.getTimeTakenMillis() == UNKNOWN); assertTrue(ti.getElapsedTimeMillis() == UNKNOWN); // End timing ti.endTiming(); assertTrue(ti.isEndTimeKnown()); assertTrue(ti.getEndTimeNano() >= startTimeNano); assertTrue(ti.getEndEpochTimeMilli() >= startTimeMilli); assertTrue(ti.getEndTime() == ti.getEndEpochTimeMilli()); assertTrue(ti.getTimeTakenMillis() >= 0); assertTrue(ti.getElapsedTimeMillis() >= 0); } }
/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartTimeNano(), event.getEndTimeNano())); }
/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName * - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn ("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartTimeNano(), event.getEndTimeNano())); }
/** * End an event which was previously started. Once ended, log how much time * the event took. It is illegal to end an Event that was not started. It is * good practice to endEvent in a finally block. See Also startEvent. * * @param eventName - The name of the event to start */ @Override public void endEvent(String eventName) { TimingInfo event = eventsBeingProfiled.get(eventName); /* Somebody tried to end an event that was not started. */ if (event == null) { LogFactory.getLog(getClass()).warn("Trying to end an event which was never started: " + eventName); return; } event.endTiming(); this.timingInfo.addSubMeasurement( eventName, TimingInfo.unmodifiableTimingInfo( event.getStartTimeNano(), event.getEndTimeNano())); }
@Override public void collectMetrics(Request<?> request, Response<?> response) { final AWSRequestMetrics metrics = request.getAWSRequestMetrics(); if (metrics.isEnabled()) { final Map<String, String> allTags = getAllTags(request); final TimingInfo timing = metrics.getTimingInfo(); for (Field counter : COUNTERS) { Optional.ofNullable(timing.getCounter(counter.name())) .filter(v -> v.longValue() > 0) .ifPresent(v -> registry.counter(metricId(counter, allTags)).increment(v.longValue())); } for (Field timer : TIMERS) { Optional.ofNullable(timing.getLastSubMeasurement(timer.name())) .filter(TimingInfo::isEndTimeKnown) .ifPresent(t -> registry.timer(metricId(timer, allTags)) .record(t.getEndTimeNano() - t.getStartTimeNano(), TimeUnit.NANOSECONDS)); } notEmpty(metrics.getProperty(Field.ThrottleException)).ifPresent(throttleExceptions -> { final Id throttling = metricId("throttling", allTags); throttleExceptions.forEach(ex -> registry.counter(throttling.withTag(TAG_THROTTLE_EXCEPTION, ex.getClass().getSimpleName())).increment()); }); } }
@Override public void collectMetrics(Request<?> request, Response<?> response) { final AWSRequestMetrics metrics = request.getAWSRequestMetrics(); if (metrics.isEnabled()) { final Map<String, String> allTags = getAllTags(request); final TimingInfo timing = metrics.getTimingInfo(); for (Field counter : COUNTERS) { Optional.ofNullable(timing.getCounter(counter.name())) .filter(v -> v.longValue() > 0) .ifPresent(v -> registry.counter(metricId(counter, allTags)).increment(v.longValue())); } for (Field timer : TIMERS) { Optional.ofNullable(timing.getLastSubMeasurement(timer.name())) .filter(TimingInfo::isEndTimeKnown) .ifPresent(t -> registry.timer(metricId(timer, allTags)) .record(t.getEndTimeNano() - t.getStartTimeNano(), TimeUnit.NANOSECONDS)); } notEmpty(metrics.getProperty(Field.ThrottleException)).ifPresent(throttleExceptions -> { final Id throttling = metricId("throttling", allTags); throttleExceptions.forEach(ex -> registry.counter(throttling.withTag(TAG_THROTTLE_EXCEPTION, ex.getClass().getSimpleName())).increment()); }); } }