public static CounterMap ForChannel(string channel, ProcessStatus status, int count = 1) { var result = new CounterMap(); switch (status) { case ProcessStatus.Attempt when SupportPending: result.Increment(ChannelAttmept(channel), count); break; case ProcessStatus.Skipped: result.Increment(ChannelSkipped(channel), count); break; case ProcessStatus.Handled: result.Increment(ChannelHandled(channel), count); break; case ProcessStatus.Failed: result.Increment(ChannelFailed(channel), count); break; } return(result); }
private async Task Process() { try { await foreach (var batch in writeQueue.Reader.ReadAllAsync()) { if (batch.Length == 0) { continue; } try { var commands = new List <(T, CounterMap)>(); foreach (var group in batch.GroupBy(x => x.Key)) { if (group.Count() == 1) { commands.Add((group.Key, group.First().Counters)); } else { var merged = new CounterMap(); foreach (var item in group) { foreach (var(key, value) in item.Counters) { merged.Increment(key, value); } } commands.Add((group.Key, merged)); } } if (commands.Count > 0) { await store.BatchWriteAsync(commands, default); } } catch (Exception ex) { log.LogError(ex, "Failed to writer counters."); } } } catch (OperationCanceledException) { return; } }
public ValueTask AddAsync(T group, CounterMap newCounters) { readerWriterLock.EnterReadLock(); try { counters.AddOrUpdate(group, newCounters, (k, c) => c.IncrementWithLock(newCounters)); } finally { readerWriterLock.ExitReadLock(); } if (counters.Count >= maxSize) { timer.SkipCurrentDelay(); } return(default);
public static CounterMap ForNotification(ProcessStatus status, int count = 1) { var result = new CounterMap(); switch (status) { case ProcessStatus.Attempt when SupportPending: result.Increment(NotificationsAttempt, count); break; case ProcessStatus.Handled: result.Increment(NotificationsHandled, count); break; case ProcessStatus.Failed: result.Increment(NotificationsFailed, count); break; } return(result); }
public CounterMap IncrementWithLock(CounterMap counters) { var taken = false; slimLock.Enter(ref taken); try { foreach (var(key, value) in counters) { Increment(key, value); } } finally { if (taken) { slimLock.Exit(); } } return(this); }
public Task CollectAsync(CounterKey key, CounterMap counters, CancellationToken ct) { return(Task.WhenAll(targets.Select(x => x.CollectAsync(key, counters, ct)))); }
public CounterMap(CounterMap source) : base(source) { }
public ValueTask AddAsync(T key, CounterMap counters, CancellationToken ct = default) { return(inputQueue.Writer.WriteAsync(new Job(key, counters), ct)); }
sealed record Job(T Key, CounterMap Counters);