protected override void OnEventCommand(EventCommandEventArgs command)
 {
     Console.WriteLine("Got Event Command: {0}", command.Command);
     foreach (var kvp in command.Arguments)
     {
         Console.WriteLine("{0}:{1}", kvp.Key, kvp.Value);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Get callbacks when the ETW sends us commands`
        /// </summary>
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            // To get the AsyncCausality events, we need to inform the AsyncCausalityTracer
            if (command.Command == EventCommand.Enable)
                AsyncCausalityTracer.EnableToETW(true);
            else if (command.Command == EventCommand.Disable)
                AsyncCausalityTracer.EnableToETW(false);
             
            if (IsEnabled(EventLevel.Informational, Keywords.TasksFlowActivityIds)) 
                ActivityTracker.Instance.Enable();
            else 
               TasksSetActivityIds = IsEnabled(EventLevel.Informational, Keywords.TasksSetActivityIds);

            Debug = IsEnabled(EventLevel.Informational, Keywords.Debug);
            DebugActivityId = IsEnabled(EventLevel.Informational, Keywords.DebugActivityId);
        }
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            base.OnEventCommand(command);

            if (command.Command == EventCommand.SendManifest ||
                command.Command != EventCommand.Disable ||
                FunctionDefinitionRequested(command))
            {
                if (!_initialized)
                {
                    // We're still in the constructor - need to defer sending until we've finished initializing.
                    Task.Yield().GetAwaiter().OnCompleted(SendFunctionDefinitionsAsync);
                    return;
                }

                SendFunctionDefinitions();
            }
        }
Beispiel #4
0
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            base.OnEventCommand(command);

            if (command.Command == EventCommand.SendManifest ||
                command.Command != EventCommand.Disable ||
                FunctionDefinitionRequested(command))
            {
                // Use helper functions rather than lambdas since the auto-generated manifest
                // doesn't know what to do with compiler generated methods.
                // here, we use Task to make things run in background thread
                if (initialized)
                {
                    SendFunctionDefinitionsAsync();
                }
                else
                {
                    // We're still in the constructor, need to defer sending until we've finished initializing
                    Task.Yield().GetAwaiter().OnCompleted(SendFunctionDefinitionsAsync);
                }
            }
        }
Beispiel #5
0
        private void OnEventSourceCommand(object?sender, EventCommandEventArgs e)
        {
            if (e.Command == EventCommand.Enable || e.Command == EventCommand.Update)
            {
                Debug.Assert(e.Arguments != null);

                if (e.Arguments.TryGetValue("EventCounterIntervalSec", out string?valueStr) && float.TryParse(valueStr, out float value))
                {
                    lock (s_counterGroupLock)      // Lock the CounterGroup
                    {
                        EnableTimer(value);
                    }
                }
            }
            else if (e.Command == EventCommand.Disable)
            {
                lock (s_counterGroupLock)
                {
                    DisableTimer();
                }
            }
        }
Beispiel #6
0
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            if (command.Command == EventCommand.Enable)
            {
                // NOTE: These counters will NOT be disposed on disable command because we may be introducing
                // a race condition by doing that. We still want to create these lazily so that we aren't adding
                // overhead by at all times even when counters aren't enabled.

                // On disable, PollingCounters will stop polling for values so it should be fine to leave them around.
                _cpuTimeCounter ??= new PollingCounter("cpu-usage", this, () => RuntimeEventSourceHelper.GetCpuUsage())
                {
                    DisplayName = "CPU Usage", DisplayUnits = "%"
                };
                _workingSetCounter ??= new PollingCounter("working-set", this, () => (double)(Environment.WorkingSet / 1_000_000))
                {
                    DisplayName = "Working Set", DisplayUnits = "MB"
                };
                _gcHeapSizeCounter ??= new PollingCounter("gc-heap-size", this, () => (double)(GC.GetTotalMemory(false) / 1_000_000))
                {
                    DisplayName = "GC Heap Size", DisplayUnits = "MB"
                };
                _gen0GCCounter ??= new IncrementingPollingCounter("gen-0-gc-count", this, () => GC.CollectionCount(0))
                {
                    DisplayName = "Gen 0 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _gen1GCCounter ??= new IncrementingPollingCounter("gen-1-gc-count", this, () => GC.CollectionCount(1))
                {
                    DisplayName = "Gen 1 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _gen2GCCounter ??= new IncrementingPollingCounter("gen-2-gc-count", this, () => GC.CollectionCount(2))
                {
                    DisplayName = "Gen 2 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _threadPoolThreadCounter ??= new PollingCounter("threadpool-thread-count", this, () => ThreadPool.ThreadCount)
                {
                    DisplayName = "ThreadPool Thread Count"
                };
                _monitorContentionCounter ??= new IncrementingPollingCounter("monitor-lock-contention-count", this, () => Monitor.LockContentionCount)
                {
                    DisplayName = "Monitor Lock Contention Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _threadPoolQueueCounter ??= new PollingCounter("threadpool-queue-length", this, () => ThreadPool.PendingWorkItemCount)
                {
                    DisplayName = "ThreadPool Queue Length"
                };
                _completedItemsCounter ??= new IncrementingPollingCounter("threadpool-completed-items-count", this, () => ThreadPool.CompletedWorkItemCount)
                {
                    DisplayName = "ThreadPool Completed Work Item Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _allocRateCounter ??= new IncrementingPollingCounter("alloc-rate", this, () => GC.GetTotalAllocatedBytes())
                {
                    DisplayName = "Allocation Rate", DisplayUnits = "B", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _timerCounter ??= new PollingCounter("active-timer-count", this, () => Timer.ActiveCount)
                {
                    DisplayName = "Number of Active Timers"
                };
                _fragmentationCounter ??= new PollingCounter("gc-fragmentation", this, () => {
                    var gcInfo = GC.GetGCMemoryInfo();
                    return(gcInfo.HeapSizeBytes != 0 ? gcInfo.FragmentedBytes * 100d / gcInfo.HeapSizeBytes : 0);
                })
                {
                    DisplayName = "GC Fragmentation", DisplayUnits = "%"
                };
                _committedCounter ??= new PollingCounter("gc-committed", this, () => (double)(GC.GetGCMemoryInfo().TotalCommittedBytes / 1_000_000))
                {
                    DisplayName = "GC Committed Bytes", DisplayUnits = "MB"
                };
                _exceptionCounter ??= new IncrementingPollingCounter("exception-count", this, () => Exception.GetExceptionCount())
                {
                    DisplayName = "Exception Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _gcTimeCounter ??= new PollingCounter("time-in-gc", this, () => GC.GetLastGCPercentTimeInGC())
                {
                    DisplayName = "% Time in GC since last GC", DisplayUnits = "%"
                };
                _gen0SizeCounter ??= new PollingCounter("gen-0-size", this, () => GC.GetGenerationSize(0))
                {
                    DisplayName = "Gen 0 Size", DisplayUnits = "B"
                };
                _gen1SizeCounter ??= new PollingCounter("gen-1-size", this, () => GC.GetGenerationSize(1))
                {
                    DisplayName = "Gen 1 Size", DisplayUnits = "B"
                };
                _gen2SizeCounter ??= new PollingCounter("gen-2-size", this, () => GC.GetGenerationSize(2))
                {
                    DisplayName = "Gen 2 Size", DisplayUnits = "B"
                };
                _lohSizeCounter ??= new PollingCounter("loh-size", this, () => GC.GetGenerationSize(3))
                {
                    DisplayName = "LOH Size", DisplayUnits = "B"
                };
                _pohSizeCounter ??= new PollingCounter("poh-size", this, () => GC.GetGenerationSize(4))
                {
                    DisplayName = "POH (Pinned Object Heap) Size", DisplayUnits = "B"
                };
                _assemblyCounter ??= new PollingCounter("assembly-count", this, () => System.Reflection.Assembly.GetAssemblyCount())
                {
                    DisplayName = "Number of Assemblies Loaded"
                };
                _ilBytesJittedCounter ??= new PollingCounter("il-bytes-jitted", this, () => System.Runtime.JitInfo.GetCompiledILBytes())
                {
                    DisplayName = "IL Bytes Jitted", DisplayUnits = "B"
                };
                _methodsJittedCounter ??= new PollingCounter("methods-jitted-count", this, () => System.Runtime.JitInfo.GetCompiledMethodCount())
                {
                    DisplayName = "Number of Methods Jitted"
                };
                _jitTimeCounter ??= new IncrementingPollingCounter("time-in-jit", this, () => System.Runtime.JitInfo.GetCompilationTime().TotalMilliseconds)
                {
                    DisplayName = "Time spent in JIT", DisplayUnits = "ms", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };

                AppContext.LogSwitchValues(this);
            }
        }
    }
}
 /// <summary>
 /// This method is called when the eventSource is updated by the controller.  
 /// </summary>
 protected virtual void OnEventCommand(EventCommandEventArgs command) { }
Beispiel #8
0
 private bool FunctionDefinitionRequested(EventCommandEventArgs command)
 {
     return command.Arguments != null &&
            command.Arguments.Keys.FirstOrDefault() == "SendFunctionDefinitions";
 }
Beispiel #9
0
 protected virtual void OnEventCommand(EventCommandEventArgs command)
 {
 }
Beispiel #10
0
 protected override void OnEventCommand(EventCommandEventArgs command)
 {
     Debug.WriteLine(String.Format("EventSourceTest: Got Command {0}", command.Command));
     Debug.WriteLine("  Args: " + string.Join(", ", command.Arguments.Select((pair) => string.Format("{0} -> {1}", pair.Key, pair.Value))));
 }
 protected override void OnEventCommand(EventCommandEventArgs command)
 {
     base.OnEventCommand(command);
 }
Beispiel #12
0
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            if (command.Command == EventCommand.Enable)
            {
                // NOTE: These counters will NOT be disposed on disable command because we may be introducing
                // a race condition by doing that. We still want to create these lazily so that we aren't adding
                // overhead by at all times even when counters aren't enabled.

                // On disable, PollingCounters will stop polling for values so it should be fine to leave them around.
                _cpuTimeCounter = _cpuTimeCounter ?? new PollingCounter("cpu-usage", this, () => RuntimeEventSourceHelper.GetCpuUsage())
                {
                    DisplayName = "CPU Usage"
                };
                _workingSetCounter = _workingSetCounter ?? new PollingCounter("working-set", this, () => (double)(Environment.WorkingSet / 1000000))
                {
                    DisplayName = "Working Set"
                };
                _gcHeapSizeCounter = _gcHeapSizeCounter ?? new PollingCounter("gc-heap-size", this, () => (double)(GC.GetTotalMemory(false) / 1000000))
                {
                    DisplayName = "GC Heap Size"
                };
                _gen0GCCounter = _gen0GCCounter ?? new IncrementingPollingCounter("gen-0-gc-count", this, () => GC.CollectionCount(0))
                {
                    DisplayName = "Gen 0 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _gen1GCCounter = _gen1GCCounter ?? new IncrementingPollingCounter("gen-1-gc-count", this, () => GC.CollectionCount(1))
                {
                    DisplayName = "Gen 1 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _gen2GCCounter = _gen2GCCounter ?? new IncrementingPollingCounter("gen-2-gc-count", this, () => GC.CollectionCount(2))
                {
                    DisplayName = "Gen 2 GC Count", DisplayRateTimeScale = new TimeSpan(0, 1, 0)
                };
                _exceptionCounter = _exceptionCounter ?? new IncrementingPollingCounter("exception-count", this, () => Exception.GetExceptionCount())
                {
                    DisplayName = "Exception Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _threadPoolThreadCounter = _threadPoolThreadCounter ?? new PollingCounter("threadpool-thread-count", this, () => ThreadPool.ThreadCount)
                {
                    DisplayName = "ThreadPool Thread Count"
                };
                _monitorContentionCounter = _monitorContentionCounter ?? new IncrementingPollingCounter("monitor-lock-contention-count", this, () => Monitor.LockContentionCount)
                {
                    DisplayName = "Monitor Lock Contention Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _threadPoolQueueCounter = _threadPoolQueueCounter ?? new PollingCounter("threadpool-queue-length", this, () => ThreadPool.PendingWorkItemCount)
                {
                    DisplayName = "ThreadPool Queue Length"
                };
                _completedItemsCounter = _completedItemsCounter ?? new IncrementingPollingCounter("threadpool-completed-items-count", this, () => ThreadPool.CompletedWorkItemCount)
                {
                    DisplayName = "ThreadPool Completed Work Item Count", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _gcTimeCounter = _gcTimeCounter ?? new PollingCounter("time-in-gc", this, () => GC.GetLastGCPercentTimeInGC())
                {
                    DisplayName = "Time in GC"
                };
                _gen0SizeCounter = _gen0SizeCounter ?? new PollingCounter("gen-0-size", this, () => GC.GetGenerationSize(0))
                {
                    DisplayName = "Gen 0 Size"
                };
                _gen1SizeCounter = _gen1SizeCounter ?? new PollingCounter("gen-1-size", this, () => GC.GetGenerationSize(1))
                {
                    DisplayName = "Gen 1 Size"
                };
                _gen2SizeCounter = _gen2SizeCounter ?? new PollingCounter("gen-2-size", this, () => GC.GetGenerationSize(2))
                {
                    DisplayName = "Gen 2 Size"
                };
                _lohSizeCounter = _lohSizeCounter ?? new PollingCounter("loh-size", this, () => GC.GetGenerationSize(3))
                {
                    DisplayName = "LOH Size"
                };
                _allocRateCounter = _allocRateCounter ?? new IncrementingPollingCounter("alloc-rate", this, () => GC.GetTotalAllocatedBytes())
                {
                    DisplayName = "Allocation Rate", DisplayRateTimeScale = new TimeSpan(0, 0, 1)
                };
                _assemblyCounter = _assemblyCounter ?? new PollingCounter("assembly-count", this, () => System.Reflection.Assembly.GetAssemblyCount())
                {
                    DisplayName = "Number of Assemblies Loaded"
                };
            }
        }
 /// <summary>
 /// On every command (which the debugger can force by turning on this EventSource with ETW)
 /// call a function that the debugger can hook to do an arbitrary func evaluation.  
 /// </summary>
 /// <param name="args"></param>
 protected override void OnEventCommand(EventCommandEventArgs args)
 {
     BreakPointWithDebuggerFuncEval();
 }
Beispiel #14
0
 /// <summary>Called when the current event source is updated by the controller.</summary><param name="command">The arguments for the event.</param>
 protected virtual void OnEventCommand(EventCommandEventArgs command)
 {
     throw new NotImplementedException();
 }
 // You don't need to define this override, but it does show you when your eventSource gets commands, which
 // is helpful for debugging (you know that your EventSource got the command.  
 protected override void OnEventCommand(EventCommandEventArgs command)
 {
     EventGenerator.Out.WriteLine("EventSource Gets command {0}", command.Command);
 }
        protected override void OnEventCommand(EventCommandEventArgs command)
        {
            base.OnEventCommand(command);

            this.Commands.Add(command.Arguments);
        }