0

我有一系列事件,在高峰时间可能每秒数百个。我希望能够跟踪和报告每个时间间隔的事件数(例如过去 5 分钟、最后一小时、过去 24 小时、过去 7 天)。在 C# 中跟踪此类数据的一些选项是什么

4

4 回答 4

0

考虑到到目前为止我所知道的所有问题,我将简单地分别用整数变量或长变量来计算接收到的事件的数量。

要在没有手头项目时间戳的情况下计算特定时间段内的事件,您必须先确定时间粒度并根据结果时间范围跟踪传入事件。要测量经过的时间,您可以使用并发线程。

这意味着如果您决定 5 分钟的粒度,您将不得不实现一个维护一个计数器的线程。此计数器在每个传入事件时递增。每隔 5 分钟,线程会将当前计数器存储在一个列表中并将其重置为 0。比如说 60 分钟后,您将拥有一个包含 12 个项目的列表,反映收到的消息数量。使用该列表,您可以处理以下查询

  • 前 5 分钟有多少事件?
  • 前 10 分钟有多少活动?
  • 接收 15 分钟后 5 分钟内有多少事件。
  • ...

从那时起,只需解释随时间收集并存储到列表中的计数器。


另一方面,如果您希望能够查询任何粒度的时间间隔(意味着后验决定您想知道收到多少事件的时间间隔),我认为您别无选择来维护数据结构带有时间戳。

因此,对于每一个事件,您都必须存储它收到的时间,以便回答上述查询。如果您每秒收到数百个事件,那可能不是一个好主意。

于 2012-07-27T17:54:23.830 回答
0

我建议为事件分配时间戳。我想你会继续以任何方式处理这些事件。因此,您可能会以某种方式存储事件和/或其数据。只需通过时间戳成员扩展数据结构并在事件发生时添加时间戳。这样,您可以在稍后的某个时间点在您的代码中的某个时间点构建您的“传入”统计信息。您可以简单地评估在特定时间范围内发生了哪些事件。

作为合理时间戳的来源,我建议使用GetSystemTimeAsFileTime()API。当您的最大事件速率高达每秒几百个时,这应该能够提供唯一值。然而,当时间戳的目的仅仅是为了说明它们落在哪个时间范围内时,时间戳不必具有唯一值。当需要更高的分辨率时,查看QueryPerformanceCounter()API 可能会有所帮助。此处描述的两个 API 的组合可以导致时间戳分辨率几微秒的精度。

于 2012-07-28T11:46:14.693 回答
0

根据问题描述,我假设您想要监控系统性能、负载和吞吐量。如果是这样,我想您可以为此使用 WMI。

很抱歉我无法提供更详细的信息,但我认为您可以从这里开始:http: //msdn.microsoft.com/en-us/library/ms186147%28v=vs.80%29

于 2012-07-28T11:52:07.050 回答
-1

您在这里有一个两阶段的问题 - 记录事件并呈现它们。如果您跟踪上个月的所有事件,您可以选择仅显示过去 5 分钟、过去 7 天内发生的事件,或者甚至更复杂的事件,例如“12 天凌晨 1 点到下午 3 点之间的所有事件”前”。

可以在此处找到 .NET 的一些日志记录选项。祝你的问题好运!

于 2012-07-27T17:02:20.627 回答