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; })); }
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); } }
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); }
long GetEpoch(ref RawMessage.Entry entry) { return(GetEpoch(entry.DateTicks)); }
QueueLengthEntry ToEntryDto(RawMessage.Entry ei) { return(new QueueLengthEntry { DateTicks = ei.DateTicks, Value = ei.Value }); }