使用存储指标进行故障排除

已完成

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

在本单元中,你将了解 Azure Monitor 中的指标。 具体而言,它报告的信息以及如何使用它提供的指标来识别应用程序如何使用 Azure 存储的问题。

了解指标

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

容量度量值

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

交易指标

事务指标描述帐户活动(例如:事务数或读取的字节数)。 从 Azure 存储到 Azure Monitor 的每个存储帐户请求都会发出事务指标。 如果某个时间范围内没有存储帐户上的活动,则在该时间范围内没有报告事务指标。 时间粒度定义指标值的显示时间间隔。 所有事务指标支持的时间粒度为 PT1H 和 PT1M。

指标值的剖析

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

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

对于支持维度的指标,可使用所需的维度值筛选指标。 维度是包含更多数据来描述指标值的名称/值对。 例如,身份验证类型作为事务维度。 如果只想查看使用帐户密钥授权的事务,可以使用身份验证维度并筛选帐户密钥。

ResponseType 维度显示成功率和失败率,以及失败的原因,例如超时、限制、网络错误、授权失败等。 此信息可让你深入了解应用程序性能可能遭受的原因。 例如,频繁的限流和超时错误可能表明有限资源上出现了较高级别的争用,您可能需要重新架构您的系统,使其使用存储帐户的高级层级而不是标准层级。 可能还需要将负载分散到多个存储帐户,或者为应用程序正在使用的任何 Blob 容器和表选择不同的组织。

查看和分析指标

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

Azure 门户

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

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

显示在指标资源管理器中获取事务指标的屏幕截图。

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

显示在指标资源管理器中应用维度的屏幕截图。

命令行和脚本

可以使用命令行运行命令,或者在脚本中排列命令,以便稍后作为计划任务(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" 

应用程序代码

可以通过编写使用任何软件开发工具包(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.
    }
}