private async Task <ICollection <MetricValueSet> > Fetch(FetchData data) { CloudException thrown = null; try { var values = await MetricsClientFacade.ListValuesAsync( _credentials, data.ResourceId, data.MetricNames, "", data.TimeGrain, data.From, data.Till); return(values.MetricValueSetCollection.Value); } catch (CloudException e) { thrown = e; } if (thrown.Response.StatusCode == System.Net.HttpStatusCode.BadRequest && thrown.Message.Contains(TooManyValuesErrorMessage)) { if (!data.PartitionTresholdReached()) { return(await PartitionAndFetch(data)); } } throw thrown; }
//the limit seems to be 2880 metrics per request async System.Threading.Tasks.Task <ICollection <MetricValueSet> > GetMetricsForResourceId(string resourceId, TimeSpan forHistory, MetricsFilter filter) { var metricsResult = await MetricsClientFacade.ListDefinitionsAsync(_credentials, resourceId, null, null); var metrics = filter.FilterMetrics(metricsResult.MetricDefinitionCollection.Value.Where(_ => _.MetricAvailabilities.Any()).ToList()); if (!metrics.Any()) { return(new MetricValueSet[0]); } var minTimeGrain = metrics.SelectMany(_ => _.MetricAvailabilities.Where(ma => forHistory < ma.Retention).Select(a => a.TimeGrain)).Min(); var metricNames = metrics.Select(_ => _.Name).ToList(); var till = DateTime.UtcNow.AddMinutes(1); var from = till.Add(forHistory.Negate()); return(await Fetch(new FetchData { ResourceId = resourceId, MetricNames = metricNames, TimeGrain = minTimeGrain, From = from, Till = till })); }