elastic APM针对java应用的高阶用法 二(java agent)
这篇文章是接着上一篇elastic APM针对java应用的高阶用法(java agent)剩余的内容,异常监测和与日志分析系统的配合。
异常监测
接着上一篇文章中的内容,我们将异步函数里面进行redis连接的网络环境切换一下(把redis服务器给关了)。这时,jedis会抛出一个SocketTimeoutException
异常。打开APM,看看这个异常是否能够捕捉到:
可见:
- APM仍然能捕捉到事务,但是在事务中,redis的执行只到了
auth()
函数。另外,如果只看transaction项,我们无法直观的看到该事务抛出了异常,这点需要elastic APM进行改进 - 点击Errors选项,我们可以看到抛出异常的类,行数,抛出时间,堆栈信息。但可以看到URL,Request method, Handled, Transaction sample ID等都是
N/A
。出现这个现象原因可能是:Redis
的操作是异步的,即在另外一个单独的线程里面进行,虽然从Transaction里看到看到它的spans,但是不属于Transaction的一部分
因此,我们再修改一下代码:
- 我们首先把elasticapm.properties配置里面的
trace_methods=com.example.sqldemo.service.*,redis.clients.jedis.Jedis#keys(),redis.clients.jedis.BinaryJedis#*
项给注释掉,即不再将定时任务作为监测目标。然后我们看看还能不能捕捉到SocketTimeoutException
异常。 - 我们在
addUser()
函数里面增加异常点int errorTrigger = 100 / 0;
,当web访问/apm/multiSql
路径的时候触发
然后运行下程序,可以看到:
- APM捕捉到了除零的异常,但是没有
SocketTimeoutException
异常,即只能捕捉在transaction范围内的异常。 -
/ by zero
异常有关联的transaction ID,可以直接跳转到对应的transaction当中。 - 但Handled仍然为空
接下来我们在代码中捕获该异常,并进行处理,看看情况如何:
代码内捕获后,APM中不再有新的异常记录,即APM只捕获抛出的未处理的异常
日志分析系统的配合
未完待续。。。