如果你有依赖 Azure 资源的关键应用程序和业务流程,则需要监视这些资源的可用性、性能和操作。 本文介绍 Azure 表存储生成的监视数据,以及如何使用 Azure Monitor 的各种功能分析这些数据的相关警报。
Monitor 概述
每种表存储资源的 Azure 门户“概述”页都包含资源使用情况(例如请求和每小时计费)的概述。 这些信息非常有用,但只提供少量监视数据。 创建资源后,其中的某些数据会自动收集,并可供分析。 你可以使用某些配置启用其他数据收集类型。
说明是 Azure Monitor?
Azure 表存储使用
Azure Monitor
来创建监视数据,Azure Monitor 是 Azure 中的一项完整堆栈监视服务。 Azure Monitor 提供了一整套用于监视 Azure 资源以及其他云和本地资源的功能。
可先阅读文章
使用 Azure Monitor 监视 Azure 资源
,其中介绍了以下内容:
说明是 Azure Monitor?
与监视相关的成本
监视 Azure 中收集的数据
配置数据收集
Azure 中用于分析监视数据并就其发出警报的标准工具
本文中的以下各部分将介绍从 Azure 存储收集的特定数据。 其中的示例演示了如何配置数据收集并通过 Azure 工具分析这些数据。
Azure 表存储会收集与其他 Azure 资源类型相同的监视数据,如
监视 Azure 资源中的数据
中所述。
有关 Azure 表存储创建的指标和日志指标的详细信息,请参阅
Azure 表存储监视数据参考
。
Azure Monitor 中的指标和日志仅支持 Azure 资源管理器存储帐户。 Azure Monitor 不支持经典存储帐户。 如果要使用经典存储帐户上的指标或日志,则需要迁移到 Azure 资源管理器存储帐户。 请参阅
迁移到 Azure 资源管理器
。
如果需要,可以继续使用经典指标和日志。 实际上,经典指标和日志可与 Azure Monitor 中的指标和日志同时使用。 在 Azure 存储终止旧指标和日志的服务之前,支持范围保持不变。
收集和路由
平台指标和活动日志会自动收集,但你可以使用诊断设置将其路由到其他位置。
在创建诊断设置并将其路由到一个或多个位置之前,不会收集和存储资源日志。
要收集资源日志,必须创建诊断设置。 创建设置时,选择“表”作为要为其启用日志的存储类型。 然后,指定需要收集日志的以下操作类别之一。
有关使用 Azure 门户、CLI 和 PowerShell 创建诊断设置的详细过程,请参阅
创建诊断设置以收集 Azure 中的平台日志和指标
。 还可以找到有关如何使用 Azure 资源管理器模板或 Azure Policy 定义来创建诊断设置的信息的链接。
有关一般目标限制,请参阅
目标限制
。 以下限制仅适用于监视 Azure 存储帐户。
无法将日志发送到使用此设置监视的同一存储帐户。
这将导致出现递归日志,其中某个日志条目描述的是另一个日志条目的写入。 必须创建帐户或使用其他现有帐户来存储日志信息。
不能设置保留策略。
如果将日志存档到存储帐户,可以通过定义生命周期管理策略来管理日志容器的保留策略。 要了解如何操作,请参阅
通过自动执行 Azure Blob 存储访问层来优化成本
。
如果将日志发送到 Log Analytics,可以在工作区级别管理 Log Analytics 的数据保留期,甚至可以按数据类型指定不同的保留设置。 若要了解如何操作,请参阅
更改数据保留期
。
有关所有 Azure Monitor 支持指标(包括 Azure 表存储)的列表,请参阅
Azure Monitor 支持的指标
。
Azure 门户
PowerShell
Azure CLI
你可以使用指标资源管理器通过其他 Azure 服务中的指标分析 Azure 存储的指标。 从 Azure Monitor 菜单中选择“指标”,可打开指标资源管理器 。 有关使用此工具的详细信息,请参阅
Azure 指标资源管理器入门
。
以下示例演示了如何查看帐户级别的事务。
对于支持维度的指标,可使用所需的维度值筛选指标。 以下示例演示了如何通过选择“API 名称”维度的值,在特定操作上查看帐户级别的“事务” 。
有关 Azure 存储支持的维度的完整列表,请参阅
指标维度
。
Azure 表存储的指标位于以下命名空间:
Microsoft.Storage/storageAccounts
Microsoft.Storage/storageAccounts/tableServices
列出指标定义
你可以列出存储帐户或表存储服务的指标定义。 请使用
Get-AzMetricDefinition
cmdlet。
在此示例中,将
<resource-ID>
占位符替换为整个存储帐户的资源 ID 或表存储服务的资源 ID。 你可以在 Azure 门户中存储帐户的“属性”页上找到这些资源 ID。
$resourceId = "<resource-ID>"
Get-AzMetricDefinition -ResourceId $resourceId
读取指标值
你可以读取存储帐户或表存储服务的帐户级别指标值。 使用 Get-AzMetric cmdlet。
$resourceId = "<resource-ID>"
Get-AzMetric -ResourceId $resourceId -MetricNames "UsedCapacity" -TimeGrain 01:00:00
读取包含维度的指标值
当指标支持维度时,可以通过使用维度值来读取指标值并对其进行筛选。 使用 Get-AzMetric cmdlet。
$resourceId = "<resource-ID>"
$dimFilter = [String](New-AzMetricFilter -Dimension ApiName -Operator eq -Value "QueryEntities" 3> $null)
Get-AzMetric -ResourceId $resourceId -MetricName Transactions -TimeGrain 01:00:00 -MetricFilter $dimFilter -AggregationType "Total"
列出帐户级指标定义
你可以列出存储帐户或表存储服务的指标定义。 使用 az monitor metrics list-definitions 命令。
在此示例中,将 <resource-ID> 占位符替换为整个存储帐户的资源 ID 或表存储服务的资源 ID。 你可以在 Azure 门户中存储帐户的“属性”页上找到这些资源 ID。
az monitor metrics list-definitions --resource <resource-ID>
读取帐户级指标值
你可以读取存储帐户或表存储服务的指标值。 请使用 az monitor metrics list 命令。
az monitor metrics list --resource <resource-ID> --metric "UsedCapacity" --interval PT1H
读取包含维度的指标值
当指标支持维度时,可以通过使用维度值来读取指标值并对其进行筛选。 请使用 az monitor metrics list 命令。
az monitor metrics list --resource <resource-ID> --metric "Transactions" --interval PT1H --filter "ApiName eq 'QueryEntities' " --aggregation "Total"
Azure Monitor 提供 .NET SDK,用于读取指标定义和值。 示例代码演示如何通过不同的参数来使用 SDK。 对于存储指标,需使用 0.18.0-preview 或更高版本。
在这些示例中,将 <resource-ID> 占位符替换为整个存储帐户或表存储服务的资源 ID。 你可以在 Azure 门户中存储帐户的“属性”页上找到这些资源 ID。
将 <subscription-ID> 占位符值替换为你的订阅 ID。 要查看有关如何获取 <tenant-ID>、<application-ID> 和 <AccessKey> 值的指南,请参阅使用门户创建可访问资源的 Azure AD 应用程序和服务主体。
列出帐户级指标定义
以下示例演示如何列出帐户级别的指标定义:
public static async Task ListStorageMetricDefinition()
var resourceId = "<resource-ID>";
var subscriptionId = "<subscription-ID>";
var tenantId = "<tenant-ID>";
var applicationId = "<application-ID>";
var accessKey = "<AccessKey>";
MonitorManagementClient readOnlyClient = AuthenticateWithReadOnlyClient(tenantId, applicationId, accessKey, subscriptionId).Result;
IEnumerable<MetricDefinition> metricDefinitions = await readOnlyClient.MetricDefinitions.ListAsync(resourceUri: resourceId, cancellationToken: new CancellationToken());
foreach (var metricDefinition in metricDefinitions)
// Enumrate metric definition:
// Id
// ResourceId
// Name
// Unit
// MetricAvailabilities
// PrimaryAggregationType
// Dimensions
// IsDimensionRequired
读取帐户级别指标值
以下示例演示如何读取帐户级别的 UsedCapacity 数据:
public static async Task ReadStorageMetricValue()
var resourceId = "<resource-ID>";
var subscriptionId = "<subscription-ID>";
var tenantId = "<tenant-ID>";
var applicationId = "<application-ID>";
var accessKey = "<AccessKey>";
MonitorClient 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;
Response = await readOnlyClient.Metrics.ListAsync(
resourceUri: resourceId,
timespan: timeSpan,
interval: System.TimeSpan.FromHours(1),
metricnames: "UsedCapacity",
aggregation: "Average",
resultType: ResultType.Data,
cancellationToken: CancellationToken.None);
foreach (var metric in Response.Value)
// Enumrate metric value
// Id
// Name
// Type
// Unit
// Timeseries
// - Data
// - Metadatavalues
读取多维指标值
对于多维指标,如果需要读取基于特定维度值的指标数据,则需定义元数据筛选器。
以下示例演示如何根据支持多维的指标读取指标数据:
public static async Task ReadStorageMetricValueTest()
// Resource ID for table storage
var resourceId = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/tableServices/default";
var subscriptionId = "<subscription-ID}";
// How to identify Tenant ID, Application ID and Access Key: https://azure.microsoft.com/documentation/articles/resource-group-create-service-principal-portal/
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;
// It's applicable to define meta data filter when a metric support dimension
// More conditions can be added with the 'or' and 'and' operators, example: BlobType eq 'BlockBlob' or BlobType eq 'PageBlob'
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)
//Enumrate metric value
// Id
// Name
// Type
// Unit
// Timeseries
// - Data
// - Metadatavalues
你可以将资源日志作为存储帐户中的 blob 以及事件数据进行访问,也可以通过 Log Analytics 查询访问资源日志。 有关如何查找这些日志的信息,请参阅 Azure 资源日志。
Azure Monitor 中的所有资源日志都具有后跟服务特定字段的相同字段。 Azure Monitor 资源日志架构概述了常见架构。 Azure 表存储资源日志的架构位于 Azure 表存储监视数据参考中。
若要获取记录的 SMB 和 REST 操作列表,请参阅存储记录的操作和状态消息。
仅在针对服务终结点发出请求时才会创建日志条目。 例如,如果存储帐户的文件终结点中存在活动,而表或队列终结点中没有该活动,则仅创建与 Azure Blob 存储服务有关的日志。 Azure 存储日志包含有关成功和失败的存储服务请求的详细信息。 可以使用该信息监视各个请求和诊断存储服务问题。 将最大程度地记录请求。
活动日志是位于 Azure 中的一种平台日志,可用于深入了解订阅级别的事件。 你可以单独查看它或将它路由到 Azure Monitor 日志,然后便可以在其中使用 Log Analytics 执行复杂得多的查询。
记录经过身份验证的请求
将记录以下类型的经过身份验证的请求:
成功的请求
失败的请求,包括超时、限制、网络、授权和其他错误
使用共享访问签名 (SAS) 或 OAuth 的请求,包括失败和成功的请求
对分析数据($logs 容器中的经典日志数据和 $metric 表中的类指标数据)的请求
不会记录表存储服务本身发出的请求,如创建或删除日志。 若要查看所记录数据的完整列表,请参阅存储记录的操作和状态消息和存储日志格式。
记录匿名请求
记录以下类型的匿名请求:
成功的请求
服务器错误
客户端和服务器的超时错误
失败的 GET 请求,错误代码为 304(未修改)
不会记录所有其他失败的匿名请求。 若要查看所记录数据的完整列表,请参阅存储记录的操作和状态消息和存储日志格式。
示例 Kusto 查询
如果将日志发送到 Log Analytics,则可以使用 Azure Monitor 日志查询访问这些日志。 有关详细信息,请参阅 Log Analytics 教程。
你可在“日志搜索”栏中输入下面这些查询,以帮助监视 Blob 存储。 这些查询使用新语言。
从存储帐户资源组菜单中选择“日志”时,会打开 Log Analytics 并将查询范围设置为当前资源组。 这意味着日志查询只包含来自该资源组的数据。 如果要运行的查询包含来自他资源或其他 Azure 服务的数据,请从“Azure Monitor”菜单中选择“日志”。 有关详细信息,请参阅 Azure Monitor Log Analytics 中的日志查询范围和时间范围。
使用以下查询可帮助你监视 Azure 存储帐户:
列出最近三天内 10 个最常见的错误。
StorageTableLogs
| where TimeGenerated > ago(3d) and StatusText !contains "Success"
| summarize count() by StatusText
| top 10 by count_ desc
列出最近三天内导致大部分错误的前 10 个操作。
StorageTableLogs
| where TimeGenerated > ago(3d) and StatusText !contains "Success"
| summarize count() by OperationName
| top 10 by count_ desc
列出最近三天内端到端延迟最长的前 10 个操作。
StorageTableLogs
| where TimeGenerated > ago(3d)
| top 10 by DurationMs desc
| project TimeGenerated, OperationName, DurationMs, ServerLatencyMs, ClientLatencyMs = DurationMs - ServerLatencyMs
列出最近三天内导致服务器端限制错误的所有操作。
StorageTableLogs
| where TimeGenerated > ago(3d) and StatusText contains "ServerBusy"
| project TimeGenerated, OperationName, StatusCode, StatusText
列出最近三天内使用匿名访问的所有请求。
StorageTableLogs
| where TimeGenerated > ago(3d) and AuthenticationType == "Anonymous"
| project TimeGenerated, OperationName, AuthenticationType, Uri
创建最近三天内使用的操作的饼图。
StorageTableLogs
| where TimeGenerated > ago(3d)
| summarize count() by OperationName
| sort by count_ desc
| render piechart
在监视数据中发现重要情况时,Azure Monitor 警报会主动通知你。 有了警报,你就可以在客户注意到你的系统中的问题之前确定和解决它们。 可以在指标、日志和活动日志上设置警报。
下表列出了一些要监视的示例场景和用于警报的适当指标:
用于警报的指标