/// <summary> /// Provides text statistics for pending <see cref="HttpContext"/> that wait for Redis commands. /// <para>Scans thread stacks for <see cref="HttpContext"/> instances, and <see cref="string"/>s that contain 'redis.call' text inside.</para> /// </summary> /// <param name="connection"></param> /// <param name="connectionFactory"></param> /// <param name="threadFilter"></param> /// <param name="threadStackObjectsFilter"></param> /// <param name="factory"></param> /// <returns></returns> public virtual StringBuilder ExtractRedisPendingCommandsForRequests(IMemoryDumpConnectionPath connection, IClrRuntimeFactory connectionFactory = null, IModelMapperFactory factory = null) { var runtime = (connectionFactory ?? MDClrRuntimeFactory.Instance).BuildClrRuntime(connection); return(ExtractRedisPendingCommandsForRequests(runtime, factory ?? ModelMapperManager.NewMapperFactory)); }
public ClrRuntime BuildClrRuntime([NotNull] IMemoryDumpConnectionPath settings) { Assert.ArgumentNotNull(settings, "settings"); if (settings is MDFileConnection == false) { throw new ArgumentException($"Expected {typeof(MDFileConnection).FullName}, recieved {settings.GetType().Name}"); } var connectionDetails = settings as MDFileConnection; return(this.BuildClrRuntimeCore(connectionDetails.PathToDump, connectionDetails.PathToMsCorDacwks)); }
public static IEnumerable <ClrObject> EnumerateObjects(this IEnumerateClrObjectsFromClrRuntime objectEnumerator, IMemoryDumpConnectionPath connectionDetails, IClrRuntimeFactory factory) { var runtime = factory.BuildClrRuntime(connectionDetails); return(objectEnumerator.EnumerateObjectsFromSource(runtime)); }
public static IEnumerable <ClrObject> EnumerateObjects(this IEnumerateClrObjectsFromClrRuntime objectEnumerator, IMemoryDumpConnectionPath connectionDetails) { return(IEnumerateClrObjectsFromClrRuntimeExtensions.EnumerateObjects(objectEnumerator, connectionDetails, MDClrRuntimeFactory.Instance)); }
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()); }
public static IEnumerable <IClrObjMappingModel> ExtractFromHeap(this IModelMapperFactory factory, IFilteredObjectsProvider clrObjectFilter, IMemoryDumpConnectionPath connection) { var runtime = MDClrRuntimeFactory.Instance.BuildClrRuntime(connection); return(ExtractFromHeap(factory, clrObjectFilter, runtime)); }
public static IEnumerable <IClrObjMappingModel> ExtractFromHeapByType(this IModelMapperFactory factory, string typeName, IMemoryDumpConnectionPath connectionDetails) { var clrObjectFilter = BuildFilterByTypeName(typeName); return(ExtractFromHeap(factory, clrObjectFilter, connectionDetails)); }
public static IEnumerable <TMappingType> ExtractFromHeap <TMappingType>(this IModelMapperFactory factory, IMemoryDumpConnectionPath connectionDetails) where TMappingType : IClrObjMappingModel { var typeName = ModelMappingAttribute.GetTypeToMapOn(typeof(TMappingType), assert: true); return(ExtractFromHeapByType(factory, typeName, connectionDetails).OfType <TMappingType>()); }
public static IEnumerable <T> EnumerateObjectsFromHeap <T>(this IFilteredObjectsProvider filteredObjectProvider, IMemoryDumpConnectionPath connection, IModelMapperFactory factory, IClrRuntimeFactory runtimeFactory = null) where T : class, IClrObjMappingModel { runtimeFactory = runtimeFactory ?? MDClrRuntimeFactory.Instance; var runtime = MDClrRuntimeFactory.Instance.BuildClrRuntime(connection); var heapObjects = HeapBasedClrObjectEnumerator.Instance; var stream = filteredObjectProvider.ExtractFromRuntime(runtime, heapObjects); foreach (var matched in stream) { yield return(factory.BuildOfType <T>(matched)); } }
public static IEnumerable <ClrObject> EnumerateObjectsFromHeap(this IFilteredObjectsProvider filteredObjectProvider, IMemoryDumpConnectionPath connection, IClrRuntimeFactory runtimeFactory = null) { runtimeFactory = runtimeFactory ?? MDClrRuntimeFactory.Instance; var runtime = MDClrRuntimeFactory.Instance.BuildClrRuntime(connection); var heapObjects = HeapBasedClrObjectEnumerator.Instance; return(filteredObjectProvider.ExtractFromRuntime(runtime, heapObjects)); }