Search code examples
c#azureazure-sdk-.netazure-app-service-plansazure-sdk

Azure Fluent API - AppServicePlanOperations.ListMetricsWithHttpMessagesAsync Returns InternalServerError


The documentation for this method can be found here

Here is my code:

        var appServiceManager = AppServiceManager.Authenticate(credentials, subscriptionId);
        var filter = "(name.value eq 'CpuPercentage') and startTime eq '2017-10-06T08:00:00Z' and endTime eq '2017-10-06T09:00:00Z' and timeGrain eq duration'PT1H'";
        var metrics = appServiceManager.AppServicePlans.Inner.ListMetricsWithHttpMessagesAsync("myResourceGroupName", "myAppServicePlanName", false, filter).Result;    

This is the only detailed exception I get:

One or more errors occurred. (Operation returned an invalid status code 'InternalServerError') ---> Microsoft.Rest.Azure.CloudException: Operation returned an invalid status code 'InternalServerError'

The documentation says that filter is optional, which it's not (I get a BadRequest if I pass in null). I'm now providing one and now it throws an internal server error.

I've opened an issue on the azure-sdk-for-net repo but I'm hoping someone else can see if I'm making any mistakes in my filter string.


Solution

  • I also can reproduce this issue on my side when using the code you mentioned. I find another Microsoft.Azure.Management.Monitor.Fluent SDK could be used for list the metrics of the resource, it is a beta version. I do a demo on my side, it works correctly on my side.

    using Microsoft.Azure.Management.Fluent.ServiceBus;
    using Microsoft.Azure.Management.Fluent.ServiceBus.Models;
    using Microsoft.Rest.Azure.Authentication;
    using Microsoft.Rest.Azure.OData;
    
    namespace MonitorDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                var azureTenantId = "tenant Id";
                var azureSecretKey = "secret key";
                var azureAppId = "azure AD application Id";
                var subscriptionId = "subscription Id";
                var resourceGroup = "resource group name";
                var servicePlanName = "service plan name";
                var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(azureTenantId, azureAppId, azureSecretKey).Result;
                MonitorClient monitorClient = new MonitorClient(serviceCreds) { SubscriptionId = subscriptionId };
                var resourceUri = $"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/serverfarms/{servicePlanName}"; // resource id
                var metricNames = "name.value eq 'CpuPercentage'"; // could be concatenated with " or name.value eq '<another name>'" ... inside parentheses for more than one name.
    
                // The $filter can include time grain, which is optional when metricNames is present. The is forms a conjunction with the list of metric names described above.
                string timeGrain = " and timeGrain eq duration'PT5M'";
    
                // The $filter can also include a time range for the query; also a conjunction with the list of metrics and/or the time grain. Defaulting to 3 hours before the time of execution for these datetimes
                string startDate = " and startTime eq 2017-10-06T08:00:00Z";
                string endDate = " and endTime eq 2017-10-06T09:00:00Z";
    
                var odataFilterMetrics = new ODataQuery<MetricInner>(
                    $"{metricNames}{timeGrain}{startDate}{endDate}");
    
                var metrics = monitorClient.Metrics.ListWithHttpMessagesAsync(resourceUri, odataFilterMetrics).Result;
            }
        }
    }
    

    enter image description here

    packages.config

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Microsoft.Azure.Management.Monitor.Fluent" version="1.3.0-beta" targetFramework="net47" />
      <package id="Microsoft.Azure.Management.ResourceManager.Fluent" version="1.3.0" targetFramework="net47" />
      <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.28.3" targetFramework="net47" />
      <package id="Microsoft.Rest.ClientRuntime" version="2.3.9" targetFramework="net47" />
      <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.10" targetFramework="net47" />
      <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.3.1" targetFramework="net47" />
      <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net47" />
    </packages>