Skip to content

ThomasVestergaard/Disruptor-net.Metrics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Disruptor-net.Metrics

Easy performance montoring of your disruptor ringbuffers.

It will:

  • Tell you how many items has been processed.
  • Min, max and average time (milliseconds) each item spent in the queue.
  • How much (percentage) of your ringbuffer is available.
  • Dump this data in your favorite logging framework via sinks (yes I stole the sink concept from serilog).

It will have a small impact on the overall performance of your ringbuffer. You need to choose carefully how you use it - If you log too much too often you will ruin performance. Play around with the settings to find your sweet spot.

Also available on nuget

https://www.nuget.org/packages/Disruptor-net.Metrics/

Usage - 3 easy steps

This example will output metrics every second to the console.

What ever you put in your ringbuffer, make it implement IRingBufferItem.

public class QueueItem : IRingBufferItem
    {
        public DateTimeOffset FirstTouchTime { get; set; }
        
        // All your other stuff here
        
        public void Update(QueueItem other)
        {
          ...
        }
    }

When you enqueue a new item, set FirstTouchTime to UtcNow

  public void Enqueue(QueueItem item)
        {
            var next = ringBuffer.Next();
            var entry = ringBuffer[next];
            entry.Update(item);
            entry.FirstTouchTime = DateTimeOffset.UtcNow;
            ringBuffer.Publish(next);
        }

Add the metrics eventhandler to your disruptor.

    var metricsEventHandler = new FixedSecondCountReporter<QueueItem>(new ColoredConsoleSink(), 1);    
    disruptor = Disruptor<QueueItem>(() => new QueueItem(), ringbufferSize, TaskScheduler.Default);

    disruptor.HandleEventsWith(eventHandler1, eventHandler2).Then(metricsEventHandler);
    
    ringBuffer = disruptor.Start();
    metricsEventHandler.Setup(ringBuffer); // Important: Do this AFTER disruptor.Start() has been run.

#License See the LICENSE file for license rights and limitations (MIT).

About

Easy performance montoring of your disruptor ringbuffers.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages