Beispiel #1
0
        /// <inheritdoc />
        public async Task <InsertEventsResult> InsertAsync(
            InsertEventsQuery query,
            TimeSpan timeout,
            CancellationToken cancellationToken = default)
        {
            try
            {
                using (var disposable = writersPool.Acquire(out var buffer))
                {
                    buffer.Reset();

                    var content = new ValueDisposable <Content>(CreateContent(query, buffer), disposable);

                    var response = await sender
                                   .SendAsync(query.Stream, settings.ApiKeyProvider(), content, timeout, cancellationToken)
                                   .ConfigureAwait(false);

                    return(response);
                }
            }
            catch (Exception error)
            {
                log.Warn(error);
                return(new InsertEventsResult(HerculesStatus.UnknownError, error.Message));
            }
        }
        public async Task WriteEvents(IList <HerculesEvent> events, CancellationToken cancellationToken)
        {
            var pointer = 0;

            while (pointer < events.Count && !cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var insertQuery = new InsertEventsQuery(
                        settings.TargetStreamName,
                        events.Skip(pointer).Take(settings.EventsWriteBatchSize).ToList());

                    var insertResult = await settings.GateClient
                                       .InsertAsync(insertQuery, settings.EventsWriteTimeout, cancellationToken)
                                       .ConfigureAwait(false);

                    insertResult.EnsureSuccess();

                    pointer += settings.EventsWriteBatchSize;
                }
                catch (Exception e)
                {
                    log.Warn(e, "Failed to send aggregated events.");
                    await Task.Delay(settings.DelayOnError, cancellationToken).ConfigureAwait(false);
                }
            }
        }
Beispiel #3
0
        private static Content CreateContent(InsertEventsQuery query, BinaryBufferWriter buffer)
        {
            buffer.Write(query.Events.Count);

            foreach (var @event in query.Events)
            {
                using (var eventBuilder = new BinaryEventBuilder(buffer, () => PreciseDateTime.UtcNow, Constants.EventProtocolVersion))
                {
                    eventBuilder
                    .SetTimestamp(@event.Timestamp)
                    .AddTags(@event.Tags);
                }
            }

            return(new Content(buffer.FilledSegment));
        }
Beispiel #4
0
 public static InsertEventsResult Insert(
     [NotNull] this IHerculesGateClient client,
     [NotNull] InsertEventsQuery query,
     TimeSpan timeout,
     CancellationToken cancellationToken = default) =>
 client.InsertAsync(query, timeout, cancellationToken).GetAwaiter().GetResult();