internal PutSubscriptionFilterResponse PutSubscriptionFilter(PutSubscriptionFilterRequest request)
        {
            var marshaller   = new PutSubscriptionFilterRequestMarshaller();
            var unmarshaller = PutSubscriptionFilterResponseUnmarshaller.Instance;

            return(Invoke <PutSubscriptionFilterRequest, PutSubscriptionFilterResponse>(request, marshaller, unmarshaller));
        }
        /// <summary>
        /// Initiates the asynchronous execution of the PutSubscriptionFilter operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the PutSubscriptionFilter operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        public Task <PutSubscriptionFilterResponse> PutSubscriptionFilterAsync(PutSubscriptionFilterRequest request, System.Threading.CancellationToken cancellationToken = default(CancellationToken))
        {
            var marshaller   = new PutSubscriptionFilterRequestMarshaller();
            var unmarshaller = PutSubscriptionFilterResponseUnmarshaller.Instance;

            return(InvokeAsync <PutSubscriptionFilterRequest, PutSubscriptionFilterResponse>(request, marshaller,
                                                                                             unmarshaller, cancellationToken));
        }
        private async Task UpsertSubscriptionFilter(PutSubscriptionFilterRequest request)
        {
            Console.WriteLine("Upserting Subscription Filter...");

            var subscriptionFilters = await _cloudWatchLogs.DescribeSubscriptionFiltersAsync(new DescribeSubscriptionFiltersRequest
            {
                LogGroupName = request.LogGroupName
            });

            var subscriptionFilter = subscriptionFilters.SubscriptionFilters.First();

            if (subscriptionFilter.FilterName != request.FilterName || subscriptionFilter.FilterPattern != request.FilterPattern)
            {
                await Task.WhenAll(_cloudWatchLogs.DeleteSubscriptionFilterAsync(new DeleteSubscriptionFilterRequest
                {
                    FilterName   = subscriptionFilter.FilterName,
                    LogGroupName = request.LogGroupName
                }), _cloudWatchLogs.PutSubscriptionFilterAsync(request));
            }
        }
        private async Task SubscribeLogGroup(string logGroup)
        {
            var request = new PutSubscriptionFilterRequest
            {
                DestinationArn = _kinesisArn,
                LogGroupName   = logGroup,
                FilterName     = _filterName,
                FilterPattern  = _filterPattern,
                RoleArn        = _roleArn,
                Distribution   = "ByLogStream"
            };

            try
            {
                await _cloudWatchLogs.PutSubscriptionFilterAsync(request);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Failed to Subscribe [{logGroup}].");
                await Console.Error.WriteLineAsync(JsonConvert.SerializeObject(ex));

                await UpsertSubscriptionFilter(request);
            }
        }