使用“删除数据 API”可以删除敏感数据、个人、损坏或错误的日志条目等数据。
本文介绍如何通过调用“删除数据 API”从 Log Analytics 工作区中的特定表删除日志条目。
删除数据 API 的工作原理
删除数据 API 非常适合对单个记录进行计划外删除。 例如,当你发现损坏的遥测数据引入到工作区时,你希望防止它扭曲查询结果。 删除数据 API 会将符合指定筛选条件的记录标记为已删除,而无需从存储中实际删除这些记录。
若要指定要删除的表的行,请在 API 调用的正文中发送一个或多个筛选器。
“删除”过程是最终的且不可逆的。 因此,在调用 API 之前,请在工作区中使用 Kusto 查询语言(KQL)where 运算符运行查询,以检查筛选器是否生成了预期结果。
例如,若要基于AzureMetrics值从TimeGenerated表中删除数据:
可以在 API 调用的正文中发送此筛选器:
{
"filters": [
{
"column": "TimeGenerated",
"operator": "==",
"value": "2024-09-23T00:00:00"
}
]
}
通过在 Log Analytics 工作区中运行此查询,检查筛选器是否返回要删除的条目:
AzureMetrics
| where TimeGenerated == "2024-09-23T00:00:00"
删除数据请求是异步的,通常在几分钟内完成。 在极端情况下,请求最多可以排队五天。
所需的权限
| 行动 |
所需的权限 |
| 从 Log Analytics 工作区中的表中删除数据 |
对 Log Analytics 工作区的 Microsoft.OperationalInsights/workspaces/tables/deleteData/action 权限,例如,Log Analytics 参与者内置角色所提供的权限 |
注释
“删除数据”操作不会影响保留费用。 保留费用受工作区或表中配置的保持期管理。
注意事项
- 在单个 Log Analytics 工作区中,每小时最多可以提交 10 个删除数据请求。
- 删除数据 API 对 Analytics 计划中的数据进行操作。 若要从包含基本计划的表中删除数据,请将计划更改为 Analytics,然后删除数据。 该辅助计划不被支持。
调用“删除数据 API”以从特定表中删除数据
若要从表中删除行,请在正文中使用命令并添加一个或多个筛选条件。 此示例对 TimeGenerated 列和 Resource 列进行筛选。
以下Azure CLI示例使用 az rest 调用 Tables - Delete Data REST API 操作。
# Set variables
resourceGroupName="<ResourceGroupName>"
workspaceName="<WorkspaceName>"
tableName="<TableName>"
apiVersion="<ApiVersion>"
# Get the subscription ID from the current Azure CLI context
subscriptionId=$(az account show --query id --output tsv)
# Build request URL
apiEndpoint="https://management.chinacloudapi.cn"
path="/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
provider="Microsoft.OperationalInsights/workspaces/$workspaceName/tables/$tableName"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/deleteData$queryString"
# Delete the data
az rest --method post --url "$url" --body @body.json
在运行该命令的目录中,将筛选器保存为 body.json:
{
"filters": [
{
"column": "TimeGenerated",
"operator": "==",
"value": "2024-09-23T00:00:00"
},
{
"column": "Resource",
"operator": "==",
"value": "VM-1"
}
]
}
az rest 不返回响应标头,因此无法提供 Azure-AsyncOperation URL。 若要跟踪操作,请使用Azure PowerShell选项卡。
以下Azure PowerShell示例使用 Invoke-AzRestMethod 调用 Tables - Delete Data REST API 操作。 它会轮询操作状态,直到删除达到终端状态。
# User input variables - update values in <AngleBrackets>
$resourceGroupName = "<ResourceGroupName>"
$workspaceName = "<WorkspaceName>"
$tableName = "<TableName>"
$apiVersion = "<ApiVersion>"
# Get the subscription ID from the current Azure PowerShell context
$subscriptionId = (Get-AzContext).Subscription.Id
# Build request URL
$apiEndpoint = "https://management.chinacloudapi.cn"
$path = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
$provider = "Microsoft.OperationalInsights/workspaces/$workspaceName/tables/$tableName"
$queryString = "?api-version=$apiVersion"
$url = "$apiEndpoint$path/providers/$provider/deleteData$queryString"
# Build request body
$body = @{
filters = @(
@{
column = "TimeGenerated"
operator = "=="
value = "2024-09-23T00:00:00"
},
@{
column = "Resource"
operator = "=="
value = "VM-1"
}
)
} | ConvertTo-Json -Depth 3
# Send request
$invokeAzRestMethodParams = @{
Method = "POST"
Uri = $url
Payload = $body
}
$response = Invoke-AzRestMethod @invokeAzRestMethodParams
# Get the operation status URL from the response headers
$asyncHeader = $response.Headers | Where-Object Key -eq "Azure-AsyncOperation"
if (-not $asyncHeader) {
$asyncHeader = $response.Headers | Where-Object Key -eq "Location"
}
$operationUrl = $asyncHeader.Value | Select-Object -First 1
# Poll until the operation reaches a terminal state
if ($operationUrl) {
while ($true) {
$statusResponse = Invoke-AzRestMethod -Method GET -Uri $operationUrl
$result = $statusResponse.Content | ConvertFrom-Json
Write-Host "Status: $($result.status)"
if ($result.status -in "Succeeded", "Failed") {
Write-Host "Final status: $($result.status)"
# An invalid filter is accepted with 202, so the reason appears only here
if ($result.error) { Write-Host "Error: $($result.error.message)" }
break
}
Start-Sleep -Seconds 30
}
} else {
Write-Host "No operation tracking URL found. Response body:"
$response.Content
}
以下 REST 示例使用 Tables - Delete Data REST API 操作。
POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}/tables/{tableName}/deleteData?api-version={apiVersion}
Authorization: Bearer {accessToken}
Content-Type: application/json
{
"filters": [
{
"column": "TimeGenerated",
"operator": "==",
"value": "2024-09-23T00:00:00"
},
{
"column": "Resource",
"operator": "==",
"value": "VM-1"
}
]
}
筛选器参数
| 名称 |
DESCRIPTION |
column |
要对其应用筛选器的目标表中的列的名称。 |
operator |
支持的运算符为==、=~、in、in~、>、>=、<、<=、between。 |
value |
要筛选依据的值,采用受支持的格式。 该值可以是特定的日期、字符串或其他数据类型,具体取决于列。 |
反应
az rest 不返回任何输出。 202 响应表示已接受请求。
Status: Updating
Status: Updating
Status: Updating
Status: Updating
Status: Updating
Status: Succeeded
Final status: Succeeded
202 (accepted) with header including the OperationId
| 响应 |
DESCRIPTION |
| 202 (已接受) |
异步请求已成功接收。 若要检查操作是成功还是失败,请使用响应标头中提供的 Azure-AsyncOperation URL。 |
| 其他状态代码 |
描述请求被拒绝的原因的错误响应,例如,当目标表使用辅助计划时。 |
Important
202 响应表示已接受请求,而不是删除成功。 202 也接受无效筛选器,之后会失败,因此请始终检查操作状态。 失败的操作会返回 "status": "Failed",以及一个描述原因的 error 对象。
检查删除数据操作和状态
可以通过 Azure 活动日志跟踪工作区中的数据删除活动。 在Azure门户中的“Log Analytics工作区”菜单中,选择“活动日志”,并从log analytics工作区事件中找到“删除数据”。 选择一个事件,然后以 JSON 格式打开事件,以获取详细信息,例如调用方、目标表和操作状态。
活动日志事件不包括已删除的记录数。 若要检查作的状态并查看已删除的记录数,请使用响应标头中提供的 URL 发送 GET 请求 Azure-AsyncOperation :
以下Azure CLI示例使用 az rest 调用 Operation Statuses - Get REST API 操作。
# Set variables
region="<Region>"
operationId="<OperationId>"
apiVersion="<ApiVersion>"
# Get the subscription ID from the current Azure CLI context
subscriptionId=$(az account show --query id --output tsv)
# Build request URL
apiEndpoint="https://management.chinacloudapi.cn"
path="/subscriptions/$subscriptionId"
provider="Microsoft.OperationalInsights/locations/$region"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/operationstatuses/$operationId$queryString"
# Get the operation status
az rest --method get --url "$url"
以下Azure PowerShell示例使用 Invoke-AzRestMethod 调用 Operation Statuses - Get REST API 操作。 它会轮询,直到删除达到终端状态。
# User input variables - update values in <AngleBrackets>
$region = "<Region>"
$operationId = "<OperationId>"
$apiVersion = "<ApiVersion>"
# Get the subscription ID from the current Azure PowerShell context
$subscriptionId = (Get-AzContext).Subscription.Id
# Build request URL
$apiEndpoint = "https://management.chinacloudapi.cn"
$path = "/subscriptions/$subscriptionId"
$provider = "Microsoft.OperationalInsights/locations/$region"
$queryString = "?api-version=$apiVersion"
$url = "$apiEndpoint$path/providers/$provider/operationstatuses/$operationId$queryString"
# Poll until the operation reaches a terminal state
while ($true) {
$statusResponse = Invoke-AzRestMethod -Method GET -Uri $url
$result = $statusResponse.Content | ConvertFrom-Json
Write-Host "Status: $($result.status)"
if ($result.status -in "Succeeded", "Failed") {
Write-Host "Final status: $($result.status)"
# An invalid filter is accepted with 202, so the reason appears only here
if ($result.error) { Write-Host "Error: $($result.error.message)" }
break
}
Start-Sleep -Seconds 30
}
以下 REST 示例使用 Operation Statuses - Get REST API 操作。
GET https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.OperationalInsights/locations/{region}/operationstatuses/{operationId}?api-version={apiVersion}
Authorization: Bearer {accessToken}
反应
{
"endTime": "2024-11-04T09:36:49.0252644Z",
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.OperationalInsights/locations/chinanorth/operationstatuses/00000000-0000-0000-0000-000000001234",
"name": "00000000-0000-0000-0000-000000001234",
"properties": {
"RecordCount": 234812,
"Status": "Completed"
},
"startTime": "2024-11-04T09:31:41.689659Z",
"status": "Succeeded"
}
Status: Updating
Status: Updating
Status: Updating
Status: Updating
Status: Updating
Status: Succeeded
Final status: Succeeded
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.OperationalInsights/locations/chinanorth/operationstatuses/00000000-0000-0000-0000-000000001234",
"name": "00000000-0000-0000-0000-000000001234",
"status": "Succeeded",
"startTime": "2024-11-04T09:31:41.689659Z",
"endTime": "2024-11-04T09:36:49.0252644Z",
"properties": {
"RecordCount": 234812,
"Status": "Completed"
}
}
有关详细信息,请参阅 跟踪异步 Azure 操作。
后续步骤
学习如何做到: