private void ProcessProcedures(IEnumerable <IStoredProcedureStatistics> procedures, DateTime collectedDate, bool isStatisticsResetDetected) { foreach (var p in procedures) { var lastValue = GetLastValue <IStoredProcedureStatistics>(p.ID); TotalStoredProcedureStatistics diff = null; if (!isStatisticsResetDetected && lastValue != null && !p.Equals(lastValue)) { diff = new TotalStoredProcedureStatistics() { CreatedDate = DateTime.Now, CallsCount = Math.Max(p.CallsCount - lastValue.CallsCount, 0), DatabaseID = p.DatabaseID, Date = collectedDate, ProcedureID = p.ID, SelfDurationInMs = Math.Max(p.SelfDurationInMs - lastValue.SelfDurationInMs, 0), TotalDurationInMs = Math.Max(p.TotalDurationInMs - lastValue.TotalDurationInMs, 0) }; } procedureStatistics.AddOrUpdate(p.ID, new TotalStoredProcedureStatisticsSampler(dateTimeSelector, diff), (k, v) => { if (diff != null) { v.AddSample(diff); } return(v); }); SaveLastValue(p.ID, p); } }
private void PersistTotalProcedureStatistics(TotalStoredProcedureStatistics newStatistics) { var repository = repositories.GetTotalStoredProcedureStatisticsRepository(); var uniqueKey = new TotalStoredProcedureStatisticsUniqueKey() { DatabaseID = newStatistics.DatabaseID, Date = newStatistics.Date, ProcedureID = newStatistics.ProcedureID }; var oldStatistics = repository.GetByUniqueKey(uniqueKey); if (oldStatistics == null) { repository.Create(newStatistics); } else { TotalStoredProcedureStatisticsMergeUtility.ApplySample(oldStatistics, newStatistics); repository.Update(oldStatistics); } }
public static void ApplySample(TotalStoredProcedureStatistics cumulativeData, TotalStoredProcedureStatistics newSample) { cumulativeData.CallsCount += newSample.CallsCount; cumulativeData.SelfDurationInMs = cumulativeData.SelfDurationInMs + newSample.SelfDurationInMs; cumulativeData.TotalDurationInMs = cumulativeData.TotalDurationInMs + newSample.TotalDurationInMs; }