Выполнения HystrixObservableCommand не отображаются в dashboard/hystrix.stream
проблема
Панель инструментов Hystrix показывает выполнение HystrixCommands
, но не из HystrixObservableCommand
, Нам нужно HystrixObservableCommand
, поскольку мы оборачиваем асинхронный HTTP-вызов. Приведенный ниже код показывает пример, который мы отслеживали на панели инструментов. Интеграционные тесты показывают, что вызов выполнен правильно, поток упоминает AsyncHttpCommand
, но никогда не отслеживает хиты.
void aMethod(A requestHeaders, B asyncContext, C message) {
// this is tracked
new DummyCommand().execute();
// this not
Observable<Response> observable = new AsyncHttpCommand(builder.setHeaders(requestHeaders), message).construct();
observable.subscribe(createObserver(asyncContext, message));
}
// we added and removed some properties without any change on the tracking
private final HystrixCommandProperties.Setter defaultProperties = HystrixCommandProperties.Setter()
.withExecutionIsolationSemaphoreMaxConcurrentRequests(400)
.withFallbackIsolationSemaphoreMaxConcurrentRequests(400)
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
.withExecutionTimeoutInMilliseconds(10000)
.withExecutionTimeoutEnabled(true)
.withFallbackEnabled(true)
.withCircuitBreakerEnabled(true)
.withCircuitBreakerErrorThresholdPercentage(50)
.withCircuitBreakerRequestVolumeThreshold(20)
.withCircuitBreakerSleepWindowInMilliseconds(5000)
.withCircuitBreakerForceOpen(false)
.withCircuitBreakerForceClosed(false);
private class DummyCommand extends HystrixCommand<String> {
protected DummyCommand() {
super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("default"))
.andCommandPropertiesDefaults(defaultProperties));
}
@Override
protected String run() throws Exception {
return "test";
}
}
private class AsyncHttpCommand extends HystrixObservableCommand<Response> {
private BoundRequestBuilder builder;
protected AsyncHttpCommand(final BoundRequestBuilder builder) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("default2"))
.andCommandPropertiesDefaults(defaultProperties));
this.builder = builder;
}
@Override
protected Observable<Response> construct() {
return Observable.from(builder.execute()).subscribeOn(Schedulers.io());
}
}
private Observer<? super Response> createObserver(final AsyncContext asyncContext, final SentRequestMessage message) {
return new Observer<Response>() {
@Override
public void onCompleted() {
// was never reached
}
@Override
public void onError(final Throwable throwable) {
// should not be reached, as fallback kicks in
}
@Override
public void onNext(final Response response) {
// omitted result handling ...
}
};
}
Hystrix.stream
web.xml
<servlet>
<description></description>
<display-name>HystrixMetricsStreamServlet</display-name>
<servlet-name>HystrixMetricsStreamServlet</servlet-name>
<servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HystrixMetricsStreamServlet</servlet-name>
<url-pattern>/hystrix.stream</url-pattern>
</servlet-mapping>
pom.xml
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
<version>1.4.10</version>
</dependency>
Вопрос
Я делаю что-то не так с AsyncHttpCommand
? Что необходимо изменить / добавить, чтобы поток Hystrix также отображал попадания этой команды.
1 ответ
Решение
Команды были правильными, но мы должны использовать observe()
вместо construct()
,
Observable<Response> observable = new AsyncHttpCommand(builder.setHeaders(requestHeaders), message)
.observe();
observable.subscribe(createObserver(asyncContext, message));