随着业务的与日俱增,各个系统也越来越复杂,服务间的调用,服务的依赖,以及分析服务的性能问题也越棘手,因此引入服务追踪系统尤为重要。通过跟踪请求的处理过程,来对应用系统在前后端处理、服务端调用的性能消耗进行跟踪(每个请求的完整调用链路,收集调用链路上每个服务的性能数据),方便工程师能够快速定位问题。
APM 工具与传统的性能监控工具的区别在于,不仅仅提供一些零散的资源监控点和指标,其主要关注在系统内部执行、系统间调用的性能瓶颈分析,这样更有利于定位到问题的具体原因。APM 致力于检测和诊断应用性能问题,从而能提供应用预期的服务水平。
系统架构
在逻辑上分为四部分: 探针、 平台后端、存储和用户界面(UI)
· 探针
基于不同的来源可能是不一样的, 包括,应用进程的调用链、关键日志以及应用进程所在操作系统主机的资源情况,包括CPU、MEM、IO、Disk、Sysfile等。Agent 将数据格式化为DeepTracing-APM 适用的格式,推送给DeepTracing-APM系统,推送方式包括网络同步推送和kafka异步推送。
· 平台后端
包括两大功能:
- 对于Tracing数据,支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。高效数据建模,保障数据访问的高时效性;
- 对于植入agent的应用进程,可以通过反向字节码增强的方式,反向调试应用进程,做到在不修改代码、不重启应用进程的情况,即可实现系统bug的定位和快速修复。
· 存储
目前对于日志的存储,采用ELK组件,对于tracing信息使用MySQL来存储。
· 用户界面(UI)
一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 DeepTracing-APM数据。
关键技术——JVMTI-NativeAgent
业内APM的产品大多数采用的技术是 java agent作为探针抓手,比如具有代表性的开源产品SkyWalking,受到JavaAgent技术栈局限性,例如Jva Agent是在JVM 启动后期才被加载,该Agent是运行在JVM运行时的容器里,它会受到JVM 挂起或 Java 运行时问题的影响,并且不能报告某些类型的错误信息。如果不能正常发送监控数据就要堆积在JVM操作里,影响应用系统性能。此外,还有某些需求也无法兼顾,如,零感知入侵、探针的稳定性等方面。
因此本次采用更低层(JPAD层)技术栈,Native Agent技术,调用JVMIT方式,对JP(Java process)进行监控、控制。
利用JVMTI接口,将探针植入JP(JavaProcess,java服务进程)中,采集JP的行为。通过内网链路与数据传输协议建立网络链接,将采集的信息归并到采集模块中,方便后续处理。