Удалить старые данные диагностики Windows Azure из табличного хранилища (счетчики производительности и т. Д.)
У меня есть несколько виртуальных машин Windows, работающих на Azure, которые настроены для сбора счетчиков производительности и журналов событий.
Все это настраивается в разделе "Параметры диагностики..." на ресурсе виртуальной машины в портале Azure. Существует агент диагностики Windows Azure, который собирает эти данные на виртуальной машине и сохраняет их в учетной записи хранения (внутри табличного хранилища).
Все эти собранные данные (счетчики производительности, метрики, журналы и т. Д.) Не имеют никакой политики хранения, и , похоже, не существует способа их настройки. Таким образом, он просто накапливается в хранилище таблицы учетной записи хранения навсегда.
Вот где моя проблема - сейчас в этих таблицах слишком много данных (в моем случае несколько терабайт), и это просто стоит больших денег. И это будет только расти со временем.
Соответствующие таблицы учетной записи хранения представляют собой таблицы, подобные следующим:
WADMetrics*
(Таблица показателей диагностики Windows Azure)WADPerformanceCountersTable
(Таблица счетчиков производительности диагностики Windows Azure)WASWindowsEventLogsTable
(Таблица журналов событий Windows Azure Diagnostics)
Есть ли способ удалить старые данные в этих таблицах, чтобы они ничего не сломали? Или, что еще лучше, есть ли способ настроить политику хранения или настроить ее так, чтобы она не накапливалась вечно?
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/.
Или, что еще лучше, есть ли способ настроить политику хранения или настроить ее так, чтобы она не накапливалась вечно?
К сожалению, нет, по крайней мере, на сегодняшний день. Есть настройки хранения, но это только для блобов.
Только что столкнулся с этой проблемой, когда отслеживал, что больше всего стоит в подписке.
Одним из полезных инструментов является обозреватель хранилища Azure. Вы можете перейти к таблице, проверить ее содержимое, использовать кнопку "Статистика таблицы" для подсчета строк таблицы, множественного выбора и удаления строк.
Я обнаружил, что для одной небольшой виртуальной машины, которая работает с 2016 года, таблицы WADMetrics обновляются каждые 10 дней, а другие - нет. Образец таблицы WADMetrics содержал 5724 записи. WASWindowsEventLogsTable содержал 10022 записи. Я отменил подсчет WADPerformanceCountersTable, когда он достиг 5 миллионов записей. Хранение статистики стоит дороже, чем VHD виртуальной машины.
В этой статье собрана полезная информация о командах PowerShell для управления таблицами. К сожалению, Azure Cloud Shell пока не поддерживает команды для работы внутри таблицы, например Get-AzTableRow (см. Этот отчет). Я предполагаю, что это сработает, если вы настроите последние команды 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
Другое решение - написать небольшую программу на C# для удаления данных диагностики Windows Azure (WAD).
В следующей статье вы найдете более или менее готовое решение для методов, которые могут стереть как WADMetrics*
таблицы и строки, содержащиеся в WADDiagnosticInfrastructureLogsTable
, WADPerformanceCountersTable
а также WADWindowsEventLogsTable
Используя два метода DeleteOldTables()
а также DeleteOldData()
легко написать небольшую программу, которая может выполняться ежемесячно для очистки данных WAD. Обратите внимание, что в коде используется пакет NuGet WindowsAzure.Storage, поэтому его необходимо установить в вашем проекте.