为了保证应用的可靠运行,需要对系统建立完善的应用监控,实时获取应用信息和运行状态。在之前的文章里,我们通过介绍MOF中的CaptureFramework框架和InterceptFramework框架,分别阐述了应用实时数据和画像数据的采集方法。
然而仅仅采集是不够的,还需要对应用数据进行归集和处理,并提供相应的信息存储和查询能力。
在UAVStack中,应用数据的归集功能通过MA来实现。MA可以定时抓取MOF中的实时信息,自动发现Tomcat、MSCP、JavaSE中的信息,并通过数据分析得出监控信息,通过RocketMQ将归集后的数据发送到HM进行存储,并提供查询功能。
在介绍应用数据归集之前,首先介绍监控代理程序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上开放源码,并提供了安装部署、架构说明和用户指南等双语文档,欢迎访问-给星-拉取~~~
扫一扫下方二维码,关注一个不会让你失望的公众号