背景
得物Apm系统本身包含网络接口性能监控的能力,但接口监控主要关注的是接口的耗时、异常率等信息,没有流量消耗相关维度的统计信息,并且一部分流量消耗可能来自于音视频等其他特殊场景,在接口监控的盲区外。
为了了解用户目前使用App时的流量消耗情况,并支持分析用户是存在异常的流量使用情况,还需要从流量消耗的角度,进行相关监控功能的建设。本文主要介绍流量监控实现过程中的一些技术实现及平台能力。
流量消耗信息获取
xt_qtaguid模块
xt_qtaguid 模块 是android 内核3.0 引入的流量统计模块,在Android系统9以下的版本,可以通过直接读取 /proc/net/xt_qtaguid/stats 文件获取对应应用的 流量消耗信息。其内容如下
nimdanoob:/ $ cat proc/net/xt_qtaguid/stats | grep 10027
idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets
10 rmnet_data0 0x0 10027 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
11 rmnet_data0 0x0 10027 1 451662 2320 1193948 3888 451662 2320 0 0 0 0 1193948 3888 0 0 0 0
40 wlan0 0x0 10027 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
41 wlan0 0x0 10027 1 38829 166 77083 208 38829 166 0 0 0 0 77083 208 0 0 0 0
在结果中,根据 uid_tag_int 可以区分不同的应用程序,这个值对应代码中 android.os.Process.myUid()�
获取的值。
第二列的 iface 表示所使用的网络接口,比如 wlan
表示Wi-Fi网络适配器的物理接口, rmnet_data
表示手机数据网络接口, l0
表示本地回环接口 。
通过读取 rx_bytes、tx_bytes 就可以获取不同网络接口累计使用的上下行流量大小。
除了通过直接读取 xt_qtaguid/stats文件的方式,也可以直接通过调用系统封装TrafficStats类提供的相关Api获取流量消耗信息,该类在 Android API8 版本开始就被引入了。
相关Api 如下
- getUidTxBytes(int uid) :返回指定uid的上行流量消耗
- getUidRxBytes(int uid): 返回指定uid的下行流量
- getMobileTxBytes(): 返回整机的上行流量消耗
- getMobileRxBytes(): 返回整机下行流量消耗
TrafficStats的限制
在Android 9 版本开始,google 逐步取消了对 xt_qtaguid模块的支持,开始采用基于