public async Task <IEnumerable <ResourceUsage> > GetUsagesAsync( IEnumerable <SubscriptionModel> subscriptions, DateTime startTime, DateTime endTime) { var resourceUsages = new List <ResourceUsage>(); using (var client = new RateCardClient(this.context.ARMAccessToken, this.context.ARMBaseUri)) { // TODO: revisit here to check whether contains non resource id specific usages, e.g. legacy resources. foreach (var subscription in subscriptions) { IEnumerable <UsageAggregate> usages; try { usages = await client.GetUsagesAsync(subscription.SubscriptionId, startTime, endTime); } catch (CloudException ex) { if (this.context.ARMBaseUri == new AzureEnvironmentHelper("AzureChinaCloud").ResourceManagerEndpoint && ex.Message.StartsWith("The resource type could not be found in the namespace 'Microsoft.Commerce'", StringComparison.OrdinalIgnoreCase)) { // Skip usage retrieving since the RP is not available yet in Azure China Cloud usages = new UsageAggregate[] { }; } else { throw; } } var resourceIds = new HashSet <string>( subscription.ResourceGroups .SelectMany(r => r.Value) .Select(m => m.Id) .Distinct(), StringComparer.OrdinalIgnoreCase); resourceUsages.AddRange(usages .Where(u => resourceIds.Contains(u.ResourceUri)) .GroupBy(u => new { resourceUri = u.ResourceUri, meterId = u.Properties.MeterId }) .Select(g => new ResourceUsage { ResourceUri = g.Key.resourceUri, MeterId = g.Key.meterId, Quantity = g.Sum(m => m.Properties.Quantity) })); } } return(resourceUsages); }
private void ValidateUsageAggregate(UsageAggregate ua) { Assert.NotNull(ua); Assert.NotNull(ua.Id); Assert.NotNull(ua.InstanceData); Assert.NotNull(ua.MeterId); Assert.NotNull(ua.Name); Assert.NotNull(ua.Quantity); Assert.NotNull(ua.SubscriptionId); Assert.NotNull(ua.Type); Assert.NotNull(ua.UsageEndTime); Assert.NotNull(ua.UsageStartTime); }
private static double CalcMeterPerUsage(UsageAggregate usage, Resource meter, TraceWriter log) => usage.Properties.Quantity * meter.MeterRates[0];