protected override async Task OnEventSourceAvailable(EventPipeEventSource eventSource, Func <Task> stopSessionAsync, CancellationToken token) { _trigger = Settings.TriggerFactory.Create(Settings.TriggerSettings); _pipeline = new TraceEventTriggerPipeline(eventSource, _trigger, _callback); await _pipeline.RunAsync(token).ConfigureAwait(false); }
public TraceEventTriggerPipeline(TraceEventSource eventSource, ITraceEventTrigger trigger, Action <TraceEvent> callback) { _callback = callback ?? throw new ArgumentNullException(nameof(callback)); _eventSource = eventSource ?? throw new ArgumentNullException(nameof(eventSource)); _trigger = trigger ?? throw new ArgumentNullException(nameof(trigger)); IReadOnlyDictionary <string, IReadOnlyCollection <string> > providerEventMapFromTrigger = _trigger.GetProviderEventMap(); if (null == providerEventMapFromTrigger) { // Allow all events to be forwarded to the trigger _eventSource.Dynamic.AddCallbackForProviderEvents( null, TraceEventCallback); } else { // Event providers should be compared case-insensitive whereas counter names should be compared case-sensative. // Make a copy of the provided map and change the comparers as appropriate. IDictionary <string, IEnumerable <string> > providerEventMap = providerEventMapFromTrigger.ToDictionary( kvp => kvp.Key, //Accept null or empty, both indicating that any event will be accepted. kvp => (kvp.Value == null) ? null : (kvp.Value.Count == 0) ? null : kvp.Value.ToArray().AsEnumerable(), StringComparer.OrdinalIgnoreCase); // Only allow events described in the mapping to be forwarded to the trigger. // If a provider has no events specified, then all events from that provider are forwarded. _eventSource.Dynamic.AddCallbackForProviderEvents( (string providerName, string eventName) => { if (!providerEventMap.TryGetValue(providerName, out IEnumerable <string> eventNames)) { return(EventFilterResponse.RejectProvider); } else if (null == eventNames) { return(EventFilterResponse.AcceptEvent); } else if (!eventNames.Contains(eventName, StringComparer.Ordinal)) { return(EventFilterResponse.RejectEvent); } return(EventFilterResponse.AcceptEvent); }, TraceEventCallback); } }