我在Azure上运行了多个Windows VM,这些Windows VM配置为收集性能计数器和事件日志。
所有这些都在Azure Portal内VM资源的“诊断设置...”中进行配置。有一个Windows Azure Diagnostics代理可以在VM上收集此数据并将其存储到一个存储帐户(在Table Storage内部)。
所有收集的数据(性能指标,指标,日志等)没有任何保留策略,并且似乎没有任何设置方法。因此,它只会永久存储在存储帐户的表存储中。
这就是我的问题所在-这些表中现在有太多数据(在我的情况下为几个TB),并且为了保持它而花费了很多钱。而且只会随着时间的推移而不断增加。
相关的存储帐户表如下:
WADMetrics*
(Windows Azure诊断指标表)WADPerformanceCountersTable
(Windows Azure诊断性能计数器表)WASWindowsEventLogsTable
(Windows Azure诊断Windows事件日志表)在这些表中是否有某种如何删除旧数据的方式,以便不会破坏任何内容?甚至更好的是,是否有一些配置保留策略的方法或对其进行设置,以使其不会永远累积下去?
答案 0 :(得分:1)
有什么方法可以删除这些表中的旧数据吗? 不会破坏任何东西吗?
您需要手动执行此操作。这种方法的工作方式是,您将首先查询需要删除的数据,然后在获取数据后将其删除。存储在这些表中的实体的PartitionKey
属性实际上表示日期/时间值(以零表示的滴答声,使其等于长度的字符串),因此您需要采用from和to日期/时间值,将其转换为将它们打勾,将其设置为19个字符长的字符串(通过添加适当数量的零)并查询数据。在客户端获取数据后,您将把删除请求发送回表存储。
要加快整个过程的速度,您可以做一些事情:
PartitionKey
和RowKey
属性,因为删除仅需要这两个属性。不久前我写了一篇博客文章,可能对您有所帮助:https://gauravmantri.com/2012/02/17/effective-way-of-fetching-diagnostics-data-from-windows-azure-diagnostics-table-hint-use-partitionkey/。
或更妙的是,是否有某种方法可以配置保留策略或设置 它会不会永远累积下去?
不幸的是,至少到今天为止还没有。有保留设置,但这仅适用于斑点。
答案 1 :(得分:1)
另一种解决方案是编写一个小型C#程序以擦除Windows Azure诊断(WAD)数据。
以下文章为您提供了一种或多或少的开箱即用的解决方案,这些方法可以擦除REPLACEs
,WADMetrics*
和{{1 }}
使用两种方法WADDiagnosticInfrastructureLogsTable
和WADPerformanceCountersTable
,很容易编写一个可以每月执行一次以清除WAD数据的小型程序。请注意,该代码使用WindowsAzure.Storage NuGet软件包,因此需要在您的项目中安装。
答案 2 :(得分:0)
当我跟踪订阅中最昂贵的费用时,就遇到了这个问题。
一个有用的工具是Azure Storage Explorer。您可以浏览到表,检查表内容,使用“表统计信息”按钮对表行进行计数,多选和删除行。
对于自2016年以来一直运行的一个小型VM,我发现WADMetrics表似乎每10天滚动一次,而其他的则没有。一个示例WADMetrics表包含5724个条目。 WASWindowsEventLogsTable包含10022个条目。当达到500万个条目时,我取消了WADPerformanceCountersTable计数。存储统计信息的成本比虚拟机的VHD高。
This article总结了有关用于操作表的PowerShell命令的有用信息。不幸的是,Azure Cloud Shell尚不支持在表的内部中工作的命令,例如Get-AzTableRow(请参见this report)。我认为,如果您在本地设置最新的Az PowerShell命令,那将可行。然后,您可以选择一个过滤器,然后使用Remove-AzTableRow删除某些行。就我而言,这台计算机已经停用,因此我只需要一种删除大量表的方法,而不必单击仪表板上的每个表。以下是一些示例命令,从此开始:
$location = "uswest"
$resourceGroup = "myRG"
$storageAccountName = "myData"
$storageAccount = get-AzStorageAccount -ResourceGroupName $resourceGroup -Name $storageAccountName
$ctx = $storageAccount.Context
# List all tables in storage account
Get-AzStorageTable -Context $ctx
# Count the WADMetrics tables
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*").count
# Count the WADMetrics tables with "2018" in their name
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*").count
# Remove all WADMetrics tables with "2018" in their name without confirmation, then re-count
# Only Get- supports wilcards, so pipe to Remove-AzStorageTable command
Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*" | Remove-AzStorageTable -Force
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*").count
# Remove the big tables. Confirmation takes a long time, so suppress it.
Remove-AzStorageTable -Context $ctx -Name "WADWindowsEventLogsTable" -Force
Remove-AzStorageTable -Context $ctx -Name "WADPerformanceCountersTable" -Force
# The following do NOT work in Azure Cloud Shell as of 07/16/2019. See
# https://github.com/MicrosoftDocs/azure-docs/issues/28608
# Count the rows in WADWindowsEventLogsTable
$tableName = "WADWindowsEventLogsTable"
$cloudTable = (Get-AzStorageTable -Context $ctx -Name $tableName).CloudTable
$cloudTableResults = Get-AzTableRow -table $cloudTable -columnName "RowKey"
$cloudTableResults.count