public void EndEvent(object eventHandle)
{
if (eventHandle == null)
{
throw new ArgumentNullException(nameof(eventHandle));
}
SystemMetricEvent evt = eventHandle as SystemMetricEvent;
if (evt != null)
{
evt.Duration = DateTime.UtcNow - evt.Timestamp;
long latencyMS = (long)evt.Duration.TotalMilliseconds;
QueuedEvents.AddOrUpdate(evt.EventName,
(name) =>
{
// create the default event that will be added
// if an event isn't already queued for this event name
return new SystemMetricEvent
{
EventName = evt.EventName,
Minimum = latencyMS,
Maximum = latencyMS,
Average = latencyMS,
Count = 1
};
},
(name, evtToUpdate) =>
{
// Aggregate into the existing event
// While we'll be performing an aggregation later,
// we retain the count so weighted averages can be performed
evtToUpdate.Maximum = Math.Max(evtToUpdate.Maximum, latencyMS);
evtToUpdate.Minimum = Math.Min(evtToUpdate.Minimum, latencyMS);
evtToUpdate.Average += latencyMS; // the average is calculated later - for now we sum
evtToUpdate.Count++;
return evtToUpdate;
});
}
}