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);
            }
        }