我有一个基于Java Web的应用程序正在生产中运行。我需要某种方式来查看最终用户的操作实际上正在使用代码的所有部分。

只是为了进一步阐明我的要求。

  • 我不想放置基于日志记录的解决方案。任何需要我放入一些日志并分析日志的解决方案都不是我要找的东西。
  • 我需要一些可以在类似单元测试覆盖率报告器之类的行上使用的解决方案。像cobertura或emma报告一样,在运行单元测试后,它向我显示了代码的哪一部分是由单元测试激发的。我需要一些可以在生产环境中监听JVM的信息,并告诉我最终用户的行为在生产环境中激发了我代码的哪些部分。

  • 我为什么要这样做?
    我有一个继承的代码。这是一个很大的部分-大约25,000课。我需要做的事情之一是砍掉应用程序中使用率不高的部分。如果我可以向管理层表明几乎没有使用过该应用程序的某些部分,则可以从该产品中删除这些部分,并有效地使该产品更易于管理(例如在手动回归测试套件中,它需要每次运行一周左右,需要几天的时间,可以缩短)。

    希望对此有一些现成的解决方案。

    最佳答案

    正如Joachim Sauer在以下问题的评论中所说:最简单的方法是只使用用于单元测试的代码覆盖率工具,并使用它来检测生产代码。

    有一个主要问题:开销。代码覆盖率分析确实可以减慢速度,并且尽管知情的用户群可以忍受某些暂时的性能下降,但整个过程仍需要保持可用。

    根据我的经验,JaCoCo相对较轻,不会带来太多开销,而Cobertura会造成极大的影响。另一方面,JaCoCo仅标记“命中或不命中”,而Cobertura则为您提供每行命中计数。这意味着JaCoCo将只让您找到死点,而Cobertura将让您找到极少的命中点。

    无论使用这两种工具中的哪一种(可能一个接一个),最终都可能会产生巨大的类白名单和类黑名单,从而将覆盖范围限制在有意义的地方,从而降低了性能开销。例如,如果整个事物只有一个前端 Controller Servlet,则在分析中将其包括在内将最大程度地提高性能开销,同时不提供任何有值(value)的信息。这可能会导致大量工作和大量应用程序部署。

    实际上,识别瓶颈/网关进入特定子系统并在每个子系统上打个计数器(例如perf4j甚至是成熟的Nagios)可能会更快,更省力。查询是另一个可以增加计数器的好地方。如果您怀疑应用程序的某些部分很少使用,请在此处放置一些计数器,看看会发生什么。

    关于Java应用程序-我的代码的哪一部分都已投入生产?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9213368/

    10-16 06:03