示例#1
0
        public void MetricAggregationByInstanceIsScopedToLogicalEndpoint()
        {
            var processingTimeStore = new ProcessingTimeStore();
            var endpointRegistry    = new EndpointRegistry();

            var apiController = CreateConroller(processingTimeStore, endpointRegistry);

            var instanceAId = new EndpointInstanceId("EndpointA", "instance");
            var instanceBId = new EndpointInstanceId("EndpointB", "instance");

            endpointRegistry.Record(instanceAId);
            endpointRegistry.Record(instanceBId);

            var period = HistoryPeriod.FromMinutes(DiagramApiController.DefaultHistory);
            var now    = DateTime.UtcNow.Subtract(new TimeSpan(period.IntervalSize.Ticks * period.DelayedIntervals));

            var dataA = new RawMessage.Entry {
                DateTicks = now.Ticks, Value = 5
            };
            var dataB = new RawMessage.Entry {
                DateTicks = now.Ticks, Value = 10
            };

            processingTimeStore.Store(new[] { dataA }, instanceAId, EndpointMessageType.Unknown(instanceAId.EndpointName));
            processingTimeStore.Store(new[] { dataB }, instanceBId, EndpointMessageType.Unknown(instanceBId.EndpointName));

            var result = apiController.GetSingleEndpointMetrics(instanceAId.EndpointName);

            var contentResult = result as OkNegotiatedContentResult <MonitoredEndpointDetails>;
            var model         = contentResult.Content;

            Assert.AreEqual(5, model.Instances[0].Metrics["ProcessingTime"].Average);
        }
        static Task <LongHistogram> StartReporter(int sendReportEvery, int numberOfEntriesInReport, CancellationTokenSource source, EndpointInstanceId instance, Action <RawMessage.Entry[], EndpointInstanceId> store)
        {
            return(Task.Run(async() =>
            {
                var entries = new RawMessage.Entry[numberOfEntriesInReport];
                var histogram = CreateTimeHistogram();

                while (source.IsCancellationRequested == false)
                {
                    var now = DateTime.UtcNow;

                    for (var i = 0; i < entries.Length; i++)
                    {
                        entries[i].DateTicks = now.AddMilliseconds(100 * i).Ticks;
                        entries[i].Value = i;
                    }

                    var start = Stopwatch.GetTimestamp();
                    store(entries, instance);
                    var elapsed = Stopwatch.GetTimestamp() - start;
                    histogram.RecordValue(elapsed);

                    await Task.Delay(sendReportEvery).ConfigureAwait(false);
                }

                return histogram;
            }));
        }
示例#3
0
        void UpdateQueueLengthStore()
        {
            var nowTicks = DateTime.UtcNow.Ticks;

            foreach (var endpointQueueLengthPair in queueLengths)
            {
                var queueLengthEntry = new RawMessage.Entry
                {
                    DateTicks = nowTicks,
                    Value     = endpointQueueLengthPair.Value.Length
                };

                store.Store(new[] { queueLengthEntry }, endpointQueueLengthPair.Key);
            }
        }
示例#4
0
            void Report(ref RawMessage.Entry entry)
            {
                var epoch      = GetEpoch(ref entry);
                var epochIndex = epoch % size;

                if (intervals[epochIndex].Epoch == epoch)
                {
                    intervals[epochIndex].TotalTime         += entry.Value;
                    intervals[epochIndex].TotalMeasurements += 1;
                }
                else
                {
                    // only if epoch is newer than the one written before, overwrite
                    // this ensures that old, out-of-order messages do not flush the existing data
                    if (epoch > intervals[epochIndex].Epoch)
                    {
                        intervals[epochIndex].Epoch             = epoch;
                        intervals[epochIndex].TotalTime         = entry.Value;
                        intervals[epochIndex].TotalMeasurements = 1;
                    }
                }
            }
        public async Task MetricAggregationByInstanceIsScopedToLogicalEndpoint()
        {
            var processingTimeStore = new ProcessingTimeStore();
            var endpointRegistry    = new EndpointRegistry();

            var queryAction = CreateQuery(processingTimeStore, endpointRegistry);

            var instanceAId = new EndpointInstanceId("EndpointA", "instance");
            var instanceBId = new EndpointInstanceId("EndpointB", "instance");

            endpointRegistry.Record(instanceAId);
            endpointRegistry.Record(instanceBId);

            var period = HistoryPeriod.FromMinutes(MonitoredEndpointsModule.DefaultHistory);
            var now    = DateTime.UtcNow.Subtract(new TimeSpan(period.IntervalSize.Ticks * period.DelayedIntervals));

            var dataA = new RawMessage.Entry {
                DateTicks = now.Ticks, Value = 5
            };
            var dataB = new RawMessage.Entry {
                DateTicks = now.Ticks, Value = 10
            };

            processingTimeStore.Store(new[] { dataA }, instanceAId, EndpointMessageType.Unknown(instanceAId.EndpointName));
            processingTimeStore.Store(new[] { dataB }, instanceBId, EndpointMessageType.Unknown(instanceBId.EndpointName));

            var result = await queryAction(new
            {
                instanceAId.EndpointName
            }.ToDynamic(), new CancellationToken());

            var model = (MonitoredEndpointDetails)result.NegotiationContext.DefaultModel;


            Assert.AreEqual(5, model.Instances[0].Metrics["ProcessingTime"].Average);
        }
示例#6
0
 long GetEpoch(ref RawMessage.Entry entry)
 {
     return(GetEpoch(entry.DateTicks));
 }
示例#7
0
 QueueLengthEntry ToEntryDto(RawMessage.Entry ei)
 {
     return(new QueueLengthEntry {
         DateTicks = ei.DateTicks, Value = ei.Value
     });
 }