我在Azure上运行了几个Windows,它们被配置为收集性能计数器和事件日志。
所有这些都是在“诊断设置.”中配置的。在Azure Portal中的VM资源上。有一个Windows诊断代理,它收集VM上的数据并将其存储到存储帐户中(在表存储中)。
所有这些收集的数据(性能计数器、度量、日志等)没有任何保留策略,而且似乎没有任何方法来设置。所以它只会永远地积累在存储帐户的表存储中。
这就是我的问题所在--现在这些表中有太多的数据(在我的例子中有几兆字节),为了保存这些数据,花费了很多钱。而且它只会随着时间的推移而不断增加。
相关的存储帐户表如下所示:
WADMetrics* (Windows诊断学计量表)WADPerformanceCountersTable (Windows诊断性能计数器表)WASWindowsEventLogsTable (Windows诊断Windows事件日志表)是否有办法删除这些表中的旧数据,这样就不会破坏任何东西?或者更好的是,是否有某种方法来配置保留策略或设置它,使其不再永远积累?
发布于 2019-02-05 15:56:05
有没有办法删除这些表中的旧数据,这样它就不会破坏任何东西?
您需要手动完成此操作。它的工作方式是首先查询需要删除的数据,然后一旦得到数据,就会删除它。存储在这些表中的实体的PartitionKey属性实际上表示一个日期/时间值(以滴答加上零,使其成为等长字符串),因此您需要接受from和to date/time值,将它们转换为ticks,将其转换为19个字符长字符串(通过预先设置适当数量的零)并查询数据。一旦在客户端获得数据,就会将delete请求发送回表存储。
为了加快整个过程,你可以做几件事:
PartitionKey和RowKey属性,因为删除只需要这两个属性。不久前,我写了一篇博文,你可能会发现它很有帮助:https://gauravmantri.com/2012/02/17/effective-way-of-fetching-diagnostics-data-from-windows-azure-diagnostics-table-hint-use-partitionkey/。
或者更好的是,是否有什么方法来配置保留策略或设置它,使它不会永远积累?
不幸的是,至少到今天还没有。有一个保留设置,但这只适用于小气泡。
发布于 2019-07-16 23:08:13
我刚刚发现了这个问题,当时我正在追踪订阅费最高的是什么。
一个有用的工具是Azure存储资源管理器。您可以浏览到一个表,检查它的内容,使用“表统计”按钮来计数表行、多选择和删除行。
对于一个自2016年开始运行的小型VM,我发现WADMetrics表似乎每10天滚动一次,而其他的则不是。一个示例WADMetrics表包含5724个条目。WASWindowsEventLogsTable包含10,022个条目。当WADPerformanceCountersTable数达到500万条时,我取消了它的计数。与VM的VHD相比,存储统计数据的成本更高。
这篇文章总结了有关操作表的PowerShell命令的有用信息。不幸的是,Azure还不支持在表中工作的命令,例如Get(参见本报告)。如果您在本地设置最新的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发布于 2019-11-27 22:14:06
另一种解决方案是编写一个小的C#程序来擦除Windows诊断(WAD)数据。
下面的文章或多或少地给出了一个可以擦除WADMetrics*表和WADDiagnosticInfrastructureLogsTable、WADPerformanceCountersTable和WADWindowsEventLogsTable中包含的行的方法的开箱即用的解决方案。
使用DeleteOldTables()和DeleteOldData()这两种方法,很容易编写一个可以每月执行的小程序来清理WAD数据。请注意,代码使用WindowsAzure.Storage NuGet包,因此需要在项目中安装。
https://stackoverflow.com/questions/54537785
复制相似问题