示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 public Task CollectAsync(CounterKey key, CounterMap counters, CancellationToken ct)
 {
     return(Task.WhenAll(targets.Select(x => x.CollectAsync(key, counters, ct))));
 }
示例#7
0
 public CounterMap(CounterMap source)
     : base(source)
 {
 }
示例#8
0
 public ValueTask AddAsync(T key, CounterMap counters,
                           CancellationToken ct = default)
 {
     return(inputQueue.Writer.WriteAsync(new Job(key, counters), ct));
 }
示例#9
0
 sealed record Job(T Key, CounterMap Counters);