public Debug GetTimings(string transactionId) { var transactionIdGuid = Guid.Parse(transactionId); var profilerDataContext = new ProfilerDbDataContext(); var traces = profilerDataContext.GetTraceAndTimings(transactionIdGuid); Debug result = new Debug(); List<Timing> allTimings = new List<Timing>(); foreach (var trace in traces) { if (trace.IsRoot.GetValueOrDefault() == true) { BuildDebugAndRoot(trace, result); } else{ var timing = new Timing(); BuildTiming(trace, timing); BuildSqlTimingCount(trace, timing); allTimings.Add(timing); } } if(allTimings.Count > 0) MapChildren(result.Head, allTimings); return result; }
private static void BuildTiming(SExchange.Timing parentTiming, int timingIndex, out SExchange.Timing mTiming, out TProfiling.Timing timing) { mTiming = parentTiming.Children[timingIndex]; timing = new TProfiling.Timing() { Order = timingIndex, Id = mTiming.Id.ToString(), KeyValues = mTiming.KeyValues.DataToXml(), Name = mTiming.Name, Level = (Contract.ProfileLevel)Enum.Parse(typeof(Contract.ProfileLevel), mTiming.Level.ToString()), Duration = mTiming.DurationMilliseconds.HasValue ? mTiming.DurationMilliseconds.Value : 0, DurationWithOutChildren = mTiming.DurationWithoutChildrenMilliseconds, SqlTimingDuration = mTiming.SqlTimingsDurationMilliseconds, ExecutedNonQueries = mTiming.ExecutedNonQueries, ExecutedReaders = mTiming.ExecutedReaders, ExecutedScalers = mTiming.ExecutedScalars, IsRoot = mTiming.IsRoot, ParentId = mTiming.ParentTimingId.HasValue ? mTiming.ParentTimingId.Value.ToString() : Guid.Empty.ToString(), Start = mTiming.StartMilliseconds, ManagedThreadId = ((mTiming.KeyValues != null) && (mTiming.KeyValues.ContainsKey("managedthreadid"))) ? int.Parse(mTiming.KeyValues["managedthreadid"]) : -1 }; }
private void MapChildren(Timing parent, List<Timing> allTimings) { var children = allTimings.Where(x => parent.Id == x.ParentId); foreach (var child in children) { parent.Children.Add(child); MapChildren(child, allTimings); } }
private void BuildTiming(spGetTraceAndTimingsResult trace, Timing timing) { timing.Id = trace.TimingId.GetValueOrDefault(Guid.Empty).ToString(); timing.Name = trace.TimingName ?? UNKNOWN; timing.IsRoot = trace.IsRoot.GetValueOrDefault(); timing.Start = trace.Start.GetValueOrDefault(); timing.Duration = trace.Duration.GetValueOrDefault(); timing.DurationWithOutChildren = trace.DurationWithOutChildren.GetValueOrDefault(); timing.KeyValues = trace.KeyValues ?? UNKNOWN; timing.ManagedThreadId = trace.ManagedThreadId.GetValueOrDefault(); timing.Order = trace.ProfiledOrder.GetValueOrDefault(); timing.ParentId = trace.ParentTimingId.GetValueOrDefault(Guid.Empty).ToString(); }
private void BuildSqlTimingCount(spGetTraceAndTimingsResult trace, Timing timing) { var sqlDuration = trace.SqlTimingDuration.GetValueOrDefault(); var nonQueries = trace.ExecutedNonQueries.GetValueOrDefault(); var readers = trace.ExecutedReaders.GetValueOrDefault(); var scalars = trace.ExecutedScalers.GetValueOrDefault(); timing.SqlTimingsCount = nonQueries + readers + scalars; timing.SqlTimingDuration = sqlDuration; timing.ExecutedNonQueries = nonQueries; timing.ExecutedReaders = readers; timing.ExecutedScalers = scalars; }
private static void InsertTimings(ProfilerDbDataContext profilerDataContext, Guid transactionId, Timing timing) { var timingId = Guid.Empty; Guid.TryParse(timing.Id, out timingId); profilerDataContext.InsertProfilerTiming(timingId, transactionId, timing.IsRoot, timing.Name, timing.KeyValues, timing.Duration, timing.DurationWithOutChildren, timing.Start, Guid.Parse(timing.ParentId), timing.Order, timing.SqlTimingDuration, timing.ExecutedScalers, timing.ExecutedNonQueries, timing.ExecutedReaders, timing.ManagedThreadId); foreach (var sqlTiming in timing.SqlTimings) { var sqlTimingId = Guid.Empty; Guid.TryParse(sqlTiming.Id, out sqlTimingId); profilerDataContext.InsertProfilerSqlTiming(sqlTiming.ExecuteType, sqlTiming.CommandString, sqlTiming.StartMilliseconds, sqlTiming.DurationMilliseconds, sqlTiming.FirstFetchDurationMilliseconds, timingId, transactionId, sqlTiming.Order, sqlTimingId); foreach (var sqlParameter in sqlTiming.Parameters) { profilerDataContext.InsertProfilerSqlParameter(sqlTimingId, sqlParameter.Name, sqlParameter.Value, sqlParameter.DbType, sqlParameter.Size); } } if (timing.Children.Count > 0) { foreach (var childTiming in timing.Children) { InsertTimings(profilerDataContext, transactionId, childTiming); } } }