廖雄杰 - APM全栈性能监控实践

蒲芳洲

2017/12/31 发布于 技术 分类

应用性能监控与管理是开发和运维过程中不可或缺的一个环节,如何从用户端、服务器端对应用进行全方位监控?一方面,产品需要快速迭代开发,另一方面,我们总是希望在快速迭代的同时,监控系统也能同步跟上,尤其是当不同应用之间存在复杂的调用关系时,如何监控并快速定位性能问题?一个好的APM(应用性能监控管理)体系可以优雅地解决这个问题。

文字内容
1. APM全栈性能监控实践 廖雄杰@听云 研发副总裁 2017.thegiac.com www.top100summit.com
2. 应用问题无处不在 2017.thegiac.com
3. 如何监控发现应用性能及问题 • 数字化体验监控(Digital experience monitoring , DEM) • 真实用户监控(Real User Monitoring, RUM) • 模拟事务监控(Synthetic Transaction Monitoring, STM) • 应用发现、跟踪和诊断(Application discovery, tracing and diagnostics, ADTD) • 应用分析(Application analytics,AA) * 摘自Gartner对APM套件核心功能的定义 2017.thegiac.com
4. APM全栈溯源的几个步骤 最终用 户RUM 原生App App H5/Webview 监测节点 STM Browser 浏览器 STM for Network 业务系统 SaaS 基础架构 ADTD for Server 2017.thegiac.com
5. APM全栈溯源的几个步骤 1.用户体验一览 2.真实用户体验 3.网络切片 4.应用拓扑 5.行级代码分析 2017.thegiac.com
6. APM全栈溯源的几个步骤 1.用户体验一览 2.真实用户体验 3.网络切片 4.应用拓扑 5.行级代码分析 2017.thegiac.com
7. APM全栈溯源的几个步骤 1.用户体验一览 2.真实用户体验 3.网络切片 4.应用拓扑 5.行级代码分析 2017.thegiac.com
8. APM全栈溯源的几个步骤 1.用户体验一览 2.真实用户体验 3.网络切片 4.应用拓扑 5.行级代码分析 2017.thegiac.com
9. APM全栈溯源的几个步骤 1.用户体验一览 2.真实用户体验 3.网络切片 4.应用拓扑 5.行级代码分析 2017.thegiac.com
10. APM全栈溯源的几个步骤 • 真实用户性能:DEM/RUM • 网络切片:STM/NPM • 后台应用逻辑拓扑:ADTD • 应用过程及代码级分析:ADTD 2017.thegiac.com
11. 浏览器->服务器溯源 2017.thegiac.com
12. 浏览器->服务器溯源 Navigation TRiemsionugrceTiming TCP建连耗时 响应耗时 开始加载时间 W3C navigation timing level-2 2017.thegiac.com
13. 浏览器->服务器溯源 2017.thegiac.com
14. 浏览器->服务器溯源 2017.thegiac.com
15. 浏览器->服务器溯源 2017.thegiac.com
16. 浏览器->服务器溯源 2017.thegiac.com
17. 浏览器->服务器溯源 2017.thegiac.com
18. 浏览器->服务器溯源 2017.thegiac.com
19. App->服务器溯源 2017.thegiac.com
20. App->服务器溯源 网络分解 2017.thegiac.com
21. App->服务器溯源 相关源文件:JsonpSupportInterceptor.java 行:40 2017.thegiac.com
22. 监控实现原理 2017.thegiac.com
23. 全栈溯源的核心:服务器端动态字节码增强 • Java Instrumentation  bytecode • PHP Zend/Extensions  Opcode 3.上报指标名及性能 4.上报异常 1.获取方法开始时间 2.获取方法完成时间,并计算执行时间 2017.thegiac.com
24. 全栈溯源的核心:服务器端动态字节码增强 1. Classloading阶段自 动注入监控代码 2. 启动命令行使用-javaagent参数上述代码实现自动嵌码 java -cp $CLASSPATH -javaagent:$APM_AGENT_PATH/apm-agent.jar xxoo.demo.XxooMain 2017.thegiac.com
25. 全栈溯源的核心:服务器端动态字节码增强 • 可动态增强字节码的开源框架:asm, javassist • 指标的采集均可通过函数/方法的拦截来实现 eg: javax.servlet.http.HttpServlet.service(req, resp) √服务响应时间 √执行异常 √修改HTTP头 java.sql.Statement.executeQuery(sql) √SQL执行时间 √执行异常 √上下文SQL org.apache.http.client.HttpClient.execute(req) √HTTP响应时间 √执行异常 √修改HTTP头 2017.thegiac.com
26. 浏览器端Js埋码 • Navigation-timing/Resource-timing接口采集主要监控数据 页面及元素的DNS、TCP、SSL、DOM渲染等时序数据 • AJAX单独埋点采集 hook XmlHttpRequest.open/send函数,采集AJAX请求的 响应时间、回调时间等 • 监听特定事件 onerror,采集js错误数据 2017.thegiac.com
27. 全栈溯源(不同端)如何关联? • 浏览器端/App/服务器端自动嵌码 • 服务器端,ThreadLocal或异步Context关联前后端请求及 调用 • 服务器端拦截HttpServlet或HttpClient,修改HTTP头 • 拦截JSP/PHP编译过程,修改Response输出内容 (/) • (Ajax)拦截XmlHttpRequest,修改HTTP头 • App/浏览器Trace ID/ReqId服务器 2017.thegiac.com
28. 小结及其它 • 服务器端/浏览器/App端自动嵌码采集监控指标 • 打通不同端的监控是重点 • ServerServer(DB/redis/MQ/API gateway/微服务) • 调用链、根因分析 2017.thegiac.com
29. 扫码关注GIAC公众号 2017.thegiac.com www.top100summit.com