如何构建AppDynamic或New Relic系统,通过仅在运行应用程序的服务器上安装软件来收集应用程序的性能指标,包括详细的调用树统计信息?
是否可以在不使用调试信息编译应用程序的情况下收集此类指标?
构建此类服务时需要考虑哪些性能折衷?这些软件如何最大限度地降低他们自己可能对应用程序产生的性能影响。
答案 0 :(得分:10)
AppDynamics和New Relic都使用标准BCI来监控开发人员用于构建应用程序的常见接口(入口和出口点)(例如Servlet,struts,SOAP,JMS,JDBC等)。这提供了代码执行的基本框架(调用图),其中包含的时序信息占执行代码的不到5%。
然后,秘密是在减速期间发现剩余的95%代码执行的时间,而不会在生产JVM中产生过多的开销。 AppDynamics使用内存代理分析和Java API调用的组合,然后实时提取剩余的代码执行。这意味着不需要自定义检测或明确声明您希望监视解决方案使用哪些类/方法。
AppDynamics数据收集与New Relic的数据收集非常不同。例如,使用AppDynamics,您可以针对特定用户请求跨多个JVM获取完整的分布式调用图,而不是说请求的汇总。
BCI目前是一种商品,不同之处在于供应商使用的分析和算法触发诊断/调用图信息,因此您可以在正确的时间获得正确的可见性来解决问题。
史蒂夫。
答案 1 :(得分:6)
这些产品通常的工作方式是对常用的库和方法进行字节码注入/函数插入/猴子修补。例如,您可能会挂钩JDBC查询方法,servlet基类和HTTP客户端库。当请求进入应用程序时,跟踪它所做的所有重要方法/调用,并以某种方式记录它们。获取数据并将其压缩为分析,图表和警报。
最重要的是,您可以开始添加统计分析或其他选项。
棘手的事情是跨越流程边界跟踪请求并处理您将收集的性能数据量。 (我在AppNeta处理这个问题)
要查看的一件事是Twitter Zipkin(https://github.com/twitter/zipkin),不支持太多且非常早期但有趣的项目。