public override void DoGrouping(string pathToMemoryDump, string pathToMscorDac, string typeToExtract) { var runtime = _runtimeFactory.BuildClrRuntime(new MDFileConnection(pathToMemoryDump, pathToMscorDac)); var heap = runtime.Heap; var stringBuilderStream = new FilteredObjectProviderByTypeName(typeof(StringBuilder)); var heapEnumerator = new HeapBasedClrObjectEnumerator(); var uniqueBuilders = new HashSet <ulong>(); var innerChunks = new HashSet <ulong>(); var locateInnerBuilders = (from stringBuilderPointer in stringBuilderStream.ExtractFromRuntime(runtime, heapEnumerator) let previousChunk = stringBuilderPointer.GetRefFld("m_ChunkPrevious") where uniqueBuilders.Add(stringBuilderPointer.Address) where !previousChunk.IsNullObj && previousChunk.Address != stringBuilderPointer.Address where previousChunk.Type?.Name == stringBuilderPointer.Type.Name where innerChunks.Add(previousChunk.Address) select previousChunk) .ToArray(); var topLevelBuilders = uniqueBuilders.Except(innerChunks); var factory = ModelMapperFactory; var builderContents = from u in uniqueBuilders let clrObj = new ClrObject(u, heap) let mapped = factory.BuildOfType <StringBuilderMappingModel>(clrObj) where !mapped.IsEmpty() select mapped; DoProcessing(builderContents); }
public RedisCommandsForHttpRequests(UserThreadsFilter threadFilter = null, FilteredObjectsProviderBase threadStackObjectsFilter = null) { ThreadFilter = threadFilter ?? new UserThreadsFilter(); if (threadStackObjectsFilter == null) { var httpContextFilter = new FilteredObjectProviderByTypeName(typeof(HttpContext)); var stringFilter = new PredicateBasedStringFilter(predicate: s => s.Contains("redis.call")); ThreadStackObjectFilter = new MultipleConditionFilteredObjectsProvider(httpContextFilter, stringFilter); } }
private static void LocateHowManyPagesInProcessedSessionEnd() { IFilteredObjectsProvider sessionArgs = new FilteredObjectProviderByTypeName("Sitecore.Pipelines.EndSession.PostSessionEndArgs"); var factory = ModelMapperManager.NewMapperFactory; IMemoryDumpConnectionPath connection = Connection; var visitPageIndexName = StringUtil.ProduceAutoPropertyName("VisitPageIndex"); var guidReader = new GuidReader(); var stream = from rawSessionClrObject in sessionArgs.EnumerateObjectsFromHeap(connection) let stubHttpContextForSessionEnd = rawSessionClrObject.GetRefFld("m_context") let stubHttpContextModel = factory.BuildOfType <HttpContextMappingModel>(stubHttpContextForSessionEnd) let rawAnalyticSessionObjects = stubHttpContextModel?.Items?["SessionSwitcher_State"] as IEnumerable <ClrObject> where rawAnalyticSessionObjects != null let currentRawSession = rawAnalyticSessionObjects.FirstOrDefault() where !currentRawSession.IsNullObj let sessionId = currentRawSession.GetStringFldOrAutoProp("Id") where !string.IsNullOrEmpty(sessionId) let currentVisitContext = currentRawSession.GetRefFld("_currentInteraction") let visitInfo = currentVisitContext.GetRefFld("_visitData") let contactId = guidReader.Read(visitInfo, "contactid") let referrer = visitInfo.GetStringFldOrAutoProp("Referrer") let userAgent = visitInfo.GetStringFldOrAutoProp("UserAgent") let pages = factory.BuildOfType <ArrayMappingModel>(currentVisitContext.GetRefFld("_pages")) where (pages?.IsEmpty == false) from currentPageContext in pages.Elements let rawPage = currentPageContext.Obj.GetRefFld("data") let visitPageIndex = rawPage.GetInt32Fld(visitPageIndexName) let url = rawPage.GetRefFldOrAutoProperty("Url").GetStringFldOrAutoProp("Path") select new { contactId, sessionEndTriggered = stubHttpContextModel.ContextCreationTime, analyticsSessionId = sessionId, totalPages = pages.Count, rawPage = rawPage.HexAddress, currentVisitContext.HexAddress, visitObject = visitInfo.HexAddress, userAgent, referrer, url, }; var sb = new StringBuilder(); foreach (var pageStats in stream.OrderByDescending(t => t.totalPages).ThenBy(t => t.sessionEndTriggered)) { sb.AppendLine(""); sb.AppendLine(pageStats.ToString()); sb.AppendLine(""); } File.WriteAllText(OutputStatsFile, sb.ToString()); }