什么是用于收集/存储/呈现应用程序指标/统计信息的Java库?

时间:2011-03-30 17:16:34

标签: java

我有一个Java应用程序,需要收集和报告大量的指标/操作测量/统计数据(不同的人的不同单词 - 我只会使用指标)关于各种实体。指标可以是以下之一:

  1. 某个特定时间点的某些测量数值(当前登录系统的用户数,某些资源的利用率%)
  2. 在给定时间间隔内的一些测量数值(在最后5分钟内传输的消息数量)
  3. 某个特定时间点的某些枚举值(某些实体的健康状况为ONLINE / WARNING / FAILED / OFFLINE)
  4. '实体'可以是物理设备(计算机,交换机,调制解调器),但通常是逻辑实体(通信信道4567,用户123456,服务A的接口)。另外,这些逻辑实体中的一些是静态的,因为它们是提前知道的并且在应用程序的生命期内不会改变,而其他逻辑实体可能是瞬态的(通信通道4567可能仅存在一段时间,然后被删除)

    我正在寻找帮助解决2个问题的图书馆:

    1. 可以更轻松地在服务器上收集和存储这些信息。
    2. 以有用的方式向用户展示数据。
    3. 请注意/需求:

      1. 生成数据的服务器应用程序基本上是作为守护程序运行的Java进程(即不是webapp)
      2. 将有2种不同类型的客户。
        1. 一个是Java Swing桌面应用程序,其中大部分“重”用途都是。丰富的实时图表和历史查询功能在这里很重要。
        2. 另一个是网络用户界面。我的要求还没有100%明确,但是这个客户的需求将比swing客户端要轻得多。这里需要开放标准(AJAX / HTML而不是Flash)
      3. 可以嵌入专有软件(即没有GPL许可证)。商业或免费。
      4. 过去,我的公司已经尝试过几种“本土化”的解决方案来满足这种需求。基本上,数据以某种不一致的方式被推入数据库,客户端将数据拉出,并能够使用本地或第三方图表包在固定的时间段内绘制单个值。坦率地说,我们所有的解决方案都很糟糕。我希望第三方解决方案可以解决的一些问题是:

        1. 封装用于更新/记录指标的代码,以便它不会对实际测量值的类进行轮询。
        2. 帮助管理指标的命名/识别。它们很容易就有1000个;我自己提出某种命名方案以确保唯一性是PITA。
        3. 很好地处理历史数据。能够配置保存数据的时间以及归档或清除旧记录。
        4. 在客户端,内置图表和查询功能,能够在呈现给用户之前转换数据库中的一些原始数据。
        5. 很抱歉这么长的说明。谢谢你的帮助。

5 个答案:

答案 0 :(得分:14)

我可以推荐Yammer的这个Java库:https://github.com/dropwizard/metrics 它提供了一个很好的API,可以有计数器,计时,直方图等。 它可以通过检测servlet和从JVM(内存等)中自动收集来自servlet的有趣数据。

然后我们将数据存储在Graphite中:http://graphite.wikidot.com/

Graphite将数据存储在类似于RRD的固定大小的数据库中,并且可以生成图表和仪表板。

答案 1 :(得分:6)

RRD4J

听起来像 RRD4J (Apache许可证)正是您所需要的。
它是完善的 RRDtool 的Java实现。它用于在循环数据库( RRD )中随时间收集数据。旧数据通常存档在 RRA 存档中,其中时间尺度不太精细,从而导致更节省空间。

虽然我没有RRD4J的直接经验,但我们已成功使用RRDTool和Cacti多年,用于数据中心的健康监测。由于RRD是监控的行业标准,我肯定会建议你看一下RRD4J。

答案 2 :(得分:3)

自从问了这个问题以来我已经有一段时间了,但我认为保持最新答案不是一个坏主意。

Spring Boot 2现在使用https://micrometer.io-这应该是当今在Java应用程序中收集指标的良好起点。它不负责存储或呈现它们,但可以为框架提供集成。

答案 3 :(得分:1)

另一种选择虽然相当复杂,但却是OpenTSD:http://opentsdb.net/overview.html

答案 4 :(得分:1)

你可以试试Stagemonitor https://github.com/stagemonitor/stagemonitor

它可以与elasticsearch / graphite / Influxdb配对,用于时间序列数据存储。

您可以使用Grafana可视化指标,它可以连接到许多不同的数据库,如elasticsearch,Influxdb,prometheus,mysql。