我希望用Java编写一个“智能监控器”,在检测到即将出现性能问题时发送警报。我的Java应用程序将数据以结构化格式写入日志文件:
<datetime> | <java-method> | <seconds-to-execute>
举个例子,如果我有一个Widget#doSomething(String)
方法执行时间为812毫秒,它将被记录为:
所以,例如,如果我有一个Widget#doSomething(String)
方法的执行时间为812ms,它将被记录为:
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
当性能开始下降(例如在主要集合期间、在高峰负载期间或如果系统正在减速),方法执行时间开始变慢;因此,最右边的列开始看到巨大的数字(有时需要20-40秒才能执行一个方法)。
在大学时,我为了机器学习练习写了一个我的教授称之为“线性分割器”的程序,它使用简单的测试数据(人的身高、体重和性别)并“学习”如何根据他们的身高/体重将一个人分类为男性或女性。然后,一旦它获得了所有的训练数据,我们就会提供新的数据来查看它能够如何准确地确定性别。
我认为多元线性分割器的版本是被称为支持向量机(SVM)的东西。 如果我错了,请明确说明,我将更改我的问题标题为更合适的内容。 无论如何,我需要这个应用程序执行以下操作:
- 在“测试模式”下运行,我将从我的主Java应用程序(我希望监视的那个应用程序)中提取结构化日志文件,并将每个日志条目(如上所示)用作测试数据
- 仅
java-method
和seconds-to-execute
列对于输入/测试数据很重要; 我不关心日期时间 - 在“监视模式”下运行,它正在积极地从日志文件中读取新的日志数据,并使用类似的“机器学习”技术来确定性能退化是否正在发生
需要注意的是,seconds-to-execute
列不是唯一重要的因素,在表现出色的时期我也曾经看到某些方法的执行时间非常糟糕,而在服务器似乎快要挂掉并推动风铃草时,其他方法的执行时间确实很好。 所以显然某些方法比其他方法更“加权”/更重要。