스토리지 메트릭을 사용하여 문제 해결
검사할 메트릭과 이러한 메트릭이 스토리지 계정 상태에 대해 어떤 정보를 제공하는지를 알 수 있도록 스토리지 메트릭을 이해하는 것이 중요합니다. 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입니다.
메트릭 값의 분석
시간 범위, 시간 간격, 메트릭 네임스페이스, 메트릭 이름 및 집계 유형을 제공하여 메트릭 값을 가져올 수 있습니다. 다음은 각 요소에 대한 설명입니다.
요소 | Description |
---|---|
시간 범위 | 캡처하려는 기간(예: 어제 또는 지난 달)입니다. |
시간 간격 | 메트릭 값에 의해 반영되는 시간의 세분성 (예: 1시간 또는 1일을 반영하는 값). |
메트릭 네임스페이스 | 메트릭의 네임스페이스 스토리지 계정 수준에서 메트릭을 가져올지 또는 특정 스토리지 서비스 수준(예: File Storage)에서 메트릭을 가져올지 여부를 지정합니다. |
메트릭 이름 | 관심 있는 메트릭(예: 송신)입니다. |
집계 | 해당 값을 계산하는 방법 대부분의 경우 합계 또는 평균을 선택합니다. |
차원을 지원하는 메트릭의 경우 원하는 차원 값을 사용하여 메트릭을 필터링할 수 있습니다. 차원은 메트릭 값을 설명하도록 추가 데이터를 전송하는 이름/값 쌍입니다. 예를 들어 인증 유형은 트랜잭션의 차원입니다. 계정 키를 사용하여 권한이 부여된 트랜잭션만 확인하려는 경우 인증 차원을 사용하고 계정 키를 필터링할 수 있습니다.
ResponseType 차원은 성공 및 실패 비율, 오류 사유(예: 시간 초과, 제한, 네트워크 오류, 권한 부여 오류 등)를 보여줍니다. 이 정보는 애플리케이션의 성능이 저하될 수 있는 이유에 대한 유용한 정보를 제공합니다. 예를 들어, 잦은 제한 및 시간 초과 오류는 제한된 리소스에 대해 높은 수준의 경합이 발생하고 있음을 나타낼 수 있으며, 스토리지 계정에 대해 표준 계층이 아닌 프리미엄 계층을 사용하도록 시스템을 다시 설계해야 할 수도 있습니다. 부하를 여러 스토리지 계정에 분산하거나 애플리케이션에서 사용하는 모든 blob 컨테이너 및 테이블에 대해 다른 조직을 선택해야 할 수도 있습니다.
메트릭 보기 및 분석
Azure Portal, PowerShell, Azure CLI를 사용하거나 Azure 클라이언트 라이브러리를 대상으로 하는 코드를 사용하여 메트릭 값을 가져올 수 있습니다.
Azure portal
이전 단원에서는 Azure Portal에서 메트릭을 보는 다양한 방법을 제시했습니다. 메트릭 탐색기를 사용하여 해당 뷰에 표시되는 요소를 정의할 수 있습니다. 메트릭 탐색기에서 분석하려는 각 값에 대한 시간 범위, 시간 간격, 메트릭 네임스페이스, 메트릭 및 집계를 지정할 수 있습니다. 차원별로 필터링할 수도 있습니다. 이러한 메트릭을 기반으로 차트를 만든 다음 나중에 쉽게 액세스할 수 있도록 대시보드에 고정할 수 있습니다.
다음 이미지는 지난 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"
애플리케이션 코드
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.
}
}