public static async Task ListInstanceEventsAsync(
            this EntriesResource entriesResource,
            IEnumerable <string> projectIds,
            DateTime startTime,
            IEventProcessor processor)
        {
            using (TraceSources.LogAnalysis.TraceMethod().WithParameters(
                       string.Join(", ", projectIds),
                       startTime))
            {
                var request = new ListLogEntriesRequest()
                {
                    ResourceNames = projectIds.Select(p => "projects/" + p).ToList(),
                    Filter        = $"protoPayload.methodName=(\"{string.Join("\" OR \"", processor.SupportedMethods)}\") " +
                                    $"AND severity=(\"{string.Join("\" OR \"", processor.SupportedSeverities)}\") " +
                                    $"AND resource.type=\"gce_instance\" " +
                                    $"AND timestamp > {startTime:yyyy-MM-dd} ",
                    PageSize = MaxPageSize,
                    OrderBy  = "timestamp desc"
                };

                await ListEventsAsync(
                    entriesResource,
                    request,
                    processor.Process,
                    new ExponentialBackOff(initialBackOff, MaxRetries));
            }
        }
        public static async Task ListEventsAsync(
            this EntriesResource entriesResource,
            ListLogEntriesRequest request,
            Action <EventBase> callback,
            ExponentialBackOff backOff)
        {
            using (TraceSources.LogAnalysis.TraceMethod().WithParameters(request.Filter))
            {
                string nextPageToken = null;
                do
                {
                    request.PageToken = nextPageToken;

                    using (var stream = await entriesResource
                                        .List(request)
                                        .ExecuteAsStreamWithRetryAsync(backOff))
                        using (var reader = new JsonTextReader(new StreamReader(stream)))
                        {
                            nextPageToken = ListLogEntriesParser.Read(reader, callback);
                        }
                }while (nextPageToken != null);
            }
        }