​14天阅读挑战赛​

 持续坚持原创输出,点击蓝字关注我吧

浅谈支付系统的业务精细化监控_功能测试

几个月前,写过一篇关于系统可观测性的文章《​​可观测性就是对“监控”的包装?​​》,文中也阐述了可观测性与监控之间的区别。

1.监控是可观测性的先决条件。在监控处理收集数据的同时,可观测性收集、存储、查询和可视化这些数据,使专业人员能够轻松地了解每个系统行为背后的原因。

2.监控为你提供有关系统中的问题或故障的信息,而可观测性让你了解导致故障的原因、发生地点以及发生原因。

3.不受监控的系统是不可观测的。

4.可观测性 发现&解决未知的未知问题。监控 发现已知的问题。

当然,关于监控的文章,在各大论坛上一搜一大把,国内外比较大的互联网公司也都有开发自己的监控系统(可以参考文末的相关文章)。 本文主要介绍支付系统的精细化监控,一方面是工作相关,相对比较熟悉;一方面支付系统对资损0容忍,因此需要借助精细的监控系统以实现对线上异常的第一时间响应。但大部分内容,应该来说对其他系统也是通用的 。

OK,下面就由浅入深慢慢道来。

1.系统监控

先说相对比较简单的系统监控,一般系统监控关注如下指标,当然熟悉性能测试同学也比较熟悉:

  • CPU负载
  • 内存使用率;
  • 磁盘使用率;
  • 网络带宽占用

2.JVM监控

JMX提供了关于JVM的大部分核心信息,启动时设置参数,支持远程访问JMX,之后即可通过接入JMX来实时读取JVM的CPU,内存等信息。

JVM可监控指标如下:

  • GC(垃圾收集)瞬时和累计详情
  • FullGC次数
  • YoungGC次数
  • FullGC耗时
  • YoungGC耗时
  • 堆内存详情
  • 堆内存总和
  • 堆内存年轻代Survivor区字节数
  • 堆内存年轻代Eden区字节数
  • 已提交内存字节数
  • 非堆内存
  • 非堆内存提交字节数
  • 非堆内存初始字节数
  • 非堆内存最大字节数
  • 直接缓冲区
  • DirectBuffer总大小(字节)
  • DirectBuffer使用大小(字节)
  • JVM线程数
  • 线程总数量
  • 死锁线程数量
  • 新建线程数量
  • 阻塞线程数量
  • 可运行线程数量
  • 终结线程数量
  • 限时等待线程数量
  • 等待中线程数量

3.服务监控

服务监控主要指对接口的监控,包括HTTP、RPC等协议开发的服务。服务监控关注如下指标:

  • QPS,每秒请求数。对于使用容器的系统,例如Apache Tomcat,可以从Access Log中采集到每个服务的QPS。这个指标还可以细分为 每秒成功请求数、失败请求数、总请求数等。
  • 请求响应时间。在服务器端监控每个服务的响应时间。
  • 执行异常数。指程序运行过程中发生的未捕获处理的异常,一般是对场景考虑不周导致的异常发生,比如空指针、错误参数、数据访问等的异常。异常在应用日志中一般都会把错误堆栈打印出来。
  • 执行失败数。指程序运行过程中捕获的异常数,一般是对特定场景下做的异常报错,比如参数校验失败等。

监控项目

监控数据

数据源

系统监控

CPU使用率

zabbix agent默认采集

系统监控

内存使用率

zabbix agent默认采集

系统监控

带宽使用率

zabbix agent默认采集

JVM内存监控

free, used, heepsize

JMX

服务状态监控

404/505等status数量

Tomcat访问日志

服务状态监控

每个接口的访问量

Tomcat访问日志

服务状态监控

每个接口发送的字节量

Tomcat访问日志

服务状态监控

每个接口的最大响应时间

Tomcat访问日志

服务状态监控

每个接口的最平均响应时间

Tomcat访问日志

服务监控

错误数

应用日志

4.数据库监控

数据库是大部分应用的核心和瓶颈,对其监控至关重要。监控可以在数据库服务器上做。以MySQL为例,可以通过监控其bin log来获取执行的sql语句以及执行时间、错误代码等信息。

数据库监控重点关注如下指标:

  • 每秒请求数
  • 慢查询处理数
  • SQL语句执行时间

5.全链路监控

调用链监控更多应用于微服务系统中,追踪一个请求从发起到返回的整条链路,观察在各个相关系统中的调用情况。调用链监控往往是跨系统的监控,需要在请求发起时分配一个可以唯一识别本次调用请求的ID,这个ID会被分发到每个调用的应用服务上。之后会在调用日志中打印出此ID。当所有日志都汇总起来后,就可以从日志中分析本次调用的整个链路。

当然,随着微服务架构大行其道,当今市面上存在很多开源的分布式链路追踪工具,分布式追踪系统用于记录请求范围内的信息,一次远程过程调用的执行过程和耗时,是我们排查系统问题和系统性能瓶颈的利器。常见的分布式追踪工具如Jaeger,Uber推出的一款开源分布式追踪系统,兼容OpenTracing API,用于监视和诊断基于微服务的分布式系统。

6.业务监控

可能很多朋友会问,服务监控难道不就是业务监控吗?其实不然,我认为服务监控是脱离业务的,它更多表征的是服务自身的特性,例如响应时间、延迟、响应结果、异常结果,而这些特性是所有服务共有的,并不是某个服务特有的。而业务监控就不同了,每个业务可能有不同的特性指标。以支付业务为例:

如常见的淘宝购物,完成一笔支付, 可以选择不同的支付渠道,例如卡支付、钱包支付(支付宝、微信等)。而针对支付接口的监控包括如下内容:

  1. 支付渠道请求数:如果一段时间内渠道请求量大幅度下降,可能是该支付渠道出现问题了。
  2. 支付渠道请求失败数,即调用渠道失败的数量。
  3. 支付渠道请求延迟。
  4. 支付渠道支付失败率。每个支付渠道有一定的失败率,如果给定时间内突然有超过这个失败率的情况出现,则可能是这种支付渠道出现问题了。

而支付业务相关的接口,如下单、退款、签约、解约等,监控如下内容:

  1. 下单交易金额
  2. 每笔平均金额
  3. 支付成功率
  4. 退款成功率

7.精细化监控

所谓精细化监控,就是对业务的精细化监控,即对第6小节介绍内容的更进一步。精细化监控的目的是提升开发人员的应急效率。

实现精细化监控,除了常规的数据统计手段外,更多依赖测试同学的业务经验了。下面我就YY一些业务场景给大家通俗易懂阐述下,当然这些例子更多的是帮助大家理解而已。

例如,上述介绍的 针对支付业务的监控指标,支付渠道请求失败数,特定时间支付失败有时候是正常的,例如网络延迟、支付超时等,此时仅仅这个请求失败数是不能断定就是系统出现了问题的,我们可以基于时间维度进行数据统计,例如统计一小时内容的失败率,并且设置阈值,触发阈值则通知开发响应应急预。

再例如,我们在支付服务中开发一段处理异常的代码,即触发该异常代码会报xx错误码,而且这个错误码是0容忍的,此时就需要配置精细化监控,监控这个错误码,只要发现有这个错误码就通知开发响应应急预案。

精细化监控是测试右移的一种有效手段,可以帮助测试同学更及时发现线上故障,以降低故障带来的负面影响(资金损失、客诉等)。