From 66e1e1f066a66491a905050f70bb359063262f0d Mon Sep 17 00:00:00 2001 From: Matt Jacobs Date: Fri, 13 Feb 2015 13:36:58 -0800 Subject: [PATCH 1/2] Failing unit tests, demonstrating currentConcurrentExecutionCount going negative in short-circuit/semaphore-reject cases --- .../com/netflix/hystrix/AbstractCommand.java | 1 + .../hystrix/HystrixCommandMetricsTest.java | 37 ++++++ .../netflix/hystrix/HystrixCommandTest.java | 107 ++++++++++++++++++ .../hystrix/HystrixObservableCommandTest.java | 45 ++++++++ 4 files changed, 190 insertions(+) diff --git a/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java b/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java index a1c63c0f2..c37e4170f 100644 --- a/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java +++ b/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java @@ -638,6 +638,7 @@ public void call(Notification n) { }).doOnTerminate(new Action0() { @Override public void call() { + //if the command timed out, then we've reached this point in the calling thread //but the Hystrix thread is still doing work. Let it handle these markers. if (!isCommandTimedOut.get().equals(TimedOutStatus.TIMED_OUT)) { diff --git a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandMetricsTest.java b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandMetricsTest.java index 3bfaffb86..a7675fe75 100644 --- a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandMetricsTest.java +++ b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandMetricsTest.java @@ -90,6 +90,43 @@ public void testBadRequestsDoNotAffectErrorPercentage() { assertEquals(75, metrics.getHealthCounts().getErrorPercentage()); } + @Test + public void testCurrentConcurrentExecutionCount() { + class LatentCommand extends HystrixCommand { + + long duration; + + public LatentCommand(long duration) { + super(HystrixCommandGroupKey.Factory.asKey("Latent"), HystrixThreadPoolKey.Factory.asKey("Latent"), 1000); + this.duration = duration; + } + + @Override + protected Boolean run() throws Exception { + Thread.sleep(duration); + return true; + } + + @Override + protected Boolean getFallback() { + return false; + } + } + + HystrixCommandMetrics metrics = null; + + int NUM_CMDS = 8; + for (int i = 0; i < NUM_CMDS; i++) { + LatentCommand cmd = new LatentCommand(400); + if (metrics == null) { + metrics = cmd.metrics; + } + cmd.queue(); + } + + assertEquals(NUM_CMDS, metrics.getCurrentConcurrentExecutionCount()); + } + /** * Utility method for creating {@link HystrixCommandMetrics} for unit tests. */ diff --git a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java index 00270536a..0917d7564 100644 --- a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java +++ b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java @@ -123,6 +123,7 @@ public void testExecutionSuccess() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -162,6 +163,7 @@ public void testExecutionMultipleTimes() { e.printStackTrace(); // we want to get here } + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -203,6 +205,7 @@ public void testExecutionKnownFailureWithNoFallback() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -243,6 +246,7 @@ public void testExecutionUnknownFailureWithNoFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -279,6 +283,7 @@ public void testExecutionFailureWithFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -316,6 +321,7 @@ public void testExecutionFailureWithFallbackFailure() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -351,6 +357,7 @@ public void testQueueSuccess() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -394,6 +401,7 @@ public void testQueueKnownFailureWithNoFallback() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -435,6 +443,7 @@ public void testQueueUnknownFailureWithNoFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -470,6 +479,7 @@ public void testQueueFailureWithFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -510,6 +520,7 @@ public void testQueueFailureWithFallbackFailure() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -545,6 +556,7 @@ public void testObserveSuccess() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -720,6 +732,7 @@ public void testCircuitBreakerTripsAfterFailures() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -777,6 +790,7 @@ public void testCircuitBreakerTripsAfterFailuresViaQueue() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } catch (Exception e) { @@ -849,6 +863,7 @@ public void testCircuitBreakerAcrossMultipleCommandsButSameCircuitBreaker() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -913,6 +928,8 @@ public void testCircuitBreakerAcrossMultipleCommandsAndDifferentDependency() { assertEquals(0, circuitBreaker_one.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker_one.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker_one.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); @@ -928,6 +945,8 @@ public void testCircuitBreakerAcrossMultipleCommandsAndDifferentDependency() { assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker_two.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker_two.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -960,6 +979,8 @@ public void testExecutionSuccessWithCircuitBreakerDisabled() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1007,6 +1028,8 @@ public void testExecutionTimeoutWithNoFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1042,6 +1065,8 @@ public void testExecutionTimeoutWithFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1083,6 +1108,8 @@ public void testExecutionTimeoutFallbackFailure() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1129,6 +1156,8 @@ public void testCircuitBreakerOnExecutionTimeout() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1180,6 +1209,8 @@ public void testCountersOnExecutionTimeout() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1227,6 +1258,8 @@ public void testQueuedExecutionTimeoutWithNoFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1261,6 +1294,8 @@ public void testQueuedExecutionTimeoutWithFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1304,6 +1339,8 @@ public void testQueuedExecutionTimeoutFallbackFailure() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1351,6 +1388,8 @@ public void testObservedExecutionTimeoutWithNoFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1385,6 +1424,8 @@ public void testObservedExecutionTimeoutWithFallback() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1428,6 +1469,8 @@ public void testObservedExecutionTimeoutFallbackFailure() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1476,6 +1519,8 @@ public void testShortCircuitFallbackCounter() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1557,6 +1602,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(50, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1617,6 +1664,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1678,6 +1727,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1753,6 +1804,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1818,6 +1871,8 @@ public void testTimedOutCommandDoesNotExecute() { assertEquals(0, s1.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, s1.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, s1.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(0, s2.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(1, s2.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); @@ -1833,6 +1888,8 @@ public void testTimedOutCommandDoesNotExecute() { assertEquals(0, s2.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, s2.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, s2.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1895,6 +1952,8 @@ public void testFallbackSemaphore() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1964,6 +2023,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2042,6 +2103,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2104,6 +2167,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + System.out.println("**** DONE"); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2170,6 +2235,8 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); + System.out.println("**** DONE"); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2275,6 +2342,7 @@ public void run() { // verifies that some executions failed assertEquals("expected some of shared semaphore commands to get rejected", sharedSemaphore.numberOfPermits.get().longValue(), failureCount.get()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -2385,6 +2453,7 @@ public void testRequestCache1() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2438,6 +2507,7 @@ public void testRequestCache2() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2500,6 +2570,7 @@ public void testRequestCache3() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2568,6 +2639,7 @@ public void testRequestCacheWithSlowExecution() { assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2630,6 +2702,7 @@ public void testNoRequestCache3() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2694,6 +2767,7 @@ public void testRequestCacheViaQueueSemaphore1() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2754,6 +2828,7 @@ public void testNoRequestCacheViaQueueSemaphore1() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2810,6 +2885,7 @@ public void testRequestCacheViaExecuteSemaphore1() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2866,6 +2942,7 @@ public void testNoRequestCacheViaExecuteSemaphore1() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2932,6 +3009,7 @@ public void testNoRequestCacheOnTimeoutThrowsException() throws Exception { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2971,6 +3049,7 @@ public void testRequestCacheOnTimeoutCausesNullPointerException() throws Excepti assertEquals(4, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(5, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -3055,6 +3134,7 @@ public void testRequestCacheOnTimeoutThrowsException() throws Exception { assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -3125,6 +3205,7 @@ public void testRequestCacheOnThreadRejectionThrowsException() throws Exception assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -3200,6 +3281,8 @@ public void testBadRequestExceptionViaExecuteInThread() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3227,6 +3310,8 @@ public void testBadRequestExceptionViaQueueInThread() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3262,6 +3347,8 @@ public void testBadRequestExceptionViaQueueInThreadOnResponseFromCache() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3285,6 +3372,8 @@ public void testBadRequestExceptionViaExecuteInSemaphore() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3312,6 +3401,8 @@ public void testBadRequestExceptionViaQueueInSemaphore() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3337,6 +3428,8 @@ public void testCheckedExceptionViaExecute() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3390,6 +3483,8 @@ public void onNext(Boolean args) { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3418,6 +3513,8 @@ public void testErrorThrownViaExecute() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3447,6 +3544,8 @@ public void testErrorThrownViaQueue() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -3502,6 +3601,8 @@ public void onNext(Boolean args) { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } @Test @@ -3525,6 +3626,8 @@ public void run() { assertTrue(cmd.isExecutionComplete()); assertTrue(cmd.isResponseTimedOut()); + + assertEquals(0, cmd.metrics.getCurrentConcurrentExecutionCount()); } @@ -5190,6 +5293,7 @@ public void testExecutionFailureWithFallbackImplementedButDisabled() { assertEquals(0, commandDisabled.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, commandDisabled.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, commandDisabled.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -5285,6 +5389,7 @@ public void call(Throwable t1) { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -5307,6 +5412,8 @@ public void testExceptionConvertedToBadRequestExceptionInExecutionHookBypassesCi assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } @Test diff --git a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixObservableCommandTest.java b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixObservableCommandTest.java index b692a330b..2c1a534c5 100644 --- a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixObservableCommandTest.java +++ b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixObservableCommandTest.java @@ -175,6 +175,7 @@ private void testObserveSuccess(ExecutionIsolationStrategy isolationStrategy) { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(2, command.getExecutionEvents().size()); @@ -237,6 +238,8 @@ private void testObserveMultipleTimes(ExecutionIsolationStrategy isolationStrate assertEquals(2, command.getExecutionEvents().size()); assertTrue(command.getExecutionEvents().contains(HystrixEventType.EMIT)); assertTrue(command.getExecutionEvents().contains(HystrixEventType.SUCCESS)); + + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -306,6 +309,7 @@ private void testObserveKnownFailureWithNoFallback(ExecutionIsolationStrategy is assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(1, command.getExecutionEvents().size()); @@ -378,6 +382,7 @@ private void testObserveUnknownFailureWithNoFallback(ExecutionIsolationStrategy assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(1, command.getExecutionEvents().size()); @@ -446,6 +451,7 @@ private void testObserveFailureWithFallback(ExecutionIsolationStrategy isolation assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(3, command.getExecutionEvents().size()); @@ -550,6 +556,7 @@ private void testObserveFailureWithFallbackFailure(ExecutionIsolationStrategy is assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(2, command.getExecutionEvents().size()); @@ -627,6 +634,7 @@ private void testObserveFailureWithTimeoutAndFallback(ExecutionIsolationStrategy assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); assertEquals(3, command.getExecutionEvents().size()); @@ -700,6 +708,7 @@ public void onNext(Boolean args) { assertFalse(command.isExecutedInThread()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertFalse(command.isResponseFromFallback()); } @@ -755,6 +764,7 @@ public void testCircuitBreakerTripsAfterFailures() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -822,6 +832,7 @@ public void testCircuitBreakerAcrossMultipleCommandsButSameCircuitBreaker() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -885,6 +896,7 @@ public void testCircuitBreakerAcrossMultipleCommandsAndDifferentDependency() { assertEquals(0, circuitBreaker_one.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker_one.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker_one.metrics.getCurrentConcurrentExecutionCount()); assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); @@ -899,6 +911,7 @@ public void testCircuitBreakerAcrossMultipleCommandsAndDifferentDependency() { assertEquals(0, circuitBreaker_two.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker_two.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker_two.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -930,6 +943,7 @@ public void testExecutionSuccessWithCircuitBreakerDisabled() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -976,6 +990,7 @@ public void testExecutionTimeoutWithNoFallbackUsingSemaphoreIsolation() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1013,6 +1028,7 @@ public void testExecutionTimeoutWithFallbackUsingSemaphoreIsolation() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1057,6 +1073,7 @@ public void testExecutionTimeoutFallbackFailureUsingSemaphoreIsolation() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1118,6 +1135,7 @@ private void testExecutionTimeoutWithNoFallback(ExecutionIsolationStrategy isola assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1166,6 +1184,7 @@ private void testExecutionTimeoutWithSuccessfulFallback(ExecutionIsolationStrate assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1235,6 +1254,7 @@ private void testExecutionTimeoutFallbackFailure(ExecutionIsolationStrategy isol assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1282,6 +1302,7 @@ public void testCircuitBreakerOnExecutionTimeout() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1335,6 +1356,7 @@ public void testCountersOnExecutionTimeout() { assertEquals(0, command.builder.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, command.builder.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, command.builder.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -1387,6 +1409,7 @@ public void testShortCircuitFallbackCounter() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1455,6 +1478,7 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.THREAD_POOL_REJECTED)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1532,6 +1556,7 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.THREAD_POOL_REJECTED)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1593,6 +1618,7 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.THREAD_POOL_REJECTED)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.TIMEOUT)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); System.out.println("**** DONE"); @@ -1700,6 +1726,7 @@ public void run() { // verifies that some executions failed assertEquals("expected some of shared semaphore commands to get rejected", sharedSemaphore.numberOfPermits.get().longValue(), failureCount.get()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); } /** @@ -1824,6 +1851,7 @@ public void testRequestCache1UsingThreadIsolation() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1878,6 +1906,7 @@ public void testRequestCache2UsingThreadIsolation() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1943,6 +1972,7 @@ public void testRequestCache3UsingThreadIsolation() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); System.out.println("executedCommand: " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2013,6 +2043,7 @@ public void testRequestCacheWithSlowExecution() { assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2081,6 +2112,7 @@ public void testNoRequestCache3UsingThreadIsolation() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2153,6 +2185,7 @@ public void testRequestCacheViaQueueUsingSemaphoreIsolation() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2220,6 +2253,7 @@ public void testNoRequestCacheViaQueueUsingSemaphoreIsolation() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2282,6 +2316,7 @@ public void testRequestCacheViaExecuteUsingSemaphoreIsolation() { assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2345,6 +2380,7 @@ public void testNoRequestCacheViaExecuteUsingSemaphoreIsolation() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(0, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(3, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2415,6 +2451,7 @@ public void testNoRequestCacheOnTimeoutThrowsException() throws Exception { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2453,6 +2490,7 @@ public void testRequestCacheOnTimeoutCausesNullPointerException() throws Excepti assertEquals(4, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(5, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); @@ -2536,6 +2574,7 @@ public void testRequestCacheOnTimeoutThrowsException() throws Exception { assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2605,6 +2644,7 @@ public void testRequestCacheOnThreadRejectionThrowsException() throws Exception assertEquals(3, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(4, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2726,6 +2766,7 @@ private void testBadRequestExceptionObserve(ExecutionIsolationStrategy isolation assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2790,6 +2831,7 @@ private void testBadRequestExceptionOnResponseFromCache(ExecutionIsolationStrate assertEquals(2, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(2, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.BAD_REQUEST)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2816,6 +2858,7 @@ public void testCheckedExceptionViaExecute() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -2870,6 +2913,7 @@ public void onNext(Boolean args) { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); // semaphore isolated assertFalse(command.isExecutedInThread()); @@ -2929,6 +2973,7 @@ public void onNext(Boolean args) { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.SUCCESS)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.FAILURE)); assertEquals(1, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.EXCEPTION_THROWN)); + assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); // semaphore isolated assertFalse(command.isExecutedInThread()); From 8fa5106b0dab52c7ddf1fba36695dd6013ba4d4d Mon Sep 17 00:00:00 2001 From: Matt Jacobs Date: Fri, 13 Feb 2015 13:50:49 -0800 Subject: [PATCH 2/2] Move invocation of the increment of concurrent count to the proper spot in the toObservable() flow --- .../src/main/java/com/netflix/hystrix/AbstractCommand.java | 4 +--- .../test/java/com/netflix/hystrix/HystrixCommandTest.java | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java b/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java index c37e4170f..a65305fab 100644 --- a/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java +++ b/hystrix-core/src/main/java/com/netflix/hystrix/AbstractCommand.java @@ -370,6 +370,7 @@ final public Observable toObservable() { public void call(Subscriber observer) { // async record keeping recordExecutedCommand(); + metrics.incrementConcurrentExecutionCount(); // mark that we're starting execution on the ExecutionHook executionHook.onStart(_this); @@ -497,8 +498,6 @@ public void call() { */ private Observable getRunObservableDecoratedForMetricsAndErrorHandling() { final AbstractCommand _self = this; - // allow tracking how many concurrent commands are executing - metrics.incrementConcurrentExecutionCount(); final HystrixRequestContext currentRequestContext = HystrixRequestContext.getContextForCurrentThread(); @@ -638,7 +637,6 @@ public void call(Notification n) { }).doOnTerminate(new Action0() { @Override public void call() { - //if the command timed out, then we've reached this point in the calling thread //but the Hystrix thread is still doing work. Let it handle these markers. if (!isCommandTimedOut.get().equals(TimedOutStatus.TIMED_OUT)) { diff --git a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java index 0917d7564..49553fe14 100644 --- a/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java +++ b/hystrix-core/src/test/java/com/netflix/hystrix/HystrixCommandTest.java @@ -1664,8 +1664,7 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); - assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); - + assertEquals(1, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); //pool-filler still going assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); } @@ -1727,8 +1726,7 @@ public void run() { assertEquals(0, circuitBreaker.metrics.getRollingCount(HystrixRollingNumberEvent.RESPONSE_FROM_CACHE)); assertEquals(100, circuitBreaker.metrics.getHealthCounts().getErrorPercentage()); - assertEquals(0, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); - + assertEquals(1, circuitBreaker.metrics.getCurrentConcurrentExecutionCount()); //pool-filler still going assertEquals(2, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size()); }