コード例 #1
0
 private static void PublishSysConfigAttribute(TraceJob traceJob, string propertyName, DateTime value)
 {
     traceJob.PublishMeasurement(
         new TraceModel.TraceAttribute
         {
             Name = propertyName,
             DateTimeValue = value
         }
         );
 }
コード例 #2
0
 private static void PublishSysConfigAttribute(TraceJob traceJob, string propertyName, int intValue)
 {
     traceJob.PublishMeasurement(
         new TraceModel.TraceAttribute
         {
             Name = propertyName,
             WholeNumberValue = intValue
         }
         );
 }
コード例 #3
0
ファイル: BootPhase.cs プロジェクト: MatthewMWR/MeasureTrace
        public void RegisterSecondPass(TraceJob traceJob)
        {
            traceJob.RegisterProcessorByType<TerminalSessionProcessor>(ProcessorTypeCollisionOption.UseExistingIfFound);

            traceJob.OnNewMeasurementOfType<TraceModel.BootPhase>(bp => _alreadyRegisteredBootPhases.Add(bp));

            traceJob.OnNewMeasurementOfType<TerminalSession>(ts =>
            {
                if (
                    _alreadyRegisteredBootPhases.Any(
                        em => em.BootPhaseType == BootPhaseType.FromLogonUntilDesktopAppears)) return;
                if (ts.ExplorerProcessId == 0) return;
                traceJob.PublishMeasurement(
                    new TraceModel.BootPhase
                    {
                        BootPhaseObserver = BootPhaseObserver.MeasureTrace,
                        BootPhaseType = BootPhaseType.FromLogonUntilDesktopAppears,
                        DurationMSec = ts.LogonCredentialEntryToShellReady
                    }
                    );
                traceJob.PublishMeasurement(
                    new TraceModel.BootPhase
                    {
                        BootPhaseObserver = BootPhaseObserver.MeasureTrace,
                        BootPhaseType = BootPhaseType.FromPowerOnUntilDesktopAppears,
                        DurationMSec = ts.ShellReadyOffsetMSec
                    }
                    );
            });

            traceJob.EtwTraceEventSource.Registered.AddCallbackForProviderEvents((pn, en) =>
            {
                if (!string.Equals(pn, WinlogonProviderName, StringComparison.OrdinalIgnoreCase))
                    return EventFilterResponse.RejectProvider;
                return EventFilterResponse.AcceptEvent;
            }, e =>
            {
                if ((WinlogonSystemBootEventId == (int) e.ID || WinlogonWelcomeScreenStartId == (int) e.ID) &&
                    _countOfPowerOnToReadyForLogon < 1)
                {
                    _countOfPowerOnToReadyForLogon++;
                    traceJob.PublishMeasurement(new TraceModel.BootPhase
                    {
                        BootPhaseObserver = BootPhaseObserver.MeasureTrace,
                        BootPhaseType = BootPhaseType.FromPowerOnUntilReadyForLogon,
                        DurationMSec = e.TimeStampRelativeMSec
                    });
                }
            });

            traceJob.EtwTraceEventSource.Registered.AddCallbackForProviderEvents((pn, en) =>
            {
                if (!string.Equals(pn, PerfTrackProviderName, StringComparison.OrdinalIgnoreCase))
                    return EventFilterResponse.RejectProvider;
                return EventFilterResponse.AcceptEvent;
            }, e =>
            {
                if (PerfTrackIdleDetectionInfoEventId == (int) e.ID &&
                    _alreadyRegisteredBootPhases.All(
                        bp => bp.BootPhaseType != BootPhaseType.FromDesktopAppearsUntilDesktopResponsive))
                {
                    var accumulatedIdleMs = Convert.ToInt32(e.PayloadValue(0));
                    if (IdleAccumulationCutoffMs > accumulatedIdleMs) return;
                    var postBootEndOffsetMinusAccumulatedIdle = e.TimeStampRelativeMSec - accumulatedIdleMs;
                    var bootToDesktop =
                        _alreadyRegisteredBootPhases.FirstOrDefault(
                            bp => bp.BootPhaseType == BootPhaseType.FromPowerOnUntilDesktopAppears);
                    if (bootToDesktop == null) return;
                    var postBootOnlyRawDurationMs = postBootEndOffsetMinusAccumulatedIdle - bootToDesktop.DurationMSec;
                    var postBootDurationCleaned = CalculateRollOffPostBootValue(postBootOnlyRawDurationMs.Value);
                    var desktopAppearsToDestkopResponsive = new TraceModel.BootPhase
                    {
                        BootPhaseObserver = BootPhaseObserver.MeasureTrace,
                        BootPhaseType = BootPhaseType.FromDesktopAppearsUntilDesktopResponsive,
                        DurationMSec = postBootDurationCleaned
                    };
                    traceJob.PublishMeasurement(desktopAppearsToDestkopResponsive);
                    traceJob.PublishMeasurement(new TraceModel.BootPhase
                    {
                        BootPhaseObserver = BootPhaseObserver.MeasureTrace,
                        BootPhaseType = BootPhaseType.FromPowerOnUntilDesktopResponsive,
                        DurationMSec = bootToDesktop.DurationMSec + desktopAppearsToDestkopResponsive.DurationMSec
                    });
                }
            });
        }