Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configuring hystrix command properties using application.yaml in Spring-Boot application

Tags:

I am having same issue, where i am trying to override the hystrix properties in application.yaml. When I run the app & check the properties with localhost:port/app-context/hystrix.stream, I get all default values instead.

here is the hystrix config in my application.yaml

hystrix:    command.StoreSubmission.execution.isolation.thread.timeoutInMilliseconds: 30000    command.StoreSubmission.circuitBreaker.requestVolumeThreshold: 4    command.StoreSubmission.circuitBreaker.sleepWindowInMilliseconds: 60000    command.StoreSubmission.metrics.rollingStats.timeInMilliseconds: 180000    collapser.StoreSubmission.maxRequestsInBatch: 1    collapser.StoreSubmission.requestCache.enabled: FALSE    threadpool.StoreSubmission.coreSize: 30    threadpool.StoreSubmission.metrics.rollingStats.timeInMilliseconds: 180000 

Here is what I see when I hit the url - localhost:port/app-context/hystrix.stream in browser [ this is same stream url used for hystrix dashboard ] -

data: {"type":"HystrixCommand","name":"storeSubmission","group":"StoreSubmission","currentTime":1435941064801,"isCircuitBreakerOpen":false,"errorPercentage":0,"errorCount":0,"requestCount":0,"rollingCountCollapsedRequests":0,"rollingCountExceptionsThrown":0,"rollingCountFailure":0,"rollingCountFallbackFailure":0,"rollingCountFallbackRejection":0,"rollingCountFallbackSuccess":0,"rollingCountResponsesFromCache":0,"rollingCountSemaphoreRejected":0,"rollingCountShortCircuited":0,"rollingCountSuccess":0,"rollingCountThreadPoolRejected":0,"rollingCountTimeout":0,"currentConcurrentExecutionCount":0,"latencyExecute_mean":0,"latencyExecute":{"0":0,"25":0,"50":0,"75":0,"90":0,"95":0,"99":0,"99.5":0,"100":0},"latencyTotal_mean":0,"latencyTotal":{"0":0,"25":0,"50":0,"75":0,"90":0,"95":0,"99":0,"99.5":0,"100":0},"propertyValue_circuitBreakerRequestVolumeThreshold":20,"propertyValue_circuitBreakerSleepWindowInMilliseconds":5000,"propertyValue_circuitBreakerErrorThresholdPercentage":50,"propertyValue_circuitBreakerForceOpen":false,"propertyValue_circuitBreakerForceClosed":false,"propertyValue_circuitBreakerEnabled":true,"propertyValue_executionIsolationStrategy":"THREAD","propertyValue_executionIsolationThreadTimeoutInMilliseconds":1000,"propertyValue_executionIsolationThreadInterruptOnTimeout":true,"propertyValue_executionIsolationThreadPoolKeyOverride":null,"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,"propertyValue_requestCacheEnabled":true,"propertyValue_requestLogEnabled":true,"reportingHosts":1}  data: {"type":"HystrixThreadPool","name":"StoreSubmission","currentTime":1435941064801,"currentActiveCount":0,"currentCompletedTaskCount":35,"currentCorePoolSize":30,"currentLargestPoolSize":30,"currentMaximumPoolSize":30,"currentPoolSize":30,"currentQueueSize":0,"currentTaskCount":35,"rollingCountThreadsExecuted":0,"rollingMaxActiveThreads":0,"propertyValue_queueSizeRejectionThreshold":5,"propertyValue_metricsRollingStatisticalWindowInMilliseconds":180000,"reportingHosts":1} 

The problem is with hystrix command & collapser properties, where as threadpool properties are set correctly. I have got following annotations in my @configuration class -

@EnableAutoConfiguration(exclude=MongoAutoConfiguration.class) @EnableHystrix @EnableHystrixDashboard 

Has someone tried configuring hystrix command properties using application.yaml in thier Spring-Boot application, can help please?

like image 463
Amrut Avatar asked Jul 03 '15 17:07

Amrut


People also ask

How do I use hystrix in spring boot?

First, we need to add the Spring Cloud Starter Hystrix dependency in our build configuration file. Now, add the @EnableHystrix annotation into your main Spring Boot application class file. The @EnableHystrix annotation is used to enable the Hystrix functionalities into your Spring Boot application.

What is group key and command key in Hystrix?

It is used to provide metadata/configuration to particular methods. To run method as Hystrix command synchronously you need to annotate method with @HystrixCommand annotation. By default the name of command key is command method name: doTest , default group key name is class name of annotated method: HystrixService.

How do I set hystrix timeout?

timeout=10000 , setting the default Hystrix command timeout to 10 seconds. It is even simpler with environment variables - thanks to relaxed binding, any of these will work ( export examples are for Linux): export service. timeout=10000.


1 Answers

The main problem was that, I was using groupKey value instead of commandKey value to define the properties. The wiki page for these configuration properties - https://github.com/Netflix/Hystrix/wiki/Configuration#intro says -

hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds 

Replace the HystrixCommandKey portion of the property with the value you set for commandkey.

hystrix.threadpool.HystrixThreadPoolKey.coreSize 

Replace the HystrixThreadPoolKey portion of the property with the value you set for threadPoolKey.

Here is how I define both commandKey & threadPoolKey over the method wrapped by HystrixCommand -

@HystrixCommand(groupKey = "StoreSubmission", commandKey = "StoreSubmission", threadPoolKey = "StoreSubmission") public String storeSubmission(ReturnType returnType, InputStream is, String id) { } 

You can actually define both command & threadpool properties on the method within @HystixCommand annotation.

@HystrixCommand(groupKey = "StoreSubmission", commandKey = "StoreSubmission", threadPoolKey = "StoreSubmission", commandProperties = {         @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "30000"),         @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "4"),         @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "60000"),         @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "180000") }, threadPoolProperties = {         @HystrixProperty(name = "coreSize", value = "30"),         @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "180000") }) public String storeSubmission(ReturnType returnType, InputStream is, String id) { } 

I guess the best way to define these properties is in externalized application.yaml, that way you can control it better & change them for different environments.

like image 174
Amrut Avatar answered Sep 18 '22 10:09

Amrut