原文网址链接:http://url.cn/kVjUVO
众所周知,系统监控一直是拥有复杂IT架构的企业所面临的一个重要问题,而这也并不是每家企业都能够轻松解决的技术挑战。OPPO作为一家国际智能终端设备及移动互联网服务供应商,推出过多款外观精细、功能可靠的智能手机产品,其品牌知名度也一直名列前茅。但实际上OPPO公司与其他快速发展的现代企业一样面临着自己的IT挑战,而更加鲜为人知的,则是其品牌背后同样出色的IT团队与信息化支持能力。
OPPO后端系统规模近几年快速发展,系统重构以后采用了服务化的架构,各系统之间耦合降低,开发效率得到了很大的提升。然而在服务化带来了好处的同时,难于监控的问题也一并出现。由于服务之间调用关系错综复杂,接口出现问题,多个系统报错,因此很难定位真正的故障源头。整个请求调用链就像一个黑盒子,无法跟踪请求的整个调用路径,发现性能瓶颈点。
为了解决这些问题,OPPO公司自行开发了一套监控系统,并结合第三方监控系统,形成了从App请求开始到后端处理过程的完整监控体系。OPPO监控系统的简称为OMP(OPPO Monitor Platform),历时半年开发,分为两期上线,现在已全面接入OPPO线上项目。
三大理由决定自主研发
之所以选择自主研发监控系统,主要是考虑到三方面的原因:定制化需求、易用性、以及开发成本低。
首先,在对比之后发现现有的开源监控软件无法满足OPPO 的需求。对于监控系统来说最核心的一条需求,就是要能够监控每个App请求的完整调用链,从App发起请求,到后端的负载均衡接入、API Server、微服务调用、缓存、消息队列、数据库访问时间等。系统架构微服务化以后,服务跟踪和服务调用链监控尤为重要,否则系统故障及性能瓶颈就很难排查了。
为了打通用户请求的完整调用链,需要在API框架、RPC框架、缓存操作、数据库操作、队列消费等代码埋点,以及高性能处理和存储系统,而目前的开源软件无法满足需求,各大公司也因此才开发了自己的监控平台。由于服务调用跟踪功能跟开发框架深度关联,各公司选用的框架并不相同,所以业界鲜有类似开源的产品。
第二个原因是考虑到权限及一体化管理界面的需求。监控平台不仅仅面向运维人员,开发人员、运营人员、测试人员也需要经常使用。例如根据监控平台采集到JVM Young GC/Full GC次数及时间、耗时Top 10线程堆栈等信息,经常查看监控平台,开发、测试人员便可以评估代码质量,排除隐患。
监控平台面向用户众多,安全性及权限管理要求较高,同时需要一体化的管理界面,简洁易用,而组合多个开源软件,权限和管理便捷性很难满足需求。
第三,监控系统的开发难度比较低。自行研发的监控平台虽有千般好处,但是如果开发的难度太大,以至于无法持续的投入,那也是没有意义的。基于Sigar、kafka、Flume、HBase、Netty等技术,开发高性能、可伸缩的系统难度实际上并不大,需要投入的资源不需要很多。
六项目标内容实现线上应用全面监控
OMP的最终目标是提供一体化的监控系统,在同一套管理界面及权限体系之下,对线上应用系统进行多维度的监控。OMP现阶段主要监控内容包括:主机性能指标监控、中间件性能指标监控、服务调用链实时监控、接口性能指标监控、日志实时监控、业务指标实时监控。
主机性能指标监控方面的开源软件非常多,比如Zabbix、Cacti等。主要采集主机的CPU负载、内存使用率、各网卡的上下行流量、各磁盘读写速率、各磁盘读写次数(IOPS)、各磁盘空间使用率等。
借助开源的Sigar库,可以轻松采集主机信息,为了保证整个监控系统体验的一致性,以及系统扩展性、稳定性的要求,我们没有直接采用Zabbix等开源监控系统,而是自己开发Agent程序,部署在主机上采集信息。
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API。核心由C语言实现的,可以被以下语言调用: C/C++、Java 、Perl 、NET C# 、Ruby 、Python 、PHP 、Erlang 。
Sigar可以收集的信息包括:
对于中间件性能指标监控,目前根据业务使用中间件的情况来看,主要采集的中间件包括Nginx、MySQL、MongoDB、Redis、Memcached、JVM、Kafka等。实现方式为部署独立的采集服务器,通过中间件的java客户端执行状态查询命令,解析出相应的性能指标,采集的部分指标如下表所示:
JVM | 堆内存、永久代内存、老年代内存、线程CPU时间、线程堆栈、Yong GC、Full GC |
MySQL | 慢查询、QPS、TPS、连接数、空间大小、表锁、行锁… |
Redis | QPS、命中率、连接数、条目数、占用内存… |
Memcached | QPS、命中率、占用内存、条目数、连接数… |
Nginx | 每秒请求数、连接数、keepalive连接数、持久连接利用率… |
系统架构微服务化以后,服务调用错综复杂,出了问题或性能瓶颈,往往很难定位。所以服务调用链实时监控极为重要。
服务调用链监控是从一个App发起请求开始,分析各环节耗时及错误情况,包括负载均衡接入、API Server耗时、微服务调用耗时、缓存访问耗时、数据库访问耗时、消息队列处理耗时等,以及各环节的错误信息,便于跟踪性能瓶颈及错误。
由于服务调用量巨大,同时便于管理员查看,监控系统不能存储所有请求的调用链,主要存储以下几种请求:
接口性能指标监控,主要监控接口的可用性和响应时间,由内部监控和外部监控两部分组成:
应用产生的日志分散在各应用服务器当中,由于安全管理非常严格,开发人员查看线上系统的日志非常不方便,同时日志内容匹配关键字需要发送告警通知相关人员。OMP将日志统一采集存储到Elastic Search集群,实现日志检索。OMP日志实时监控主要包括如下功能:
最后一项监控内容,是业务指标实时监控。除了监控系统主动采集的信息,还有业务层指标需要进行监控,如周期内订单数量、第三方数据同步结果等。这些业务层的指标数据,由各业务系统负责采集,然后上报到监控系统,监控系统完成图表展现及告警通知。
四大方面详解OPM系统设计
首先来了解一下OPM的系统体系架构,如下图所示:
OPPO Data Flow实现了数据流配置和管理,设计参考Flume,内部包括Source(输入)、通道(Channel)、输出(Sink)三部分,通道是一个队列,具备缓冲数据的功能。之所以不采用Flume,主要考虑如下几个原因:
参考Flume 的设计思想,OPPO Data Flow是更易管理、配置更便捷的数据流工具。使用开源软件,并不只是拿来就用这一种方式,学习其设计精华,从而进一步改进也是一种方式。
实际上,Agent监控代理、中间件采集器、接收器集群都是OPPO Data Flow组件,组合不同的Source和Sink。Source、Sink采用OSF服务框架开发,实现Agentà接收器的自动发现、负载均衡及故障转移功能。
输入(Source) | 通道(Channel) | 输出(Sink) | |
Agent监控代理 | TailFileSource CPUSource MemorySource NetworkSource DiskSource | MemoryChannel | HttpSink |
中间件采集器 | NginxSource MySqlSource MongoDBSource RedisSource JvmSource MemcachedSource | MemoryChannel | HttpSink |
接收器 | HttpSource | FileChannel | KafkaSink |
下图为Data Flow内嵌管理界面,可以查看数据流量和错误信息,点击名称可以查看历史流量。
服务调用链是监控的重点,核心的核心,为了打通服务调用链,OPPO开发了OSF(OPPO Service Framework)分布式服务框架,并对缓存、数据库、消息队列操作进行封装埋点,目的是透明的实现服务调用跟踪。实现方式如下:
调用链数据庞大,无法全量存储,监控系统将周期内最慢Top1000请求,采样的部分请求以及符合关键字规则请求的服务调用链存储在HBase中,管理控制台可以快速分析查看。
分布式服务框架是打通服务调用链的关键。开源的Dubbo应用广泛,考虑到Dubbo版本较长时间没有更新(有些Dubbo依赖库已经跟开发生态的其他开源组件版本冲突)、代码量较大,而且服务治理能力较弱,很难完全掌控Dubbo的所有细节,而前文提到的OPPO自行开发的分布式服务框架OSF,代码精简满足核心需求,与监控系统深度集成。
OSF实现微服务RPC调用requestID的传递,记录每个服务的调用耗时及错误信息,框架每分钟汇总上报微服务调用耗时及错误信息到监控平台。
OSF主要特性如下:
由消费方决定序列化方式:
从可靠性及伸缩性角度来看,主要包括以下内容:
从OPPO的自主研发监控系统的实践案例来看,一切应当从业务需求出发,目的是解决业务遇到的问题。面对开源软件的选择,要有所“为”,有所“不为”。业界有很多成熟的开源软件,也有一些比较大胆的设计思想可供借鉴,但开源软件并不是拿过来就能用好这么简单的,选择的原则可“管”可“控”。一个开源软件,如果不能“掌控”,不够简单,那就不如不用,自己用土办法也许反而会更好,出了问题至少还能想想应急的办法。同样要具备“管理”性,不然黑盒子般运行,心里没底,那作为IT管理人员来说就睡不安心了。
本文作者罗代均 ,现就职于OPPO基础技术团队,从事监控平台、服务框架等基础技术开发工作。2005年毕业后,先后主导过通信、移动金融、应用商店、PaaS平台等领域多个产品系统设计开发、项目管理工作。本文由作者授权由InfoQ公众平台独家首发。