/// <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); } } }
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)); }
public static InsertEventsResult Insert( [NotNull] this IHerculesGateClient client, [NotNull] InsertEventsQuery query, TimeSpan timeout, CancellationToken cancellationToken = default) => client.InsertAsync(query, timeout, cancellationToken).GetAwaiter().GetResult();