// Input trace listener
        private TraceSource Trace(
            RequestHandler handler,
            HttpEventCollectorEventInfo.Metadata metadata = null,
            int batchInterval  = 0,
            int batchSizeBytes = 0,
            int batchSizeCount = 0,
            HttpEventCollectorSender.SendMode sendMode = HttpEventCollectorSender.SendMode.Parallel,
            HttpEventCollectorSender.HttpEventCollectorMiddleware middleware = null)
        {
            var trace = new TraceSource("HttpEventCollectorLogger");

            trace.Switch.Level = SourceLevels.All;
            trace.Listeners.Add(
                new HttpEventCollectorTraceListener(
                    uri: uri,
                    token: token,
                    metadata: metadata,
                    sendMode: sendMode,
                    batchInterval: batchInterval,
                    batchSizeBytes: batchSizeBytes,
                    batchSizeCount: batchSizeCount,
                    middleware: MiddlewareInterceptor(handler, middleware))
                );
            return(trace);
        }
        private SinkTrace TraceSource(
            RequestHandler handler,
            HttpEventCollectorEventInfo.Metadata metadata = null,
            HttpEventCollectorSender.SendMode sendMode    = HttpEventCollectorSender.SendMode.Parallel,
            int batchInterval  = 0,
            int batchSizeBytes = 0,
            int batchSizeCount = 0,
            HttpEventCollectorSender.HttpEventCollectorMiddleware middleware = null)
        {
            var listener = new ObservableEventListener();
            var sink     = new HttpEventCollectorSink(
                uri: uri,
                token: token,
                formatter: new TestEventFormatter(),
                metadata: metadata,
                sendMode: sendMode,
                batchInterval: batchInterval,
                batchSizeBytes: batchSizeBytes,
                batchSizeCount: batchSizeCount,
                middleware: MiddlewareInterceptor(handler, middleware));

            listener.Subscribe(sink);

            var eventSource = TestEventSource.GetInstance();

            listener.EnableEvents(eventSource, EventLevel.LogAlways, Keywords.All);
            return(new SinkTrace()
            {
                Source = eventSource,
                Sink = sink,
                Listener = listener
            });
        }
 /// <summary>
 /// HttpEventCollectorTraceListener c-or. Instantiates HttpEventCollectorTraceListener
 /// when retriesOnError parameter is specified.
 /// </summary>
 /// <param name="uri">Splunk server uri, for example https://localhost:8088.</param>
 /// <param name="token">HTTP event collector authorization token.</param>
 /// <param name="retriesOnError">Number of retries when network problem is detected</param>
 /// <param name="metadata">Logger metadata.</param>
 /// <param name="sendMode">Send mode of the events.</param>
 /// <param name="batchInterval">Batch interval in milliseconds.</param>
 /// <param name="batchSizeBytes">Batch max size.</param>
 /// <param name="batchSizeCount">MNax number of individual events in batch.</param>
 public HttpEventCollectorTraceListener(
     Uri uri, string token,
     int retriesOnError,
     HttpEventCollectorEventInfo.Metadata metadata = null,
     HttpEventCollectorSender.SendMode sendMode    = HttpEventCollectorSender.SendMode.Sequential,
     int batchInterval  = HttpEventCollectorSender.DefaultBatchInterval,
     int batchSizeBytes = HttpEventCollectorSender.DefaultBatchSize,
     int batchSizeCount = HttpEventCollectorSender.DefaultBatchCount)
     : this(uri, token, metadata,
            sendMode,
            batchInterval, batchSizeBytes, batchSizeCount,
            (new HttpEventCollectorResendMiddleware(retriesOnError)).Plugin)
 {
 }
 /// <summary>
 /// HttpEventCollectorEventSink c-or with middleware parameter.
 /// </summary>
 /// <param name="uri">Splunk server uri, for example https://localhost:8088.</param>
 /// <param name="token">HTTP event collector authorization token.</param>
 /// <param name="formatter">Event formatter converting EventEntry instance into a string.</param>
 /// <param name="metadata">Logger metadata.</param>
 /// <param name="sendMode">Send mode of the events.</param>
 /// <param name="batchInterval">Batch interval in milliseconds.</param>
 /// <param name="batchSizeBytes">Batch max size.</param>
 /// <param name="batchSizeCount">MNax number of individual events in batch.</param>
 /// <param name="middleware">
 /// HTTP client middleware. This allows to plug an HttpClient handler that
 /// intercepts logging HTTP traffic.
 /// </param>
 public HttpEventCollectorSink(
     Uri uri, string token,
     IEventTextFormatter formatter,
     HttpEventCollectorEventInfo.Metadata metadata = null,
     HttpEventCollectorSender.SendMode sendMode    = HttpEventCollectorSender.SendMode.Sequential,
     int batchInterval  = HttpEventCollectorSender.DefaultBatchInterval,
     int batchSizeBytes = HttpEventCollectorSender.DefaultBatchSize,
     int batchSizeCount = HttpEventCollectorSender.DefaultBatchCount,
     HttpEventCollectorSender.HttpEventCollectorMiddleware middleware = null)
 {
     this.formatter = formatter;
     sender         = new HttpEventCollectorSender(
         uri, token, metadata,
         sendMode,
         batchInterval, batchSizeBytes, batchSizeCount,
         middleware);
 }