static DiagramApiController CreateConroller(ProcessingTimeStore processingTimeStore, EndpointRegistry endpointRegistry) { var criticalTimeStore = new CriticalTimeStore(); var retriesStore = new RetriesStore(); var queueLengthStore = new QueueLengthStore(); var settings = new Settings { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; var activityTracker = new EndpointInstanceActivityTracker(settings); var messageTypeRegistry = new MessageTypeRegistry(); var breakdownProviders = new IProvideBreakdown[] { processingTimeStore, criticalTimeStore, retriesStore, queueLengthStore }; var controller = new DiagramApiController(breakdownProviders, endpointRegistry, activityTracker, messageTypeRegistry) { Request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/monitored-endpoint") }; return(controller); }
public new void Setup() { endpointRegistry = new EndpointRegistry(); criticalTimeStore = new CriticalTimeStore(); processingTimeStore = new ProcessingTimeStore(); retriesStore = new RetriesStore(); queueLengthProvider = new FakeQueueLengthProvider(); queueLengthStore = new QueueLengthStore(); queueLengthProvider.Initialize(string.Empty, (entryDtos, dto) => queueLengthStore.Store(entryDtos.Select(e => ToEntry(e)).ToArray(), ToEndpointInputQueue(dto))); var settings = new Settings { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; activityTracker = new EndpointInstanceActivityTracker(settings); messageTypeRegistry = new MessageTypeRegistry(); var breakdownProviders = new IProvideBreakdown[] { criticalTimeStore, processingTimeStore, retriesStore, queueLengthStore }; var controller = new DiagramApiController(breakdownProviders, endpointRegistry, activityTracker, messageTypeRegistry) { Request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/monitored-endpoint") }; GetMonitoredEndpoints = () => controller.GetAllEndpointsMetrics(); GetMonitoredSingleEndpoint = endpointName => controller.GetSingleEndpointMetrics(endpointName); }
static Func <dynamic, CancellationToken, Task <dynamic> > CreateQuery(ProcessingTimeStore processingTimeStore, EndpointRegistry endpointRegistry) { var criticalTimeStore = new CriticalTimeStore(); var retriesStore = new RetriesStore(); var queueLengthStore = new QueueLengthStore(); var settings = new Settings { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; var activityTracker = new EndpointInstanceActivityTracker(settings); var messageTypeRegistry = new MessageTypeRegistry(); var breakdownProviders = new IProvideBreakdown[] { processingTimeStore, criticalTimeStore, retriesStore, queueLengthStore }; var monitoredEndpointsModule = new MonitoredEndpointsModule(breakdownProviders, endpointRegistry, activityTracker, messageTypeRegistry) { Context = new NancyContext() { Request = new Request("Get", "/monitored-endpoints/{endpointName}", "HTTP") } }; var queryAction = monitoredEndpointsModule.Routes.Single(r => r.Description.Path == "/monitored-endpoints/{endpointName}").Action; return(queryAction); }
public void Setup() { var settings = new Settings() { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; tracker = new EndpointInstanceActivityTracker(settings); }
public void Setup() { endpointRegistry = new EndpointRegistry(); criticalTimeStore = new CriticalTimeStore(); processingTimeStore = new ProcessingTimeStore(); retriesStore = new RetriesStore(); queueLengthProvider = new DefaultQueueLengthProvider(); queueLengthStore = new QueueLengthStore(); queueLengthProvider.Initialize(string.Empty, queueLengthStore); var settings = new Settings { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; activityTracker = new EndpointInstanceActivityTracker(settings); messageTypeRegistry = new MessageTypeRegistry(); var breakdownProviders = new IProvideBreakdown[] { criticalTimeStore, processingTimeStore, retriesStore, queueLengthStore }; var monitoredEndpointsModule = new MonitoredEndpointsModule(breakdownProviders, endpointRegistry, activityTracker, messageTypeRegistry) { Context = new NancyContext() { Request = new Request("Get", "/monitored-endpoints", "HTTP") } }; var dictionary = monitoredEndpointsModule.Routes.ToDictionary(r => r.Description.Path, r => r.Action); GetMonitoredEndpoints = () => dictionary["/monitored-endpoints"](new object(), new CancellationToken(false)); GetMonitoredSingleEndpoint = endpointName => dictionary["/monitored-endpoints/{endpointName}"](new { EndpointName = endpointName }.ToDynamic(), new CancellationToken()); }
public void Setup() { settings = new Settings { EndpointUptimeGracePeriod = TimeSpan.FromMinutes(5) }; activityTracker = new EndpointInstanceActivityTracker(settings); processingTimeStore = new ProcessingTimeStore(); endpointRegistry = new EndpointRegistry(); var messageTypeRegistry = new MessageTypeRegistry(); var breakdownProviders = new IProvideBreakdown[] { processingTimeStore, new CriticalTimeStore(), new RetriesStore(), new QueueLengthStore() }; apiController = new DiagramApiController(breakdownProviders, endpointRegistry, activityTracker, messageTypeRegistry) { Request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/monitored-endpoint") }; }
static MonitoredEndpoint[] GetMonitoredEndpoints(EndpointRegistry endpointRegistry, EndpointInstanceActivityTracker activityTracker) { return(endpointRegistry.GetGroupedByEndpointName() .Select(endpoint => new MonitoredEndpoint { Name = endpoint.Key, EndpointInstanceIds = endpoint.Value.Select(i => i.InstanceId).ToArray(), IsStale = endpoint.Value.Any(activityTracker.IsStale) }) .ToArray()); }
static MonitoredEndpointInstance[] GetMonitoredEndpointInstances(EndpointRegistry endpointRegistry, string endpointName, EndpointInstanceActivityTracker activityTracker) { return(endpointRegistry.GetForEndpointName(endpointName) .Select(endpointInstance => new MonitoredEndpointInstance { Id = endpointInstance.InstanceId, Name = endpointInstance.InstanceName, IsStale = activityTracker.IsStale(endpointInstance) }).ToArray()); }
public DiagramApiController(IProvideBreakdown[] breakdownProviders, EndpointRegistry endpointRegistry, EndpointInstanceActivityTracker activityTracker, MessageTypeRegistry messageTypeRegistry) { this.breakdownProviders = breakdownProviders; this.endpointRegistry = endpointRegistry; this.activityTracker = activityTracker; this.messageTypeRegistry = messageTypeRegistry; }
/// <summary> /// Initializes the metric API module. /// </summary> public MonitoredEndpointsModule(IProvideBreakdown[] breakdownProviders, EndpointRegistry endpointRegistry, EndpointInstanceActivityTracker activityTracker, MessageTypeRegistry messageTypeRegistry) { var metricByInstanceLookup = breakdownProviders.OfType <IProvideBreakdownBy <EndpointInstanceId> >().ToDictionary(i => i.GetType()); var metricByQueueLookup = breakdownProviders.OfType <IProvideBreakdownBy <EndpointInputQueue> >().ToDictionary(i => i.GetType()); var metricByMessageTypeLookup = breakdownProviders.OfType <IProvideBreakdownBy <EndpointMessageType> >().ToDictionary(i => i.GetType()); var instanceMetrics = new[] { CreateMetric <EndpointInstanceId, ProcessingTimeStore>("ProcessingTime", Aggregator.ToAverages), CreateMetric <EndpointInstanceId, CriticalTimeStore>("CriticalTime", Aggregator.ToAverages), CreateMetric <EndpointInstanceId, RetriesStore>("Retries", Aggregator.ToTotalMeasurementsPerSecond), CreateMetric <EndpointInstanceId, ProcessingTimeStore>("Throughput", Aggregator.ToTotalMeasurementsPerSecond) }; var queueMetrics = new[] { CreateMetric <EndpointInputQueue, QueueLengthStore>("QueueLength", Aggregator.ToRoundedSumOfBreakdownAverages) }; var messageTypeMetrics = new[] { CreateMetric <EndpointMessageType, ProcessingTimeStore>("ProcessingTime", Aggregator.ToAverages), CreateMetric <EndpointMessageType, CriticalTimeStore>("CriticalTime", Aggregator.ToAverages), CreateMetric <EndpointMessageType, RetriesStore>("Retries", Aggregator.ToTotalMeasurementsPerSecond), CreateMetric <EndpointMessageType, ProcessingTimeStore>("Throughput", Aggregator.ToTotalMeasurementsPerSecond) }; var detailedMetrics = new HashSet <string> { "Throughput", "QueueLength", "ProcessingTime", "CriticalTime", "Retries" }; Get["/monitored-endpoints"] = parameters => { var endpoints = GetMonitoredEndpoints(endpointRegistry, activityTracker); var period = ExtractHistoryPeriod(); foreach (var metric in instanceMetrics) { var store = metricByInstanceLookup[metric.StoreType]; var intervals = store.GetIntervals(period, DateTime.UtcNow).ToLookup(k => k.Id.EndpointName); foreach (var endpoint in endpoints) { var values = metric.Aggregate(intervals[endpoint.Name].ToList(), period); endpoint.Metrics.Add(metric.ReturnName, values); } } foreach (var metric in queueMetrics) { var store = metricByQueueLookup[metric.StoreType]; var intervals = store.GetIntervals(period, DateTime.UtcNow).ToLookup(k => k.Id.EndpointName); foreach (var endpoint in endpoints) { var values = metric.Aggregate(intervals[endpoint.Name].ToList(), period); endpoint.Metrics.Add(metric.ReturnName, values); } } return(Negotiate.WithModel(endpoints)); }; Get["/monitored-endpoints/{endpointName}"] = parameters => { var endpointName = (string)parameters.EndpointName; var period = ExtractHistoryPeriod(); var instances = GetMonitoredEndpointInstances(endpointRegistry, endpointName, activityTracker); var digest = new MonitoredEndpointDigest(); var metricDetails = new MonitoredEndpointMetricDetails(); foreach (var metric in instanceMetrics) { var store = metricByInstanceLookup[metric.StoreType]; var intervals = store.GetIntervals(period, DateTime.UtcNow); var intervalsByEndpoint = intervals.ToLookup(k => k.Id.EndpointName); var endpointValues = metric.Aggregate(intervalsByEndpoint[endpointName].ToList(), period); if (detailedMetrics.Contains(metric.ReturnName)) { var details = new MonitoredValuesWithTimings { Points = endpointValues.Points, Average = endpointValues.Average, TimeAxisValues = GetTimeAxisValues(intervalsByEndpoint[endpointName]) }; metricDetails.Metrics.Add(metric.ReturnName, details); } var metricDigest = new MonitoredEndpointMetricDigest { Latest = endpointValues.Points.LastOrDefault(), Average = endpointValues.Average }; digest.Metrics.Add(metric.ReturnName, metricDigest); var intervalsByInstanceId = intervals.ToLookup(k => k.Id); foreach (var instance in instances) { var instanceId = new EndpointInstanceId(endpointName, instance.Id, instance.Name); var instanceValues = metric.Aggregate(intervalsByInstanceId[instanceId].ToList(), period); instance.Metrics.Add(metric.ReturnName, instanceValues); } } foreach (var metric in queueMetrics) { var store = metricByQueueLookup[metric.StoreType]; var intervals = store.GetIntervals(period, DateTime.UtcNow); var intervalsByEndpoint = intervals.ToLookup(k => k.Id.EndpointName); var endpointValues = metric.Aggregate(intervalsByEndpoint[endpointName].ToList(), period); if (detailedMetrics.Contains(metric.ReturnName)) { var details = new MonitoredValuesWithTimings { Points = endpointValues.Points, Average = endpointValues.Average, TimeAxisValues = GetTimeAxisValues(intervalsByEndpoint[endpointName]) }; metricDetails.Metrics.Add(metric.ReturnName, details); } var metricDigest = new MonitoredEndpointMetricDigest { Latest = endpointValues.Points.LastOrDefault(), Average = endpointValues.Average }; digest.Metrics.Add(metric.ReturnName, metricDigest); } var messageTypes = GetMonitoredMessageTypes(messageTypeRegistry.GetForEndpointName(endpointName)); foreach (var metric in messageTypeMetrics) { var store = metricByMessageTypeLookup[metric.StoreType]; var intervals = store.GetIntervals(period, DateTime.UtcNow).ToLookup(k => k.Id); foreach (var messageType in messageTypes) { var values = metric.Aggregate(intervals[new EndpointMessageType(endpointName, messageType.Id)].ToList(), period); messageType.Metrics.Add(metric.ReturnName, values); } } var data = new MonitoredEndpointDetails { Digest = digest, Instances = instances, MessageTypes = messageTypes, MetricDetails = metricDetails }; return(Negotiate.WithModel(data)); }; }