为什么需要监控,在哪些层次上监控,监控什么
监控是为复杂的分布式系统服务的,它收集跨不同的应用,不同的服务器的系统行为信息,可通过采样收集所需的性能指标,帮助分析性能问题,并在指标超过正常值时报警。
全链路监控
全链路监控的起源
全链路监控又名分布式监控系统,全链路追踪。
目前市面的全链路系统基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)来做的。
论文
全链路监控的思想
APM(Application Performance Management)的核心思想是什么? 在应用服务各节点相互调用的时候,从中记录并传递一个应用级别的标记,这个标记可以用来关联各个服务节点之间的关系。比如两个应用服务节点之间使用HTTP作为传输协议的话,那么这些标记就会被加入到HTTP头中。可见如何传递这些标记是与应用服务节点之间使用的通讯协议有关的,常用的协议就相对容易加入这些内容,一些按需定制的可能就相对困难些,这一点也直接决定了实现分布式追踪系统的难度。
它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,APM会感知应用间关系和服务间关系,并进行相应的指标统计。
如何衡量一个大规模集群的跟踪系统的优劣?
它应该满足低损耗、应用透明的、大范围部署这三个需求的。
全链路监控系统的功能
web应用过程:分析url调用过程中性能消耗原因,抓取超过阈值url的详细数据
数据库性能:支持多种数据库类型的监测,定位并追踪慢SQL语句问题
错误分析:记录错误发生时的详细信息,统计应用错误率,定位问题具体至代码行
外部API调用:可以监测所有服务端应用外部调用API的耗时,并进行汇总统计
线程剖析:可以实现生产环境下实时在线的线程剖析,可在运行时了解代码性能
NoSQL分析:实时监控Memcache, MongoDB,Redis等NoSQL数据库的性能问题
JVM性能:实时监控JVM运行状态,通过图表展示JVM内存分配情况、内存使用情况、垃圾收集信息、类加载数量、JVM 线程信息以及会话信息。
HTTP 会话:分析每个应用程序的 HTTP 会话数,包括:活跃、过期、拒绝的会话。
一个比较完整的全链路监控系统,通常会包括几个部分。
第一,数据埋点和采集。
第二,指标计算。
第三,指标存储、查询、展现。
第四,调用链的存储、查询、展现。
第五,告警、问题定位。
第六,自监控。
第七,治理。
全链路监控系统的解决方案
Pinpoint (开源)
Pinpoint is an open source APM (Application Performance Management) tool for large-scale distributed systems written in Java.
Pinpoint等相关工具的作用就是追踪每个请求的完整调用链路,收集调用链路上每个服务的性能数据对代码的零侵入,运用JavaAgent字节码增强技术,只需要加启动参数即可
* Pinpoint-Collector:收集各种性能数据
* Pinpoint-Agent:和自己运行的应用关联起来的探针
* Pinpoint-Web:将收集到的数据显示成WEB网页形式
* HBase Storage:收集到的数据存到HBase中
复制代码
SkyWalking (开源)
https://baijiahao.baidu.com/s?id=1585656128092617457&wfr=spider&for=pc
skywalaking总体架构分为三部分
skywalking-collector:链路数据归集器,数据可以落地ElasticSearch,单机也可以落地H2,不推荐,H2仅作为临时演示用
skywalking-web:web可视化平台,用来展示落地的数据
skywalking-agent:探针,用来收集和发送数据到归集器
Zipkin (开源)
https://www.cnblogs.com/zhongpan/p/7506930.html
官网:OpenZipkin · http://zipkin.io/
github地址:https://github.com/openzipkin/zipkin
这个是twitter开源出来的,也是参考Dapper的体系来做的。
Zipkin的java应用端是通过一个叫Brave的组件来实现对应用内部的性能分析数据采集。
Brave的github地址:https://github.com/openzipkin/brave
这个组件通过实现一系列的java拦截器,来做到对http/servlet请求、数据库访问的调用过程跟踪。
然后通过在spring之类的配置文件里加入这些拦截器,完成对java应用的性能数据采集。
CAT (开源)
github地址:https://github.com/dianping/cat
跟踪的手段,是要在代码里硬编码写一些“埋点”,也就是侵入式的。
这样做有利有弊,好处是可以在自己需要的地方加埋点,比较有针对性;坏处是必须改动现有系统,很多开发团队不愿意。
其他监控
普罗米修斯
https://www.cnblogs.com/Leo_wl/p/8143222.html
http://blog.csdn.net/j3T9Z7H/article/details/78139771
Prometheus(普罗米修斯)是一个名字非常酷的开源监控系统。它支持多维度的指标数据模型,服务端通过HTTP协议定时拉取数据后,通过灵活的查询语言,实现监控的目的。
Prometheus 可以从配置或者用服务发现,去调用各个应用的 metrics 接口,来采集数据,然后存储在硬盘中,而如果是基础应用比如数据库,负载均衡器等,可以在相关的服务中安装 Exporters 来提供 metrics 接口供 Prometheus 拉取。
采集到的数据有两个去向,一个是报警,另一个是可视化。
Zabbix
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
zabbix由2部分构成,zabbix server与可选组件zabbix agent。
zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。
Consul 和 Zookeeper
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置,内置了服务注册与发现,具有健康检查、Key/Value存储、多数据中心的功能。
健康检查
What is the Health Check
Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况、项目之间的连接情况等),还包括了应用程序对外部或者第三方依赖库的状态检测。
复制代码
Why use Health Check
现在我们的项目越来越多的从单体多层架构转换成多项目多层架构即现在流行的微服务架构。
原来我们的App把各个模块分层分项目处理,比如Users项目仅仅处理User的一些业务需求,但在整个项目使用的时候,我们仅仅需要引用其类库即可,不用担心项目与类库之间的不兼容问题,如果不兼容在编译期已经会有提示。但如今,业务规模越来越庞大的时候,我们单独把Users作为一个service来做,所有一切都在其内部处理,对于外部来说仅仅公开几个api即可,但与项目之间的连接就从单纯的物理引用关系转换成了网络调用关系。
当我们架构从单体架构到微服务架构的时候,我们会发现越来越多的引用从物理转向了网络,在原来我们不需要考虑之间是否调用成功,但现在我们必须考虑进去,网络因素、服务器因素、其他因素等都会影响各服务之间的调用,因此Health Check孕育而生,它在微服务架构中是举足轻重的。
复制代码
Health Check’s Feathure
Health Check的功能有哪些?在微服务架构中很简单,就是检查各services的运行状态是否正常。在微服务的架构中,所有的一切都是service,db is service,rabbitmq is service,auth is service, shoppingcart is server……我们的架构能够根据业务需求,横向的扩容,多个db,多个rabbitmq,多个auth,多个shoppingcart。我们总结下,微服务架构下的Health Check是通过网络检查各services是否正常运行,它的功能是:
复制代码
1、提供外部调用Health Check接口,反馈自身状态
2、检测相关service状态是否正常(比如db server,能否连接到db,能否打开数据库等)
3、UnHealthly时处理机制
参考资源:
http://bigbully.github.io/Dapper-translation/
http://iamlile.github.io/2017/10/06/apm/
http://www.360doc.com/content/18/0129/10/52429660_726071502.shtml