在哪里存储用于指标的数据?对后端的性能/网络影响最小

Where to store data to be used for metrics? With the least performance / network impact in the back-end

假设我想跟踪服务执行“某事的数量。

我可以将该事件的每个条目连同它的一些元数据一起存储在我的数据库中,但是如果该事件每秒发生数十次,它会增加网络延迟/影响应用程序性能。

跟踪要在指标中使用的此类数据的好方法是什么?

您可以检测您的代码以收集 time-series 指标。基本上,维护计数器,并且 log/reset 它们每隔一个时间间隔一次,比如每 5 分钟一次。然后您可以使用其他工具来收集和可视化这些日志。

看看Spectator

您可以记录某些信息,以后可以用于分析(使用 log4j 或 logback)。我不知道你用的是什么 back-end,但如果你用的是 Spring 或 Play,这很容易做到。

在 Spring 中,您可以实施 HandlerInterceptor 或针对每个端点(或仅针对特定端点,具体取决于您的用例)调用的过滤器。您可以使用此侦听器记录开始时间戳、结束时间戳和其他信息,例如被调用的端点。此外,您可以将信息存储在要使用的 ThreadContext 中(例如,用于计算处理请求所花费的时间)。

类似地,对于 Play,您可以编写实现 play.http.ActionCreator 的 class 并将其添加到处理流程中(更多相关信息:https://petrepopescu.tech/2021/09/intercepting-and-manipulating-requests-in-play-framework/

现在,您拥有包含所有所需信息的日志,您可以对其执行静态分析。你可以有一个每天解析日志并提供统计信息的工作。如果你正确标记你的日志(例如:通过在消息的开头添加关键字),解析应该非常容易。

如果您不想这样做,因为您需要 real-time 附近的统计数据,如果您想让用户尽可能顺利,则需要专门为此专门讨论一个话题.甚至可能有一个处理数据异步的 Actor(参见 Akka Actors)。同样,使用拦截器或过滤器,向参与者发送消息(使用 .tell(),而不是 .ask()),它会进行统计并将其保存在数据库中(或您选择的其他位置) .