什么是收敛
ARMS探针在运行过程中会采集很多指标数据(例如请求量、耗时、错误数等),为了能够提供丰富、准确的监控信息,指标中会携带一些维度信息(例如机器、接口等)。由于各种原因,有些维度会出现发散的情况,即高基数问题。高基数问题不仅会给存储系统带来巨大的压力,造成写入丢失、查询缓慢等问题,也会导致用户的账单暴涨。为解决该问题,ARMS提供了相应的收敛机制,一方面可用于解决高基数问题本身,即将维度的基数控制在合理的范围内,另一方面也可用于标记真实的观测维度。例如用户对外提供了RESTful形式的用户服务,其中包含一个查询用户信息的/api/v1/users/{ID}/info接口,如果直接记录原始的请求URL,由于ID的变化,将会记录一堆不同的URL,显然这会造成高基数问题,另外还会导致用户无法直观地获取到接口性能指标。本文将逐一介绍ARMS现有的收敛机制,以帮助您了解收敛发生的原因及收敛结果所代表的含义。
收敛结果说明
ARMS已有的收敛结果及对应的原因概括如下,更详细的部分请参见下文。
收敛结果 | 收敛原因 |
{ARMS_IP}:80 | 访问同一端口的IP数量过多,超过阈值(默认50)。 |
{ARMS_STATIC_REQ} 或 {ARMS_S_XXX} | URL为静态资源相关的请求。 |
{ARMS_ATTACK_REQ} | URL中包含攻击字符串。 |
{ARMS_PARAMED_REQ} | URL中携带了参数。 |
{ARMS_OTHERS} | 单位时间内,记录的维度值超过了允许的上限。 说明 默认上限阈值详细请参见下文基数空间收敛。 |
{ARMS_NUMBER} | URL中以 |
{ARMS_WORD} | URL中以 |
{ARMS_ANY} | URL中以 |
{XXX} | 使用了SpringController中的注解。 |
含有*的字符串 说明 仅适用于探针版本小于4.x的情况。 | 基于探针端的内存统计机制对发散的部分进行了收敛。 |
收敛机制说明
以下所有收敛机制都是默认开启的。除基数空间收敛外,所有收敛机制均支持用户手动关闭。
不同的收敛机制支持的数据类型不同,每个收敛机制都会注明所支持的数据类型。
自定义收敛
该功能支持用户自定义一些收敛规则,来满足一些特定的收敛需求。
收敛逻辑
逐一匹配用户配置的收敛规则,如果命中,则结束。
收敛结果
以用户配置为准。
支持的数据类型
URL
收敛触发位置
4.x及以上版本触发于探针端
4.x以下版本触发于服务端
支持的探针版本
所有
示例
用户配置的规则:匹配/api/v1/user/[\d]+/info
,收敛为/api/v1/getUserInfo
。
对于所有命中/api/v1/user/[\d]+/info
正则表达式的请求将都被收敛为/api/v1/getUserInfo
。
智能收敛
经过上文几个收敛动作后,依然有可能存在大量发散的URL被记录下来,针对这部分URL,ARMS会周期性基于算法自动计算出相应的收敛规则,然后替换掉原始的URL。
收敛逻辑
逻辑较为复杂,此处仅做简单介绍。
基于算法对样本URL进行分组。
对每个分组内的URL Pattern进行收敛处理,生成收敛规则。
合并各分组的收敛规则。
收敛结果
发散部分如果为纯数字,将被替换为{ARMS_NUMBER}。
发散部分如果为纯字母,将被替换为{ARMS_WORD}。
发散部分如果同时包含数字和字母,将被替换为{ARMS_ANY}。
支持的数据类型
URL
收敛触发位置
4.x及以上版本触发于探针端
4.x以下版本触发于服务端
支持的探针版本
所有
示例
/api/product/1/info
/api/product/2/info
....
/api/product/N/info
服务端经过计算后,会生成收敛规则:/api/product/[\d]+/info
(正则匹配)
收敛结果为/api/product/{ARMS_NUMBER}/info
。
后续符合上述正则的请求,都将被收敛为/api/product/{ARMS_NUMBER}/info
。
SQL规整化
由于多种情况的存在(例如分库分表、注释、明文),探针很可能会采集到大量SQL。基于这种情况,ARMS默认会对每条SQL进行处理,替换掉可能发散的部分。
规整逻辑
逻辑较为复杂,此处仅做简单介绍。
注释移除。
明文替换。
分库分表名替换。
...
规整结果
替换掉发散部分后的结果。
支持的数据类型
SQL
收敛发生位置
探针端
支持的探针版本
4.X 及以上版本
示例
select * from cache_0 where ckey='23'
将会被收敛为:
select * from cache_{NUM} where ckey=?