前言git
为了保证应用的可靠运行,须要对系统创建完善的应用监控,实时获取应用信息和运行状态。在以前的文章里,咱们经过介绍MOF中的CaptureFramework框架和InterceptFramework框架,分别阐述了应用实时数据和画像数据的采集方法。github
然而仅仅采集是不够的,还须要对应用数据进行归集和处理,并提供相应的信息存储和查询能力。浏览器
在UAVStack中,应用数据的归集功能经过MA来实现。MA能够定时抓取MOF中的实时信息,自动发现Tomcat、MSCP、JavaSE中的信息,并经过数据分析得出监控信息,经过RocketMQ将归集后的数据发送到HM进行存储,并提供查询功能。缓存
MA架构服务器
在介绍应用数据归集以前,首先介绍监控代理程序MonitorAgent。架构
MonitorAgent是在应用外独立运行的MSCP程序,提供数据采集功能、节点容器控制功能以及应用数据归集功能。MonitorAgent的架构如图所示:框架
MonitorAgent具备如下特色:运维
MonitorAgent应用数据归集的启动过程以下:分布式
应用数据归集工具
MOF里的DataObserver提供了JMX和HTTP两种模式来暴露应用数据,供AppServerMonitorDetector进行采集。AppServerMonitorDetector的层次结构以下图所示:
AppServerMonitorDetector:定时任务,用于注册、管理Detector并定时运行。若是运行时性能损耗太高,AppServerMonitorDetector会进行自杀,而后注册并运行JVMLocalOSDetector和JVMContainerOSDetector。
OSDetector:用于自动发现JVM进程并指定DataCatchWorker归集进程的应用信息,包括JVMLocalOSDetector和JVMContainerOSDetector两种。
JVMLocalOSDetector:用于自动发现运行宿主机系统上的全部JVM进程。首先经过JVM工具扫描本地操做系统上全部JVM进程的信息,根据进程ID判断是否须要指定新的DataCatchWorker。
若是须要,则利用JVM systemProperties中的uav.engine.vendor字段判断当前应用类型,并利用JVM进程信息生成特定的JMXMonitorDataCatchWorker实例,将DataCatchWorker的JVMAccessURL字段设置为JMX_CONNECTOR_ADDRESS。MonitorDataCatchWorker能够利用JVMAccessURL以JMX的方式归集该JVM进程产生的实时数据。
JVMContainerOSDetector:用于自动发现容器(Docker)中的JVM进程。容器经过namespace对运行环境进行了隔离,所以Detector经过Http方式获取容器内部的JVM进程信息。JVMContainerOSDetector首先经过扫描找到全部安装了MOF的Docker进程,经过ping来判断容器是否包含JVM进程。
若是发现JVM进程,则再次经过Http请求JVM进程的SystemProperties信息,生成新的HttpMonitorDataCatchWorker实例,并与进程的url和UAV_MOF_ROOT拼接成JVMAccessURL。MonitorDataCatchWorker能够利用JVMAccessURL以Http方式对该JVM进程的应用数据进行归集。
MonitorDataCatchWorker:用于归集进程内的应用数据。DataCatchWorker会依据不一样的服务类型(AppServer、MSCP、JSE)以JMX或Http方式采集应用数据并进行处理。
以归集AppServer和MSCP应用信息的JMXAppServerMonitorDataCatchWorker为例,DataCatchWorker经过JMXConnector和jmxurl链接MOF上的MBeanServer,采集MOF暴露的MBean,建立MonitorDataFrame(MDF)和ProfileMonitorDataFrame(PMDF)用于存储MBean中的实时信息和画像信息,并利用MonitorDataProcessor计算实时信息的增量数据。归集到的应用信息在PublishHandler上经过RocketMQ发送给HM进行存储。
归集的画像数据包含如下信息:
归集的实时数据包含如下信息:
MDFListenServer的运行机制则较为简单,指定了IP与端口,以Http的形式接收第三方推送的MDF信息,将其发送到MonitorDataPublishHandler进行发送。
应用数据存储
HM包含画像数据服务和实时数据服务,负责消费并存储RocketMQ中的应用数据。HealthManager在启动时注册DataMessageHandler,负责处理MQ收到的信息。MonitorDataMessageHandler会将收到的实时数据存储到Redis中并设置过时时间,历史数据会经过Http方式存储于OpenTSDB中。
同时,实时数据服务还会将监控数据从新发送至RocketMQ中,该数据最终会被实时预警服务进一步消费,用以计算预警信息。ProfileDataMessageHandler会将收到的画像存储到Redis中,并开启定时任务,清理未定时更新的画像信息。历史画像数据过时后会以文档的形式经过MongoDBClient存储于MongoDB中。
整个应用信息采集和存储的流程如图所示:
应用数据的展现
HM对外暴露查询接口,支持对5分钟内的应用数据和历史应用数据进行查询。UAV APPHUB利用查询接口提供如下功能:
1.应用集群信息
经过上帝之眼→应用监控能够了解应用集群及集群下全部应用的相关信息。HM中的定时组件HealthManagerProfileDataLifeKeeper会定时检查应用实例画像数据的状态。
若是画像数据在指定时间内未更新,HM会将应用实例设置为濒死状态;若是超过指定时间两倍后画像数据仍未更新,HM会将应用实例设置为死亡状态;超过指定时间三倍后,HM会在缓存中清除该应用实例的画像信息并不予显示。
2.应用实例信息
应用能够分为JEE应用、MSCP应用和JSE应用。在应用集群中点击应用实例,能够获取实例的详细信息,包括:
应用实例性能:显示应用的实时数据。其中,
JEE应用和MSCP应用的实时数据包括:
JSE应用的实时数据包括:
应用实例组件(画像信息)包括:
3.组件实例信息
点击应用实例的组件,能够获取应用组件的详情信息。服务组件和客户端的指标包括访问计数、响应时间和错误计数。点击日志组件则进入应用日志搜索界面。
4.服务图谱
点击应用集群的详情按钮,能够查看应用实例的服务图谱。服务图谱不只能够可视化展现应用/服务之间的调用关系,描述服务与服务的静态拓扑和运行时特性的图谱;还可以对存在问题的服务或调用关系进行标注。
在服务图谱中点击各组件,能够得到组件的实例信息。点击组件之间相连的调用关系,能够得到应用服务做为客户端对URL的调用情况,服务图谱会针对存在问题的组件或调用关系(如响应时间过长)进行提示。
5.时空沙盘
经过上帝之眼→时空沙盘能够查询应用实例和容器组件的历史数据。
总结
UAVStack的应用数据归集功能已在宜信公司内部普遍使用,是具有较高可用性和可靠性的分布式服务。运维人员能够经过APPHUB获取应用画像数据和实时数据,了解应用运行情况,定位系统的运行问题,是保障系统可靠运行的强力助手。
UAVStack已在Github上开放源码,并提供了安装部署、架构说明和用户指南等双语文档,欢迎访问-给星-拉取~~~
扫一扫下方二维码,关注一个不会让你失望的公众号