为什么要注入问题代码?
AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的。为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在AcmeAir中动态注入问题代码。 当某些请求满足了问题代码的触发条件的适合,问题代码就会被运行起来。
问题代码是如何被触发起来的?
AcmeAir WebApp是一个常规的Web应用,我们可以通过设置Filter的方式监控所有的Rest API的情况,通过分析Request中的头信息来动态决定是否触发问题代码。
目前支持的问题有 CPU问题,内存问题,还有慢事务问题。
问题类型
|
header name
|
header value
|
---|---|---|
CPU | issue-header | cpu-issue |
Memory | issue-header | memory-issue |
SlowTransaction | issue-header | slow-transaction-issue |
如果要触发这些问题, 我们只需要在对应的HTTP请求头中设置对应的header信息即可
1.以crul 为例
这里可以触发cpu-issue,slow-transaction-issue这两个issues
curl --header "issue-header: cpu-issue,slow-transaction-issue" www.google.com |
2.以jmeter为例
这里可以触发slow-transaction-issue,当然还可以在别的请求处添加相同或不同的issue
sleepTime代表缓慢事务延迟时间(秒)
3. 触发memory leak,header设置如下
issue-header : memory-issue
leakType : staticSet/database (staticSet静态集合引起、database数据库连接相关对象引起)
leakSpeed : verySlow//slow/normal/fast (泄露时间分别约3h/1h/15min/5min引起OOM ,有不同程度误差)
例如:下图配置表示以数据库连接相关对象引起的慢内存泄露,至OOM大约1个小时
4. 通过前端页面触发问题
为了方便快速、直观地注入问题,我们发布了前端界面触发问题的版本,只要pull最新镜像即可使用。使用方式如下参考:
4.1.slow transaction用于制造缓慢请求
4.2.error response用于制造报错信息
4.3.memeroy use内存使用情况
4.4. use cpu使用情况
4.5. 触发慢sql
4.6.触发timeout sql
如何添加新的问题代码?
在AcmeAir common 模块中有一个com.acmeair.problems包,其中包含了CPU问题,内存问题以及慢事务问题的注入代码。
如果要添加新的问题代码,需要继承ProblemInterceptorSupport类,实现了ProblemInterceptor接口,并通过分析 HttpRequest Header中的issue-header 决定是否执行问题代码。