从表存储(性能计数器等)中删除旧的Windows Azure诊断数据

时间:2019-02-05 15:28:15

标签: azure azure-storage azure-table-storage azure-diagnostics retention

我在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事件日志表)

在这些表中是否有某种如何删除旧数据的方式,以便不会破坏任何内容?甚至更好的是,是否有一些配置保留策略的方法或对其进行设置,以使其不会永远累积下去?

3 个答案:

答案 0 :(得分:1)

  

有什么方法可以删除这些表中的旧数据吗?   不会破坏任何东西吗?

您需要手动执行此操作。这种方法的工作方式是,您将首先查询需要删除的数据,然后在获取数据后将其删除。存储在这些表中的实体的PartitionKey属性实际上表示日期/时间值(以零表示的滴答声,使其等于长度的字符串),因此您需要采用from和to日期/时间值,将其转换为将它们打勾,将其设置为19个字符长的字符串(通过添加适当数量的零)并查询数据。在客户端获取数据后,您将把删除请求发送回表存储。

要加快整个过程的速度,您可以做一些事情:

  • 查询数据时,请使用查询投影仅返回PartitionKeyRowKey属性,因为删除仅需要这两个属性。
  • 要删除,可以使用实体批处理。这样可以大大加快删除操作的速度。
  • 为了更快地删除,您可以在与存储帐户相同的区域中启动VM。这样一来,您就不必为数据出口费用付费。

不久前我写了一篇博客文章,可能对您有所帮助: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)数据。

以下文章为您提供了一种或多或少的开箱即用的解决方案,这些方法可以擦除REPLACEsWADMetrics*和{{1 }}

使用两种方法WADDiagnosticInfrastructureLogsTableWADPerformanceCountersTable,很容易编写一个可以每月执行一次以清除WAD数据的小型程序。请注意,该代码使用WindowsAzure.Storage NuGet软件包,因此需要在您的项目中安装。

https://mysharepointlearnings.wordpress.com/2019/08/20/managing-azure-vm-diagnostics-data-in-table-storage/

答案 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