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);
        }
示例#2
0
 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];