hystrix-metrics-event-stream主要提供了一些servlet,可以让用户通过http请求获取metrics信息。

HystrixSampleSseServlet

  继承了HttpServlet,不断从sampleStream中读取值并返回,直到sampleStream发送complete或出现异常。

 private void handleRequest(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
...
sampleSubscription = sampleStream
.observeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
logger.error("HystrixSampleSseServlet: ({}) received unexpected OnCompleted from sample stream", getClass().getSimpleName());
moreDataWillBeSent.set(false);
}
@Override
public void onError(Throwable e) {
moreDataWillBeSent.set(false);
}
@Override
public void onNext(String sampleDataAsString) {
if (sampleDataAsString != null) {
try {
writer.print("data: " + sampleDataAsString + "\n\n");
// explicitly check for client disconnect - PrintWriter does not throw exceptions
if (writer.checkError()) {
moreDataWillBeSent.set(false);
}
writer.flush();
} catch (Exception ex) {
moreDataWillBeSent.set(false);
}
}
}
}); while (moreDataWillBeSent.get() && !isDestroyed) {
try {
Thread.sleep(pausePollerThreadDelayInMs);
//in case stream has not started emitting yet, catch any clients which connect/disconnect before emits start
writer.print("ping: \n\n");
// explicitly check for client disconnect - PrintWriter does not throw exceptions
if (writer.checkError()) {
moreDataWillBeSent.set(false);
}
writer.flush();
} catch (Exception ex) {
moreDataWillBeSent.set(false);
}
}
}
} finally {
decrementCurrentConcurrentConnections();
if (sampleSubscription != null && !sampleSubscription.isUnsubscribed()) {
sampleSubscription.unsubscribe();
}
}
}

HystrixConfigSseServlet

  继承HystrixSampleSseServlet,读取HystrixConfigurationStream流数据。

public HystrixConfigSseServlet() {
this(HystrixConfigurationStream.getInstance().observe(), DEFAULT_PAUSE_POLLER_THREAD_DELAY_IN_MS);
} /* package-private */ HystrixConfigSseServlet(Observable<HystrixConfiguration> sampleStream, int pausePollerThreadDelayInMs) {
super(sampleStream.map(new Func1<HystrixConfiguration, String>() {
@Override
public String call(HystrixConfiguration hystrixConfiguration) {
return SerialHystrixConfiguration.toJsonString(hystrixConfiguration);
}
}), pausePollerThreadDelayInMs);
}

HystrixMetricsStreamServlet

  继承HystrixSampleSseServlet,读取HystrixDashboardStream流数据。

public HystrixMetricsStreamServlet() {
this(HystrixDashboardStream.getInstance().observe(), DEFAULT_PAUSE_POLLER_THREAD_DELAY_IN_MS);
} /* package-private */ HystrixMetricsStreamServlet(Observable<HystrixDashboardStream.DashboardData> sampleStream, int pausePollerThreadDelayInMs) {
super(sampleStream.concatMap(new Func1<HystrixDashboardStream.DashboardData, Observable<String>>() {
@Override
public Observable<String> call(HystrixDashboardStream.DashboardData dashboardData) {
return Observable.from(SerialHystrixDashboardData.toMultipleJsonStrings(dashboardData));
}
}), pausePollerThreadDelayInMs);
}

HystrixRequestEventsSseServlet

  继承HystrixSampleSseServlet,读取HystrixRequestEventsStream流数据。

public HystrixRequestEventsSseServlet() {
this(HystrixRequestEventsStream.getInstance().observe(), DEFAULT_PAUSE_POLLER_THREAD_DELAY_IN_MS);
} /* package-private */ HystrixRequestEventsSseServlet(Observable<HystrixRequestEvents> sampleStream, int pausePollerThreadDelayInMs) {
super(sampleStream.map(new Func1<HystrixRequestEvents, String>() {
@Override
public String call(HystrixRequestEvents requestEvents) {
return SerialHystrixRequestEvents.toJsonString(requestEvents);
}
}), pausePollerThreadDelayInMs);
}

HystrixUtilizationSseServlet

  继承HystrixSampleSseServlet,读取HystrixUtilizationStream流数据。

public HystrixUtilizationSseServlet() {
this(HystrixUtilizationStream.getInstance().observe(), DEFAULT_PAUSE_POLLER_THREAD_DELAY_IN_MS);
} /* package-private */ HystrixUtilizationSseServlet(Observable<HystrixUtilization> sampleStream, int pausePollerThreadDelayInMs) {
super(sampleStream.map(new Func1<HystrixUtilization, String>() {
@Override
public String call(HystrixUtilization hystrixUtilization) {
return SerialHystrixUtilization.toJsonString(hystrixUtilization);
}
}), pausePollerThreadDelayInMs);
}

使用hystrix-metrics-event-stream

  • 引入hystrix-metrics-event-stream-*.jar包
  • 添加web.xml配置
<servlet>
<description></description>
<display-name>HystrixUtilizationSseServlet</display-name>
<servlet-name>HystrixUtilizationSseServlet</servlet-name>
<servlet-class>com.netflix.hystrix.contrib.sample.stream.HystrixUtilizationSseServlet</servlet-class>
</servlet>
 <servlet-mapping>
<servlet-name>HystrixUtilizationSseServlet</servlet-name>
<url-pattern>/hystrix/utilization.stream</url-pattern>
</servlet-mapping>




最新文章

  1. C#中常用的读取xml的几种方法(转)
  2. 04 KVC|KVO|Delegate|NSNotification区别
  3. Android部分调试开关
  4. SQL防注入程序 v1.0
  5. Android ViewHolder的作用与用法
  6. 在点击HOME键时, 在点击icon回到原来的应用。
  7. java解析xml的4种经典方法
  8. hdu 1325 Is It A Tree?
  9. (一)SAPI简述
  10. logstash ArgumentError: comparison of String with 5 failed
  11. 文件下载Demo
  12. JSP page指令
  13. Java高并发缓存架构,缓存雪崩、缓存穿透之谜
  14. java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释
  15. MySQL往表里插入千条数据 存储过程
  16. LeetCode_1. Two Sum_Solution
  17. 【转载】 从ACM会议看中国大陆计算机科学与国外的差距
  18. sqlplus/rman登录报权限错误ORA-01031/ORA-04005/0RA-00554
  19. JMeter--使用URL回写来处理用户会话
  20. java.util.ConcurrentModificationException 多线程访问ArrayList引起

热门文章

  1. 目录扫描、Nmap
  2. Linux 查网关和dns命令
  3. I帧B帧P帧
  4. Jmeter 常用函数(11)- 详解 __TestPlanName
  5. golang 判断IPv4 or IPv6 address
  6. python中a, b = a, a + b这条语句是如何执行的?
  7. 常用sql语句整理
  8. Reliable Federated Learning for Mobile Networks
  9. 【转】python调用youtube-dl实现视频下载
  10. Python输入input、输出print