/// <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));
        }
コード例 #2
0
        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));
 }
コード例 #5
0
        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));
        }