5

我们正在使用 Amazon Kinesis(一种队列服务)并拥有用 Java 编写的队列读取器。他们基本上从队列中读取数据并将数据插入我们的数据存储区。我想知道是否有人成功地使用 New Relic 来监控后台队列工作人员?

我感兴趣的一些分析:

  1. 现在有多少队列工作人员正在运行?(它们根据负载放大和缩小)
  2. 每个队列工作人员每秒处理多少条消息?随着时间的推移,这看起来如何?
  3. 整个工人队列每秒处理多少条消息?
  4. 工作人员向 MySQL 和 Cassandra 发出请求。他们花在这方面的时间有多少?
  5. 我们正在使用 log4j 进行日志记录。如果工人产生了错误/痕迹,它们是什么?随着时间的推移,错误率是多少?

谢谢,

高级

4

1 回答 1

2

与 Web 事务相比,New Relic 监控批处理作业没有任何问题,所以这不会是一个问题。

假设您开始使用具有可用源代码的 Java 应用程序,最好的前进路径是使用代理 API: https ://docs.newrelic.com/docs/agents/java-agent/custom-instrumentation /java-agent-api。这使您可以报告您喜欢的任何指标,即使我们没有自动记录它们。我将一一回答您的问题:

1) 我们有几种方法可以分割这个馅饼,但我能想到的最简单的方法是调用 NewRelic.recordMetric("Custom/Queue_worker/alive",1)。我只需运行一个计时器,每分钟对每个工人进行一次调用(因为这是我们的度量标准收获周期)。然后在自定义仪表板(https://docs.newrelic.com/docs/apm/dashboards-menu/custom-dashboards)中,您可以忽略指标值(将被平均 - 所以除非您有一个“知道”的主人值并且可以随心所欲地报告它,您不会通过报告 1+1+1...=1) 获得预期的效果。您将绘制 call_count 字段的图形,以查看那一分钟有多少工人运行。

2) 在这种情况下,您可能希望使用与上面大致相同的模式,除了为每个工作人员创建不同的自定义指标。幸运的是,自定义仪表板可以帮助解决这里的繁重工作 - 为 x = 处理的消息数,y = 一些唯一标识符(GUID?随机值? ) 每个工作人员...超过一分钟 - 然后您可以绘制 Custom/Queue_worker/*/number_of_messages 以将它们全部布置在同一个图表上。

3) 让每个工作人员提交相同的自定义指标 Custom/queue_worker/message_sent 以及该指标上的图形调用计数。再一次,您不能只为每个工作人员报告一个,因为随后的指标数据将被平均在一起,但我们会为您保留一个良好的呼叫计数。

4)您将免费获得 MySQL 时间(只要您使用此处列出的 mysql 或 JDBC 连接器: https ://docs.newrelic.com/docs/agents/java-agent/getting-started/new- relic-java#h2-compatibility ) - 它将在您的图表和事务跟踪中显示为“数据库”时间。对于 Cassandra,我们没有特定的工具,但您可以再次使用代理 API(推荐使用 NewRelic.recordResponseTimeMetric())至少记录并单独绘制图表。

5) 只要您的错误包含未处理的异常,您就可以免费获得错误率 - 或者您可以在处理 NewRelic.noticeError() 的异常(或您想要标记的任何错误条件)的任何时候进行 API 调用。此外,如果错误以未处理异常的形式出现(巧妙的技巧:在代码中处理您的异常,然后重新抛出它,以便我们的代理在上下文中看到它),您将获得堆栈跟踪以及有关您已处理的事务的任何元数据用 NewRelic.addCustomParameter() 记录。我们不进行日志文件处理,尽管您可以编写一个非常小的程序来执行该处理并使用上述方法导入指标,并且由于我们为每个正在运行的主机而不是每个代理授予许可,您可以在已经获得许可的情况下运行它工人无需额外费用。

使用 Insights ( https://docs.newrelic.com/docs/insights/new-relic-insights )有更简单的方法来做到这一点- 例如,您可以随时访问正在运行的代理列表,而无需任何额外的工作,并且您可以报告不会被平均的数字,您可以根据这些数字进行数学计算并绘制图表。但那是一个单独的产品,我不想向你追加销售:)

注意:我为 New Relic 工作。

于 2014-10-11T00:01:36.910 回答