教程:在 Azure 数据资源管理器中引入和查询监视数据
本文内容
本教程介绍如何在不编写代码的情况下,将数据从诊断日志和活动日志引入到 Azure 数据资源管理器群集。 使用这种简单的引入方法,可快速开始查询 Azure 数据资源管理器,从而进行数据分析。
本教程介绍以下操作:
在 Azure 数据资源管理器数据库中创建表和引入映射。
使用更新策略设置引入数据的格式。
创建事件中心 并将其连接到 Azure 数据资源管理器。
将 Azure Monitor 诊断指标和日志 以及活动日志 中的数据流式传输到事件中心。
使用 Azure 数据资源管理器查询引入的数据。
注意
在同一 Azure 位置或区域中创建所有资源。
先决条件
Azure 订阅。 创建 Azure 帐户 。
Azure 数据资源管理器群集和数据库。 创建群集和数据库 。 在本教程中,数据库名为 TestDatabase 。
Azure Monitor 数据提供程序:诊断指标和日志以及活动日志
查看并了解以下 Azure Monitor 诊断指标和日志以及活动日志提供的数据。 你将基于这些数据架构创建引入管道。 请注意,日志中的每个事件都具有记录数组。 稍后在本教程中,将拆分此记录数组。
诊断指标和日志以及活动日志的示例
Azure 诊断指标和日志以及活动日志是由 Azure 服务发出的,用于提供与该服务的操作相关的数据。
诊断指标示例
诊断指标以 1 分钟的时间粒度聚合。 下面是有关查询持续时间的 Azure 数据资源管理器指标事件架构示例:
{
"records": [
{
"count": 14,
"total": 0,
"minimum": 0,
"maximum": 0,
"average": 0,
"resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.KUSTO/CLUSTERS/<cluster-name>",
"time": "2018-12-20T17:00:00.0000000Z",
"metricName": "QueryDuration",
"timeGrain": "PT1M"
},
{
"count": 12,
"total": 0,
"minimum": 0,
"maximum": 0,
"average": 0,
"resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.KUSTO/CLUSTERS/<cluster-name>",
"time": "2018-12-21T17:00:00.0000000Z",
"metricName": "QueryDuration",
"timeGrain": "PT1M"
}
]
}
诊断日志示例
下面是 Azure 数据资源管理器诊断引入日志 的示例:
{
"time": "2019-08-26T13:22:36.8804326Z",
"resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.KUSTO/CLUSTERS/<cluster-name>",
"operationName": "MICROSOFT.KUSTO/CLUSTERS/INGEST/ACTION",
"operationVersion": "1.0",
"category": "FailedIngestion",
"resultType": "Failed",
"correlationId": "d59882f1-ad64-4fc4-b2ef-d663b6cc1cc5",
"properties": {
"OperationId": "00000000-0000-0000-0000-000000000000",
"Database": "Kusto",
"Table": "Table_13_20_prod",
"FailedOn": "2019-08-26T13:22:36.8804326Z",
"IngestionSourceId": "d59882f1-ad64-4fc4-b2ef-d663b6cc1cc5",
"Details":
{
"error":
{
"code": "BadRequest_DatabaseNotExist",
"message": "Request is invalid and cannot be executed.",
"@type": "Kusto.Data.Exceptions.DatabaseNotFoundException",
"@message": "Database 'Kusto' was not found.",
"@context":
{
"timestamp": "2019-08-26T13:22:36.7179157Z",
"serviceAlias": "<cluster-name>",
"machineName": "KEngine000001",
"processName": "Kusto.WinSvc.Svc",
"processId": 5336,
"threadId": 6528,
"appDomainName": "Kusto.WinSvc.Svc.exe",
"clientRequestd": "DM.IngestionExecutor;a70ddfdc-b471-4fc7-beac-bb0f6e569fe8",
"activityId": "f13e7718-1153-4e65-bf82-8583d712976f",
"subActivityId": "2cdad9d0-737b-4c69-ac9a-22cf9af0c41b",
"activityType": "DN.AdminCommand.DataIngestPullCommand",
"parentActivityId": "2f65e533-a364-44dd-8d45-d97460fb5795",
"activityStack": "(Activity stack: CRID=DM.IngestionExecutor;a70ddfdc-b471-4fc7-beac-bb0f6e569fe8 ARID=f13e7718-1153-4e65-bf82-8583d712976f > DN.Admin.Client.ExecuteControlCommand/5b764b32-6017-44a2-89e7-860eda515d40 > P.WCF.Service.ExecuteControlCommandInternal..IAdminClientServiceCommunicationContract/c2ef9344-069d-44c4-88b1-a3570697ec77 > DN.FE.ExecuteControlCommand/2f65e533-a364-44dd-8d45-d97460fb5795 > DN.AdminCommand.DataIngestPullCommand/2cdad9d0-737b-4c69-ac9a-22cf9af0c41b)"
},
"@permanent": true
}
},
"ErrorCode": "BadRequest_DatabaseNotExist",
"FailureStatus": "Permanent",
"RootActivityId": "00000000-0000-0000-0000-000000000000",
"OriginatesFromUpdatePolicy": false,
"ShouldRetry": false,
"IngestionSourcePath": "https://c0skstrldkereneus01.blob.core.chinacloudapi.cn/aam-20190826-temp-e5c334ee145d4b43a3a2d3a96fbac1df/3216_test_3_columns_invalid_8f57f0d161ed4a8c903c6d1073005732_59951f9ca5d143b6bdefe52fa381a8ca.zip"
}
}
活动日志示例
Azure 活动日志是订阅级日志,提供对订阅中的资源执行的操作的深入见解。 下面是用于检查访问权限的活动日志事件示例:
{
"records": [
{
"time": "2018-12-26T16:23:06.1090193Z",
"resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.WEB/SITES/CLNB5F73B70-DCA2-47C2-BB24-77B1A2CAAB4D/PROVIDERS/MICROSOFT.AUTHORIZATION",
"operationName": "MICROSOFT.AUTHORIZATION/CHECKACCESS/ACTION",
"category": "Action",
"resultType": "Start",
"resultSignature": "Started.",
"durationMs": 0,
"callerIpAddress": "13.66.225.188",
"correlationId": "0de9f4bc-4adc-4209-a774-1b4f4ae573ed",
"identity": {
"authorization": {
...
},
"claims": {
...
}
},
"level": "Information",
"location": "global",
"properties": {
...
}
},
{
"time": "2018-12-26T16:23:06.3040244Z",
"resourceId": "/SUBSCRIPTIONS/<subscriptionID>/RESOURCEGROUPS/<resource-group>/PROVIDERS/MICROSOFT.WEB/SITES/CLNB5F73B70-DCA2-47C2-BB24-77B1A2CAAB4D/PROVIDERS/MICROSOFT.AUTHORIZATION",
"operationName": "MICROSOFT.AUTHORIZATION/CHECKACCESS/ACTION",
"category": "Action",
"resultType": "Success",
"resultSignature": "Succeeded.OK",
"durationMs": 194,
"callerIpAddress": "13.66.225.188",
"correlationId": "0de9f4bc-4adc-4209-a774-1b4f4ae573ed",
"identity": {
"authorization": {
...
},
"claims": {
...
}
},
"level": "Information",
"location": "global",
"properties": {
"statusCode": "OK",
"serviceRequestId": "87acdebc-945f-4c0c-b931-03050e085626"
}
}]
}
在 Azure 数据资源管理器中设置引入管道
设置 Azure 数据资源管理器管道需要执行若干步骤,如表创建和数据引入。 此外,你可以处理、映射和更新数据。
连接到 Azure 数据资源管理器 Web UI
在 Azure 数据资源管理器的 TestDatabase 数据库中,选择“查询”打开 Azure 数据资源管理器 Web UI。
创建目标表
Azure Monitor 日志的结构不是表格。 你将操纵数据并将每个事件扩展到一个或多个记录。 将原始数据引入到活动日志的中间表 ActivityLogsRawRecords 以及诊断指标和日志的中间表 DiagnosticRawRecords 。 此时,数据已经过处理和扩展。 接着,使用更新策略将扩展的数据引入到活动日志的 ActivityLogs 表、诊断指标的 DiagnosticMetrics 表以及诊断日志的 DiagnosticLogs 表。 这意味着需要创建两个单独的表来引入活动日志,并创建三个单独的表来引入诊断指标和日志。
使用 Azure 数据资源管理器 Web UI 在 Azure 数据资源管理器数据库中创建目标表。
创建诊断指标表
在 TestDatabase 数据库中,创建名为 DiagnosticMetrics 的表来存储诊断指标记录。 使用以下 .create table
管理命令:
.create table DiagnosticMetrics (Timestamp:datetime, ResourceId:string, MetricName:string, Count:int, Total:double, Minimum:double, Maximum:double, Average:double, TimeGrain:string)
选择“运行”以创建该表 。
使用以下查询在 TestDatabase 数据库中创建名为 DiagnosticRawRecords 的中间数据表,以进行数据操作。 选择“运行”以创建该表 。
.create table DiagnosticRawRecords (Records:dynamic)
为中间表设置零保留策略 :
.alter-merge table DiagnosticRawRecords policy retention softdelete = 0d
创建诊断日志表
在 TestDatabase 数据库中,创建名为 DiagnosticLogs 的表来存储诊断日志记录。 使用以下 .create table
管理命令:
.create table DiagnosticLogs (Timestamp:datetime, ResourceId:string, OperationName:string, Result:string, OperationId:string, Database:string, Table:string, IngestionSourceId:string, IngestionSourcePath:string, RootActivityId:string, ErrorCode:string, FailureStatus:string, Details:string)
选择“运行”以创建该表 。
使用以下查询在 TestDatabase 数据库中创建名为 DiagnosticRawRecords 的中间数据表,以进行数据操作。 选择“运行”以创建该表 。
.create table DiagnosticRawRecords (Records:dynamic)
为中间表设置零保留策略 :
.alter-merge table DiagnosticRawRecords policy retention softdelete = 0d
创建活动日志表
在 TestDatabase 数据库中,创建名为 ActivityLogs 的表来接收活动日志记录。 若要创建该表,请运行以下 Azure 数据资源管理器查询:
.create table ActivityLogs (Timestamp:datetime, ResourceId:string, OperationName:string, Category:string, ResultType:string, ResultSignature:string, DurationMs:int, IdentityAuthorization:dynamic, IdentityClaims:dynamic, Location:string, Level:string)
在 TestDatabase 数据库中创建名为 ActivityLogsRawRecords 的中间数据表,以便处理数据 :
.create table ActivityLogsRawRecords (Records:dynamic)
为中间表设置零保留策略 :
.alter-merge table ActivityLogsRawRecords policy retention softdelete = 0d
创建表映射
由于数据格式为 json
,因此需要数据映射。 json
映射将每个 JSON 路径映射到表列名。 包含特殊字符的 JSON 路径应转义为 ["属性名称"]。 有关详细信息,请参阅 JSONPath 语法 。
将诊断指标和日志映射到表
若要将诊断指标和日志数据映射到表,请使用以下查询:
.create table DiagnosticRawRecords ingestion json mapping 'DiagnosticRawRecordsMapping' '[{"column":"Records","Properties":{"path":"$.records"}}]'
将活动日志映射到表
若要将活动日志数据映射到表,请使用以下查询:
.create table ActivityLogsRawRecords ingestion json mapping 'ActivityLogsRawRecordsMapping' '[{"column":"Records","Properties":{"path":"$.records"}}]'
为指标和日志数据创建更新策略
为诊断指标创建数据更新策略
创建一个函数 来扩展诊断指标记录集合,使集合中的每个值收到一个单独的行。 使用 mv-expand
运算符:
.create function DiagnosticMetricsExpand() {
DiagnosticRawRecords
| mv-expand events = Records
| where isnotempty(events.metricName)
| project
Timestamp = todatetime(events['time']),
ResourceId = tostring(events.resourceId),
MetricName = tostring(events.metricName),
Count = toint(events['count']),
Total = todouble(events.total),
Minimum = todouble(events.minimum),
Maximum = todouble(events.maximum),
Average = todouble(events.average),
TimeGrain = tostring(events.timeGrain)
}
将更新策略 添加到目标表。 此策略将针对 DiagnosticRawRecords 中间数据表中任何新引入的数据自动运行查询,并将查询结果引入到 DiagnosticMetrics 表中:
.alter table DiagnosticMetrics policy update @'[{"Source": "DiagnosticRawRecords", "Query": "DiagnosticMetricsExpand()", "IsEnabled": "True", "IsTransactional": true}]'
为诊断日志创建数据更新策略
创建一个函数 来扩展诊断日志记录集合,使集合中的每个值收到一个单独的行。 你将在 Azure 数据资源管理器群集上启用引入日志,并使用引入日志架构 。 你将为成功和失败的引入创建一个表,对于成功的引入,某些字段将为空(例如,ErrorCode)。 使用 mv-expand
运算符:
.create function DiagnosticLogsExpand() {
DiagnosticRawRecords
| mv-expand events = Records
| where isnotempty(events.operationName)
| project
Timestamp = todatetime(events['time']),
ResourceId = tostring(events.resourceId),
OperationName = tostring(events.operationName),
Result = tostring(events.resultType),
OperationId = tostring(events.properties.OperationId),
Database = tostring(events.properties.Database),
Table = tostring(events.properties.Table),
IngestionSourceId = tostring(events.properties.IngestionSourceId),
IngestionSourcePath = tostring(events.properties.IngestionSourcePath),
RootActivityId = tostring(events.properties.RootActivityId),
ErrorCode = tostring(events.properties.ErrorCode),
FailureStatus = tostring(events.properties.FailureStatus),
Details = tostring(events.properties.Details)
}
将更新策略 添加到目标表。 此策略将针对 DiagnosticRawRecords 中间数据表中任何新引入的数据自动运行查询,并将查询结果引入到 DiagnosticLogs 表中:
.alter table DiagnosticLogs policy update @'[{"Source": "DiagnosticRawRecords", "Query": "DiagnosticLogsExpand()", "IsEnabled": "True", "IsTransactional": true}]'
为活动日志创建数据更新策略
创建一个函数 用于扩展活动日志记录集合,使集合中的每个值收到一个单独的行。 使用 mv-expand
运算符:
.create function ActivityLogRecordsExpand() {
ActivityLogsRawRecords
| mv-expand events = Records
| project
Timestamp = todatetime(events['time']),
ResourceId = tostring(events.resourceId),
OperationName = tostring(events.operationName),
Category = tostring(events.category),
ResultType = tostring(events.resultType),
ResultSignature = tostring(events.resultSignature),
DurationMs = toint(events.durationMs),
IdentityAuthorization = events.identity.authorization,
IdentityClaims = events.identity.claims,
Location = tostring(events.location),
Level = tostring(events.level)
}
将更新策略 添加到目标表。 此策略将针对 ActivityLogsRawRecords 中间数据表中任何新引入的数据自动运行查询,并将查询结果引入到 ActivityLogs 表中:
.alter table ActivityLogs policy update @'[{"Source": "ActivityLogsRawRecords", "Query": "ActivityLogRecordsExpand()", "IsEnabled": "True", "IsTransactional": true}]'
创建一个 Azure 事件中心命名空间
通过 Azure 诊断设置,能够将指标和日志导出到存储帐户或事件中心。 本教程通过事件中心路由指标和日志。 按照以下步骤,为诊断指标和日志创建事件中心命名空间和事件中心。 Azure Monitor 将为活动日志创建事件中心 insights-operational-logs 。
在 Azure 门户中使用 Azure 资源管理器模板创建事件中心。 若要执行本文的剩余步骤,请右键单击“部署到 Azure”,然后选择“在新窗口中打开” 。 单击“部署到 Azure”按钮可转到 Azure 门户。
为诊断日志创建事件中心命名空间和事件中心。 了解如何创建事件中心命名空间 。
使用以下信息填写窗体。 对于下表中未列出的任何设置,请使用默认值。
设置
建议的值
说明
订阅
订阅
选择要用于事件中心的 Azure 订阅。
资源组
test-resource-group
创建新的资源组。
位置
选择最符合需求的区域。
在其他资源所在的同一位置创建事件中心命名空间。
命名空间名称
AzureMonitoringData
选择用于标识命名空间的唯一名称。
事件中心名称
DiagnosticData
事件中心位于命名空间下,该命名空间提供唯一的范围容器。
使用者组名称
adxpipeline
创建使用者组名称。 使用者组允许多个使用应用程序各自具有事件流的单独视图。
将 Azure Monitor 指标和日志连接到事件中心
现在需要将诊断指标和日志以及活动日志连接到事件中心。
将诊断指标和日志连接到事件中心
选择要从其中导出指标的资源。 支持导出诊断数据的资源类型有多种,包括事件中心命名空间、Azure 密钥保管库、Azure IoT 中心和 Azure 数据资源管理器群集。 在本教程中,我们将使用 Azure 数据资源管理器群集作为资源,并查看查询性能指标和引入结果日志。
在 Azure 门户中选择你的 Kusto 群集。
选择“诊断设置”,然后选择“启用诊断”链接 。
“诊断设置”窗格打开 。 执行以下步骤:
将诊断日志数据命名为 ADXExportedData 。
在“日志”下,选中“SucceededIngestion”和“FailedIngestion”复选框 。
在“指标”下,选中“查询性能”复选框 。
选择“流式传输到事件中心”复选框 。
选择“配置” 。
在“选择事件中心”窗格中,配置将数据从诊断日志导出到所创建事件中心的方法 :
在“选择事件中心命名空间”列表中,选择 AzureMonitoringData 。
在“选择事件中心名称”列表中,选择“DiagnosticData” 。
在“选择事件中心策略名称”列表中,选择 RootManagerSharedAccessKey 。
选择“确定” 。
选择“保存” 。
将活动日志连接到事件中心
在 Azure 门户的左侧菜单中,选择“活动日志” 。
此时会打开“活动日志”窗口 。 选择“诊断设置”。
此时会打开“诊断设置”窗口。 选择“+ 添加诊断设置”。
此时将打开一个新的“诊断设置”窗口。
执行以下步骤:
在“诊断设置名称”字段中输入名称。
在复选框的右侧,选择你希望从订阅中收集的平台日志。
选择“流式传输到事件中心”复选框 。
选择订阅。
在“事件中心命名空间”列表中,选择 AzureMonitoringData。
还可选择“事件中心名称”。
在“事件中心策略名称”列表中,选择默认的事件中心策略名称。
在窗口的左上角,选择“保存” 。 这将创建一个名为 insights-operational-logs 的事件中心(除非你已在上面选择事件中心名称)。
查看流入事件中心的数据
需等待几分钟,才能定义连接,完成活动日志到事件中心的数据导出。 转到事件中心命名空间,查看创建的事件中心。
查看流入事件中心的数据:
将事件中心连接到 Azure 数据资源管理器
现在需要为诊断指标和日志以及活动日志创建数据连接。
为诊断指标和日志以及活动日志创建数据连接
在名为 kustodocs 的 Azure 数据资源管理器群集中,选择左侧菜单中的“数据库” 。
在“数据库”窗口中,选择 TestDatabase 数据库 。
在左侧菜单中,选择“数据引入”。
在“数据引入”窗口中,选择“+ 添加数据连接”。
在“数据连接”窗口中输入以下信息:
在“数据连接”窗口中使用以下设置 :
数据源:
设置
建议的值
字段说明
数据连接名称
DiagnosticsLogsConnection
要在 Azure 数据资源管理器中创建的连接的名称。
事件中心命名空间
AzureMonitoringData
先前选择的用于标识命名空间的名称。
事件中心
DiagnosticData
你创建的事件中心。
使用者组
adxpipeline
在创建的事件中心定义的使用者组。
目标表:
有两个路由选项:静态和动态。 本教程将使用静态路由(默认),需在其中指定表名、数据格式和映射。 让“我的数据包含路由信息”保持取消选中状态。
设置
建议的值
字段说明
表
DiagnosticRawRecords
在 TestDatabase 数据库中创建的表 。
数据格式
JSON
表中使用的格式。
列映射
DiagnosticRawRecordsMapping
在 TestDatabase 数据库中创建的映射,它将传入的 JSON 数据映射到 DiagnosticRawRecords 表的列名和数据类型。
选择“创建” 。
在“数据连接”窗口中使用以下设置 :
数据源:
设置
建议的值
字段说明
数据连接名称
ActivityLogsConnection
要在 Azure 数据资源管理器中创建的连接的名称。
事件中心命名空间
AzureMonitoringData
先前选择的用于标识命名空间的名称。
事件中心
insights-operational-logs
你创建的事件中心。
使用者组
$Default
默认的使用者组。 如果需要,可以创建不同的使用者组。
目标表:
有两个路由选项:静态和动态。 本教程将使用静态路由(默认),需在其中指定表名、数据格式和映射。 让“我的数据包含路由信息”保持取消选中状态。
设置
建议的值
字段说明
表
ActivityLogsRawRecords
在 TestDatabase 数据库中创建的表 。
数据格式
JSON
表中使用的格式。
列映射
ActivityLogsRawRecordsMapping
在 TestDatabase 数据库中创建的映射,它将传入的 JSON 数据映射到 ActivityLogsRawRecords 表的列名和数据类型 。
选择“创建” 。
查询新表
现已创建用于流送数据的管道。 默认情况下,通过群集引入数据需要 5 分钟,因此,请先让数据流动几分钟,然后再开始查询。
查询诊断指标表
以下查询分析 Azure 数据资源管理器诊断指标记录中的查询持续时间数据:
DiagnosticMetrics
| where Timestamp > ago(15m) and MetricName == 'QueryDuration'
| summarize avg(Average)
查询结果:
查询诊断日志表
此管道通过事件中心生成引入。 你将查看这些引入的结果。
以下查询分析一分钟内应计的引入数,包括每个时间间隔的 Database
、Table
和 IngestionSourcePath
示例:
DiagnosticLogs
| where Timestamp > ago(15m) and OperationName has 'INGEST'
| summarize count(), take_any(Database, Table, IngestionSourcePath) by bin(Timestamp, 1m)
查询结果:
count_
any_Database
any_Table
any_IngestionSourcePath
00:06.156
TestDatabase
DiagnosticRawRecords
https://rtmkstrldkereneus00.blob.core.chinacloudapi.cn/20190827-readyforaggregation/1133_TestDatabase_DiagnosticRawRecords_6cf02098c0c74410bd8017c2d458b45d.json.zip
查询活动日志表
以下查询分析 Azure 数据资源管理器活动日志记录中的数据:
ActivityLogs
| where OperationName == 'MICROSOFT.EVENTHUB/NAMESPACES/AUTHORIZATIONRULES/LISTKEYS/ACTION'
| where ResultType == 'Success'
| summarize avg(DurationMs)
查询结果:
相关内容