Esempio n. 1
0
 public static Summary.Child WithConsumerLabels(this Summary summary, ICompetingConsumer consumer)
 => summary.WithLabels(AppName, consumer.StreamName, consumer.GroupName);
 private string GetConsumerId(ICompetingConsumer consumer)
 {
     return(consumer.GetType().Name);
 }
Esempio n. 3
0
 public static Gauge.Child WithConsumerLabels(this Gauge counter, ICompetingConsumer consumer)
 => counter.WithLabels(AppName, consumer.StreamName, consumer.GroupName);
        private Func <EventStorePersistentSubscriptionBase, ResolvedEvent, Task> OnEventAppeared(ICompetingConsumer consumer)
        {
            return(async(sub, e) =>
            {
                DittoMetrics.ReceivedEvents.WithConsumerLabels(consumer).Inc();
                DittoMetrics.CurrentEvent.WithConsumerLabels(consumer).Set(e.OriginalEventNumber);

                if (!e.IsResolved) // Handle deleted streams
                {
                    _logger.Information("Event #{EventNumber} from {StreamName} is not resolved. Skipping", e.OriginalEventNumber, consumer.StreamName);

                    // log
                    DittoMetrics.UnresolvedEvents.WithConsumerLabels(consumer).Inc();
                    sub.Fail(e, PersistentSubscriptionNakEventAction.Skip, "Unresolved Event");
                    return;
                }

                double delaySeconds = (DateTime.UtcNow - e.Event.Created).TotalSeconds;

                DittoMetrics.ReplicationLatency.WithConsumerLabels(consumer).Observe(delaySeconds);

                if (!consumer.CanConsume(e.Event.EventType))
                {
                    _logger.Information("Unable to consume {EventType} #{EventNumber} from {StreamName}. Skipping", e.Event.EventType, e.OriginalEventNumber, consumer.StreamName);

                    DittoMetrics.SkippedEvents.WithConsumerLabels(consumer).Inc();
                    sub.Fail(e, PersistentSubscriptionNakEventAction.Skip, "Cannot consume");
                    return;
                }

                string consumerId = GetConsumerId(consumer);

                try
                {
                    await consumer.ConsumeAsync(e.Event.EventType, e);

                    DittoMetrics.ProcessedEvents.WithConsumerLabels(consumer).Inc();
                    sub.Acknowledge(e);
                }
                catch (Exception ex)
                {
                    DittoMetrics.FailedEvents.WithConsumerLabels(consumer).Inc();

                    _logger.Error(ex, "{Consumer} failed to handle {EventType} #{EventNumber} from {StreamName} in group {GroupName}",
                                  consumerId, e.Event.EventType, e.OriginalEventNumber, consumer.StreamName, consumer.GroupName);

                    sub.Fail(e, PersistentSubscriptionNakEventAction.Retry, ex.Message);
                }
            });
        }