通过存储指标进行故障排除

已完成

请务必了解存储指标,以便了解要检查哪些指标,以及这些指标提供了哪些存储帐户状态相关信息。 使用 Azure 存储指标,你可以分析应用程序的使用趋势,并诊断存储帐户可能存在的问题。

在本单元中,你将了解 Azure Monitor 中的指标、它报告的信息,以及如何使用它提供的指标来确定应用程序使用 Azure 存储时遇到的问题。

了解指标

存储指标是自动捕获的,因此无需启用任何类型的设置即可开始收集它们。 Azure 存储会生成这些指标,并将其存储在 Azure Monitor 数据平台中。 Azure Monitor 在存储帐户级别和存储服务级别(例如:Blob 存储或文件存储)收集“容量”指标和“事务”指标。

容量度量值

容量指标描述数据的存储(例如:存储的字节数、仍可存储的字节数)。 容量指标值每天(最长 24 小时)刷新一次。 时间粒度定义呈现指标值的时间间隔。 所有容量指标的受支持时间粒度为一小时 (PT1H)。

事务度量值

事务指标描述帐户活动(例如:事务数或读取的字节数)。 从 Azure 存储到 Azure Monitor 的每个存储帐户请求都会发出事务指标。 如果存储帐户中没有任何活动,则在此期间不会有关于事务指标的数据。 时间粒度定义呈现指标值的时间间隔。 所有事务指标的受支持时间粒度为 PT1H 和 PT1M。

指标值的剖析

你可以通过提供时间范围、时间间隔、指标命名空间、指标名称和聚合类型来获取指标值。 下面是各个元素的说明:

元素 说明
时间范围 要捕获的时间段(例如:昨天或上个月)。
时间间隔 指标值反映的时间粒度。 (例如:表示 1 小时或 1 天的值)。
指标命名空间 指标的命名空间。 该元素指定是在存储帐户级别获取指标,还是在特定存储服务级别(例如:文件存储)获取指标。
指标名称 你感兴趣的指标(例如:流出量)。
聚合 你希望如何计算该值。 在大多数情况下,可以选择求和或平均值。

对于支持维度的指标,可使用所需的维度值筛选指标。 维度是携带附加数据来描述指标值的名称/值对。 例如,身份验证类型是事务的一个维度。 如果希望仅看到使用帐户密钥授权的事务,可以使用身份验证维度并根据帐户密钥进行筛选。

“类型”维度可揭示成功率和失败率,以及失败原因,例如超时、限制、网络错误、授权失败等。 通过此信息,可以很好地了解应用程序的性能受影响的原因。 例如,频繁的限制和超时错误可能表示激烈争用有限的资源,可能需要重新架构系统,让存储帐户使用高级层而非标准层。 可能还需要将负载分散到多个存储帐户,或者为应用程序所使用的任何 blob 容器和表选择不同的组织。

查看和分析指标

可以使用 Azure 门户、PowerShell、Azure CLI 或使用面向 Azure 客户端库的代码来获取指标值。

Azure 门户

上一单元提供了在 Azure 门户中查看指标的不同方法。 可以使用指标资源管理器定义这些视图中显示的元素。 在指标资源管理器中,可以为要分析的每个值指定时间范围、时间间隔、指标命名空间、指标和聚合。 还可以按维度进行筛选。 可以基于这些指标创建图表,然后将其固定到仪表板,以便将来轻松访问。

下图显示了一个指标配置,用于获取过去 24 小时内的事务总数。 每个数据点反映 15 分钟的数据。

Screenshot that shows getting a transaction metric in Metrics Explorer.

下图显示了用于仅获取已读取事务的 API 维度。

Screenshot that shows applying a dimension in Metrics Explorer.

命令行和脚本

你可以通过在命令行上运行命令或者将命令安排在脚本中来获取指标,这些命令稍后可以在计划任务 (PowerShell) 或作业 (Azure CLI) 中运行。

PowerShell

可以使用 Get-AzMetric cmdlet 获取指标值。 此示例用于获取存储帐户的已读取事务总数。

$resourceId = "<resource-ID>"
$dimFilter = [String](New-AzMetricFilter -Dimension ApiName -Operator eq -Value "GetBlob" 3> $null)
Get-AzMetric -ResourceId $resourceId -MetricName Transactions -TimeGrain 01:00:00 -MetricFilter $dimFilter -AggregationType "Total"

Azure CLI

可以使用 az monitor metrics list 命令获取指标值。 此示例用于获取存储帐户的已读取事务总数。

az monitor metrics list --resource <resource-ID> --metric "Transactions" --interval PT1H --filter "ApiName eq 'GetBlob' " --aggregation "Total" 

应用程序代码

可以通过编写使用任何 Azure SDK 的代码来获取指标值。 以下示例使用用于 .NET 的 Azure SDK 获取存储帐户在指定时间段内中使用的平均 Blob 存储量。

public static async Task ReadStorageMetricValueTest()
{
    // Resource ID for blob storage
    var resourceId = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/blobServices/default";

    var subscriptionId = "<subscription-ID}";
    var tenantId = "<tenant-ID>";
    var applicationId = "<application-ID>";
    var accessKey = "<accessKey>";

    MonitorManagementClient readOnlyClient = AuthenticateWithReadOnlyClient(tenantId, applicationId, accessKey, subscriptionId).Result;

    Microsoft.Azure.Management.Monitor.Models.Response Response;

    string startDate = DateTime.Now.AddHours(-3).ToUniversalTime().ToString("o");
    string endDate = DateTime.Now.ToUniversalTime().ToString("o");
    string timeSpan = startDate + "/" + endDate;

    ODataQuery<MetadataValue> odataFilterMetrics = new ODataQuery<MetadataValue>(
        string.Format("BlobType eq '{0}'", "BlockBlob"));

    Response = readOnlyClient.Metrics.List(
                    resourceUri: resourceId,
                    timespan: timeSpan,
                    interval: System.TimeSpan.FromHours(1),
                    metricnames: "BlobCapacity",
                    odataQuery: odataFilterMetrics,
                    aggregation: "Average",
                    resultType: ResultType.Data);

    foreach (var metric in Response.Value)
    {
       // process value here.
    }
}