ストレージ メトリックを使用してトラブルシューティングを行う

完了

ストレージ メトリックについて理解し、調べる必要のあるメトリック、およびこれらのメトリックについて示されるストレージ アカウントの状態について、知っておくことが重要です。 Azure Storage のメトリックを使うと、アプリケーションによる使用の傾向を分析し、ストレージ アカウントで可能性のある問題を診断することができます。

このユニットでは、Azure Monitor でのメトリック、それによって報告される情報、およびそれによって提供されるメトリックを使ってアプリケーションによる Azure Storage の使用方法に関する問題を特定する方法について学習します。

メトリックを理解する

Storage のメトリックは自動的に取り込まれるため、収集を開始するために何らかの設定を有効にする必要はありません。 これらのメトリックは Azure Storage が生成し、Azure Monitor データ プラットフォームに格納されます。 Azure Monitor は、容量メトリックとトランザクション メトリックをストレージ アカウント レベルとストレージ サービス レベル (例: BLOB Storage や File Storage) の両方のレベルで収集します。

容量メトリック

容量メトリックは、データ ストレージを表します (例: 格納されているバイト数、ストレージにまだ使用できるバイト数)。 容量メトリックの値は毎日 (最大 24 時間) 更新されます。 時間グレインは、メトリック値が提供される時間間隔を定義します。 すべての容量メトリックに対して、1 時間 (PT1H) の時間グレインがサポートされます。

トランザクション メトリック

トランザクション メトリックは、アカウント アクティビティ (例: トランザクション数や読み取りバイト数) を表します。 トランザクション メトリックは、ストレージ アカウントへの要求ごとに、Azure Storage から Azure Monitor に出力されます。 ストレージ アカウントにアクティビティがない場合、その間はトランザクション メトリックのデータは存在しません。 時間グレインは、メトリック値が提供される時間間隔を定義します。 すべてのトランザクション メトリックに対してサポートされている時間グレインは PT1H と PT1M です。

メトリック値の構造

時間の範囲、期間、メトリック名前空間、メトリック名、集計の種類を指定して、メトリック値を取得できます。 各要素の説明は次のとおりです。

要素 説明
時間の範囲 取り込む期間 (例: 昨日や前月)。
間隔 メトリック値に反映される時間の単位。 (例: 1 時間または 1 日を示す値)。
メトリック名前空間 メトリックの名前空間。 これにより、ストレージ アカウント レベルでメトリックを取得するか、特定のストレージ サービス (例: File Storage) のレベルでメトリックを取得するかを指定します。
メトリックの名前 関心のあるメトリック (例: エグレス)。
集計 その値を計算する方法。 ほとんどの場合は、合計または平均のどちらかを選択します。

ディメンションをサポートするメトリックについては、目的のディメンション値でメトリックをフィルター処理できます。 ディメンションは、メトリック値を表すための追加データとしての名前と値のペアです。 たとえば、認証の種類はトランザクションの 1 つのディメンションです。 アカウント キーを使って認可されたトランザクションのみを知りたい場合は、認証ディメンションを使い、アカウント キーでフィルター処理できます。

ResponseType ディメンションにより、成功率と失敗率、失敗の原因 (タイムアウト、調整、ネットワーク エラー、認可エラーなど) を知ることができます。 この情報によって、アプリケーションのパフォーマンスが低下している理由を把握することができます。 たとえば、調整エラーやタイムアウト エラーが頻発している場合は、限られたリソースに対して高いレベルの競合が発生していることを示している可能性があり、ストレージ アカウントで Standard レベルではなく Premium レベルを使うように、システムを設計し直すことが必要な場合があります。 また、負荷を複数のストレージ アカウントに分散させたり、アプリケーションで使用している BLOB コンテナーとテーブルに対して別の組織を選択したりすることが必要になる場合もあります。

メトリックの表示と分析

メトリック値を取得するには、Azure portal、PowerShell、Azure CLI を使用するか、Azure クライアント ライブラリを対象とするコードを使用します。

Azure portal

前のユニットでは、Azure portal でメトリックを表示するさまざまな方法を紹介しました。 メトリックス エクスプローラーを使用して、これらのビューに表示される要素を定義できます。 メトリックス エクスプローラーでは、分析する各値の時間範囲、時間間隔、メトリック名前空間、メトリック、集計を指定できます。 ディメンションでフィルター処理することもできます。 これらのメトリックに基づいてグラフを作成し、後でアクセスしやすいようにダッシュボードにピン留めすることができます。

次の図は、過去 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 コマンドレットを使用してメトリック値を取得できます。 この例では、ストレージ アカウントの読み取りトランザクションの合計数を取得します。

$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 のいずれかを使用するコードを記述することによってメトリック値を取得できます。 次の例では、Azure SDK for .NET を使用して、指定した期間にストレージ アカウントで使用された 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.
    }
}