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

完了

ストレージ メトリックを理解して、どのメトリックを調べ、これらのメトリックがストレージ アカウントの状態について何を示しているのかを把握することが重要です。 Azure Storage メトリックを使用すると、アプリケーションの使用状況の傾向を分析し、ストレージ アカウントで発生する可能性のある問題を診断できます。

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

メトリックを理解する

ストレージ メトリックは自動的にキャプチャされるため、収集を開始するために任意の種類の設定を有効にする必要はありません。 Azure Storage によってこれらのメトリックが生成され、Azure Monitor データ プラットフォームに格納されます。 Azure Monitor では、ストレージ アカウント レベルとストレージ サービス レベル (Blob Storage や File Storage など) の両方で 、容量 メトリックと トランザクション メトリックが収集されます。

容量メトリック

容量メトリックは、データ ストレージを記述します (たとえば、格納されているバイト数、ストレージで使用可能なバイト数など)。 容量メトリックの値は毎日更新されます (最大 24 時間)。 時間グレインは、メトリック値が表示される時間間隔を定義します。 すべての容量メトリックでサポートされる時間グレインは 1 時間 (PT1H) です。

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

トランザクション メトリックは、アカウント アクティビティ (たとえば、トランザクションの数や読み取られたバイト数) を表します。 トランザクション メトリックは、Azure Storage から Azure Monitor へのストレージ アカウントに対するすべての要求で出力されます。 特定の時間範囲内にストレージ アカウントにアクティビティがない場合、その期間中にトランザクション メトリックは報告されません。 時間グレインは、メトリック値が表示される時間間隔を定義します。 すべてのトランザクション メトリックでサポートされる時間グレインは、PT1H と PT1M です。

メトリック値の構造

時間範囲、時間間隔、メトリック名前空間、メトリック名、集計の種類を指定することで、メトリック値を取得できます。 各要素の説明を次に示します。

要素 説明
時間範囲 キャプチャする期間 (例: 昨日または先月)。
時間間隔 メトリック値によって反映される時間の粒度。 (例: 1 時間または 1 日を反映する値)。
メトリック名前空間 メトリックの名前空間。 名前空間では、メトリックをストレージ アカウント レベルで取得するか、特定のストレージ サービスのレベルで取得するかを指定します (例: File Storage)。
指標名 関心のあるメトリック (例: エグレス)。
集約 その値をどのように計算したいか。 ほとんどの場合、 合計 または 平均を選択します。

ディメンションをサポートするメトリックについては、目的のディメンション値でメトリックをフィルター処理できます。 ディメンションは、メトリック値を記述するためにより多くのデータを保持する名前と値のペアです。 たとえば、認証の種類はトランザクションのディメンションです。 アカウント キーを使用して承認されたトランザクションのみを表示する場合は、認証ディメンションを使用し、アカウント キーでフィルター処理できます。

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

メトリックの表示と分析

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

Azure Portal

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

次の図は、過去 24 時間のトランザクションの合計数を取得するメトリック構成を示しています。 各データ ポイントには、15 分のデータが反映されます。

メトリックス エクスプローラーでトランザクション メトリックを取得する方法を示すスクリーンショット。

次の図は、読み取りトランザクションのみを取得するために使用されている API ディメンションを示しています。

メトリックス エクスプローラーでのディメンションの適用を示すスクリーンショット。

コマンド ラインとスクリプト

メトリックを取得するには、コマンド ラインを使用してコマンドを実行するか、スケジュールされたタスク (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(Azure コマンドライン インターフェイス)

az monitor metrics list コマンドを使用してメトリック値を取得できます。 この例では、ストレージ アカウントの読み取りトランザクションの合計数を取得します。

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

アプリケーション コード

メトリック値を取得するには、いずれかのソフトウェア開発キット (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.
    }
}