k8s中graphite_在Graphite中存储Hystrix的几个月历史指标

k8s中graphite

Hystrix的杀手级功能之一是低延迟,数据密集和美观的仪表板 :

hystrix仪表板

即使这只是Hystrix实际操作的副作用(断路器,线程池,超时等),它也往往是最令人印象深刻的功能。 为了使其工作,您必须包括hystrix-metrics-event-stream依赖项:

<dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-metrics-event-stream</artifactId><version>1.4.0-RC6</version>
</dependency>

并注册内置的servlet,例如在嵌入式Jetty中:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;//...Server server = new Server(8090);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
server.setHandler(context);
final HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet();
final ServletHolder holder = new ServletHolder(servlet);
context.addServlet(holder, "/hystrix.stream");
server.start();

当然,如果您已经有一个Web应用程序,则要简单得多。 这是Spring Boot中的一个示例:

@Bean
public ServletRegistrationBean servletRegistrationBean() {return new ServletRegistrationBean(new HystrixMetricsStreamServlet(), "/hystrix.stream");
}

从现在开始,您的应用程序将以JSON格式流式传输实时指标,可以使用开源仪表板轻松使用它,该仪表板几乎完全用JavaScript编写:

$ git clone git@github.com:Netflix/Hystrix.git
$ cd Hystrix
$ ./gradlew :hystrix-dashboard:jettyRun

几秒钟后,您可以浏览到localhost:7979并指向/hystrix.stream servlet。 假设您的应用程序是集群的,则很可能会将Turbine添加到聚会中。

如果您使用的是Hystrix,您已经了解了所有这些。 但是,我最常被问到的问题之一是: 为什么这些指标如此短期 ? 的确,如果您查看上面的仪表板,则指标的滑动窗口范围为10秒到1分钟。 如果您收到有关生产中某些事件的自动电子邮件通知,经历了短暂的缓慢运行或听到了客户的性能问题,则有关此事件的相关统计信息可能已经丢失–或随后被普遍不稳定所掩盖。

这实际上是设计使然–您不能同时拥有低延迟,近乎实时的统计数据以及持久的数据,即使不是几个月前也可以浏览数天。 但是您不需要两个用于短期指标和长期趋势的监视系统。 相反,您可以直接使用Hystrix指标提供Graphite 。 几乎没有代码,到处都是胶水。

将指标发布到Dropwizard指标

事实证明,所有构建块都可用并准备就绪,您只需连接它们即可。 Hystrix指标不仅限于发布servlet,还可以插入其他使用者,例如Dropwizard指标 :

<dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-codahale-metrics-publisher</artifactId><version>1.4.0-RC6</version><exclusions><exclusion><groupId>com.codahale.metrics</groupId><artifactId>metrics-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.dropwizard.metrics</groupId><artifactId>metrics-core</artifactId><version>3.1.0</version>
</dependency>

您必须显式连接这两个库,我使用Spring Boot进行编排,请注意, MetricRegistry 由Boot自动创建 :

@Bean
HystrixMetricsPublisher hystrixMetricsPublisher(MetricRegistry metricRegistry) {HystrixCodaHaleMetricsPublisher publisher = new HystrixCodaHaleMetricsPublisher(metricRegistry);HystrixPlugins.getInstance().registerMetricsPublisher(publisher);return publisher;
}

Hystrix发布到Dropwizard指标的那一刻,我们可以将这些指标重定向到SLF4J,JMX或Graphite!

石墨和格拉法纳

我们还需要一个依赖项:

<dependency><groupId>io.dropwizard.metrics</groupId><artifactId>metrics-graphite</artifactId><version>3.1.0</version>
</dependency>

这使metrics库可以将数据直接发布到Graphite,而又需要一点点胶水:

@Bean
public GraphiteReporter graphiteReporter(MetricRegistry metricRegistry) {final GraphiteReporter reporter = GraphiteReporter.forRegistry(metricRegistry).build(graphite());reporter.start(1, TimeUnit.SECONDS);return reporter;
}@Bean
GraphiteSender graphite() {return new Graphite(new InetSocketAddress("localhost", 2003));
}

显然,您想调整Graphite地址。 设置Graphite和Grafana很麻烦,幸运的是有一个Docker镜像 :

$ docker run -d \-p 8070:80 -p 2003:2003 -p 8125:8125/udp -p 8126:8126 \--name grafana-dashboard \choopooly/grafana_graphite

如果一切设置正确,请直接进入localhost:8070并使用一些仪表板。 这是我的:

藜

新的可能性

内置的Hystrix仪表板React灵敏且实用。 但是,拥有数天,数周甚至数月的统计信息可以提供很多可能性。 内置仪表板无法实现的功能选择,您可以使用Graphite / Grafana轻松设置:

  • 月的统计资料(显然),相比秒
  • 标准仪表板中忽略的指标,例如较低的百分位数,总计数器等。
  • 某些指标的完整历史记录,而不是即时值(例如,线程池利用率)
  • 能够在单个图表上比较看似无关的指标,例如,几个不同的命令延迟与线程池队列大小的比较-全部具有完整的历史记录
  • 深入研究–查看几周或放大到几分钟

示例可以在前面的屏幕截图中找到。 这完全取决于您的用例,但除非您的系统着火了,否则可以在事件发生几小时或几周后检查的长期统计信息可能比内置仪表板有用。

* Hystrix指标发布者中有一个小错误 ,将在1.4.0-RC7中修复
**上述功能可在我们的微红外开源项目中直接使用

翻译自: https://www.javacodegeeks.com/2015/02/storing-months-historical-metrics-hystrix-graphite.html

k8s中graphite

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的“三字母词”坑了工程师

某软件工程师接盘了前同事的项目&#xff0c;进度一拖再拖&#xff0c;最后发现问题出现在如下代码&#xff1a;// 注释语句 ??/2a b c;请注意代码中的“??/”&#xff0c;就是这注释隐藏的很深&#xff0c;让项目一拖再拖。"??/"会被编译器当作 /&#xff0c…

C 线程的使用~(下)

2.3 detach()detach() 函数的作用是进行线程分离&#xff0c;分离主线程和创建出的子线程。在线程分离之后&#xff0c;主线程退出也会一并销毁创建出的所有子线程&#xff0c;在主线程退出之前&#xff0c;它可以脱离主线程继续独立的运行&#xff0c;任务执行完毕之后&#x…

用c语言编写爱心的代码是什么

用c语言编写爱心的代码&#xff1a;输入完整代码如下&#xff1a;#include int main(void){float a,x,y;for(y1.5f; y>-1.5f; y-0.1f){for(x-1.5f; x<1.5f; x 0.05f){a x*x y*y-1;char ch a*a*a-x*x*y*y*y<0.0f?*: ; putchar(ch); }printf("\n");}retur…

c++ lambda 重载_您会后悔对Lambdas应用重载!

c lambda 重载编写好的API很难。 非常辛苦。 如果您希望用户喜欢您的API&#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡&#xff1a; 用处 易用性 向后兼容 前向兼容性 之前&#xff0c;在我们的文章&#xff1a; 如何设计良好的常规API中&#xf…

7个华为关于C语言的经典面试题

1、找错void test1(){ char string[10]; char* str1"0123456789"; strcpy(string, str1);}这里string数组越界&#xff0c;因为字符串长度为10&#xff0c;还有一个结束符’\0’。所以总共有11个字符长度。string数组大小为10&#xff0c;这里越界了。PS&am…

linux数组操作 增删改查,linuxea:go数组与数组增删改查(19)

复合数据类型是集合类&#xff0c;并且可以存储多个单值。在golang中存储的数组是相同的数据类型&#xff0c;并且长度也是其中的一个属性。在go中&#xff0c;数组的长度一旦定义&#xff0c;就不可变。如果声明了长度的变量&#xff0c;只能赋值相同的长度的数组数组是具有相…

C语言的特点与创建的基本步骤是什么

C语言的特点与创建的基本步骤是&#xff1a;C 语言特点&#xff1a;1.C语言是一种成功的系统描述语言&#xff0c;用C语言开发的UNIX操作系统就是一个成功的范例;2.同时C语言又是一种通用的程序设计语言&#xff0c;在国际上广泛流行。世界上很多著名的计算公司都成功的开发了不…

谷歌guava_Google Guava:您永远不会知道的5件事

谷歌guava每个开发人员可以使用哪些鲜为人知的Google Guava功能&#xff1f; 它是那里最受欢迎的库之一&#xff0c;它是开源的&#xff0c;您可能已经知道了&#xff0c;它来自人们玩Quidditch作为一项真正的运动的地方&#xff08;至少在The Internship上 &#xff09;。 它…

C语言strcmp函数用法

C语言strcmp函数用法strcmp函数语法为“int strcmp(char *str1,char *str2)”&#xff0c;其作用是比较字符串str1和str2是否相同&#xff0c;如果相同则返回0&#xff0c;如果不同&#xff0c;前者大于后者则返回1&#xff0c;否则返回-1。简单示例&#xff1a;char a[]"…

Linux C 服务器端这条线怎么走?

在校学生的编程语言和数据结构的基础还不错&#xff0c;我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫&#xff0c;然后才去读编程方面的 APUE、UNP 等书。下面简单谈谈我对学习这两门课的看法和建议&#xff0c;都是站在服务端程序员的角度&#xff0c;从实用…

tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息

tp3 默认模块 默认方法因此&#xff0c;默认方法是……昨天的新闻&#xff0c;对不对&#xff1f; 是的&#xff0c;但是使用了一年之后&#xff0c;积累了很多事实&#xff0c;我想将这些事实收集在一个地方&#xff0c;供刚开始使用它们的开发人员使用。 甚至有经验的人都可以…

存储过程 锁定并发_Java并发教程–锁定:显式锁定

存储过程 锁定并发1.简介 在许多情况下&#xff0c;使用隐式锁定就足够了。 有时&#xff0c;我们将需要更复杂的功能。 在这种情况下&#xff0c; java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时&#xff0c;这些锁的内部机制与隐式锁相同。 区别在于…

C语言 PK 各大编程语言

今天分享一篇关于C语言为何如此有魅力的文章&#xff0c;如果你还在学习哪门语言的路口抉择&#xff0c;建议可以认真看看~以下为CSDN译文&#xff1a;没有什么技术可以应用长达50年之久&#xff0c;除非它真的比大多数其他东西都要好用——对于一种计算机行业的技术来说尤其如…

在switch语句中,case后的标号只能是什么?

switch语句用于基于不同条件执行不同动作。语法格式&#xff1a;switch (变量表达式){case 常量1: 语句;break;case 常量2: 语句;break;case 常量3: 语句;break;...case 常量n: 语句;break;default: 语句;break;}switch语句是一个条件选择语句&#xff0c;找到相同的…

C语言——结构体链表,附完整示例

引用自身的结构体&#xff0c;一个结构体中有一个或多个成员的基类型就是本结构体类型时&#xff0c;说明这个结构体可以引用自己&#xff0c;所以称作引用自身的结构体。例如下面的结构体&#xff1a;struct link{ char ch; struct link *p} a;p是一个可以指向struct link类型…

jax-rs jax-ws_快速浏览JAX-RS请求与方法匹配

jax-rs jax-ws在本文中&#xff0c;我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常&#xff0c;使用JAX-RS API的开发人员不会接触&#xff08;或真正不需要知道&#xff09; 匹配过程的细节&#xff0c;请放心&#xff0c;由于我们的RES…

C语言知识总结——宏,枚举

1、define宏定义以#号开头的都是编译预处理指令&#xff0c;它们不是C语言的成分&#xff0c;但是C程序离不开它们&#xff0c;#define用来定义一个宏&#xff0c;程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时&#xff0c;常量表中并没有用define定义的…

C语言知识总结——共用体

union 共用体&#xff08;联合体&#xff09;在进行某些算法的C语言编程的时候&#xff0c;需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术&#xff0c;几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构&#xff0c;在C语言中 以关键字union…

jboss入门_JBoss Forge NetBeans集成–入门

jboss入门JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此&#xff0c;它已经具有了令人敬畏的功能&#xff0c;使您作为开发人员的生活更加轻松。 在大多数情况下&#xff0c;使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多方法可以开始使用Forge基础知识…

这几道 C/C 题涉及你的知识盲区?

8个C语言面试题&#xff0c;涉及指针、运算、函数、内存&#xff0c;看看你能做出几个&#xff01;1.gets()函数问&#xff1a;请找出下面代码里的问题&#xff1a;#include int main(void) {char buff[10];memset(buff, 0, sizeof(buff));gets(buff); //gets不检查输入的字符…