Azure Fluent API - AppServicePlanOperations.ListMetricsWithHttpMessagesAsync Returns InternalServerError
Azure Fluent API - AppServicePlanOperations.ListMetricsWithHttpMessagesAsync Returns InternalServerError
可以找到此方法的文档 here
这是我的代码:
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;
这是我得到的唯一详细异常:
One or more errors occurred. (Operation returned an invalid status code 'InternalServerError') ---> Microsoft.Rest.Azure.CloudException: Operation returned an invalid status code 'InternalServerError'
文档说 filter
是可选的,但事实并非如此(如果我传入 null
,我会收到 BadRequest)。我现在提供一个,现在它抛出一个内部服务器错误。
我已经在 azure-sdk-for-net
回购上提出了一个问题,但我希望其他人可以看看我的 filter
字符串是否有任何错误。
我也可以在使用您提到的代码时在我这边重现这个问题。我发现另一个 Microsoft.Azure.Management.Monitor.Fluent SDK 可用于列出资源的指标,它是 beta 版本。我自己做了一个demo,在我这边运行正常。
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;
}
}
}
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>
可以找到此方法的文档 here
这是我的代码:
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;
这是我得到的唯一详细异常:
One or more errors occurred. (Operation returned an invalid status code 'InternalServerError') ---> Microsoft.Rest.Azure.CloudException: Operation returned an invalid status code 'InternalServerError'
文档说 filter
是可选的,但事实并非如此(如果我传入 null
,我会收到 BadRequest)。我现在提供一个,现在它抛出一个内部服务器错误。
我已经在 azure-sdk-for-net
回购上提出了一个问题,但我希望其他人可以看看我的 filter
字符串是否有任何错误。
我也可以在使用您提到的代码时在我这边重现这个问题。我发现另一个 Microsoft.Azure.Management.Monitor.Fluent SDK 可用于列出资源的指标,它是 beta 版本。我自己做了一个demo,在我这边运行正常。
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;
}
}
}
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>