将时序分析 Gen2 迁移到 Microsoft Fabric 的Real-Time 智能
注意
时序见解服务将于 2024 年 7 月 7 日停用。 请考虑尽快将现有环境迁移到备用解决方案。 关于停止使用和迁移的更多信息,请访问我们的 文档。
概述
Eventhouse 是 Real-Time Intelligence 中的时序数据库。 它是用于将数据从时序洞察迁移出去的目标。
高级迁移建议。
功能 | 建议迁移 |
---|---|
从 Hub 导入 JSON 并进行扁平化和转义 | 从 Azure 事件中心获取数据 |
打开冷库 | Eventhouse OneLake 供应情况 |
Power BI 连接器 | 使用 Eventhouse Power BI 连接器。 手动将 TSQ 重写为 KQL。 |
Spark 连接器 | 将数据迁移到 Eventhouse。 通过 Apache Spark 使用笔记本查询 Eventhouse 或 使用笔记本浏览 lakehouse 中的数据 |
批量上传 | 从 Azure 存储 获取数据 |
时序模型 | 可以导出为 JSON 文件。 可以 导入到 Eventhouse。 Kusto Graph 语义 允许将时序模型层次结构作为图进行建模、遍历和分析 |
时序浏览器 | Real-Time 仪表板、Power BI 报表 或使用 KustoTrender 编写自定义仪表板 |
查询语言 | 在 KQL 中重写查询。 |
迁移遥测
若要检索环境中所有数据的副本,请使用存储帐户中的 PT=Time
文件夹。 有关详细信息,请参阅 数据存储。
迁移步骤 1 - 获取有关遥测数据的统计信息
数据
- Env 概述
- 记录数据访问 FQDN 第一部分的环境 ID(例如,从 .env.crystal-dev.windows-int.net 的 d390b0b0-1445-4c0c-8365-68d6382c1c2a)
- Env 概述 -> 存储配置 -> 存储帐户
- 使用存储资源管理器获取文件夹统计信息
- 记录大小和
PT=Time
文件夹的 blob 数。
- 记录大小和
迁移步骤 2 – 将数据迁移到 Eventhouse
创建 Eventhouse
若要为迁移过程设置 Eventhouse,请按照 创建 Eventhouse中的步骤操作。
数据引入
若要检索与时序见解实例对应的存储帐户的数据,请按照 从 Azure 存储获取数据的步骤进行操作。
请确保:
将文件筛选器文件夹路径配置为
V=1/PT=Time
以筛选相关 blob。验证推断的架构并删除任何不经常查询的列,同时至少保留时间戳、TSID 列和值。 为确保所有数据都复制到 Eventhouse,请添加另一列,并使用 DropMappedFields 映射转换。
完成引入过程。
查询数据
成功引入数据后,可以使用 KQL 查询集开始浏览它。 如果需要从自定义客户端应用程序访问数据,Eventhouse 为主要编程语言(如 C# (链接)、Java(链接)和 Node.js(链接)提供 SDK。
将时序模型迁移到 Azure 数据资源管理器
可以使用 TSI 资源管理器 UX 或 TSM Batch API 以 JSON 格式从 TSI 环境下载模型。 然后,可以将模型导入到 Eventhouse。
从 TSI UX 下载 TSM。
使用 Visual Studio Code 或其他编辑器删除前三行。
使用 Visual Studio Code 或其他编辑器,使用正则表达式将
\},\n \{
搜索并替换为}{
使用 从单个文件获取数据,并将 JSON 作为单独的表引入 ADX。
将您的时序数据迁移到 Fabric Real-Time Intelligence 的 Eventhouse 后,可以利用 Kusto 图语义 的强大功能为您的数据提供上下文,并进行分析。 Kusto Graph 语义允许将时序模型的层次结构建模、遍历和分析为图形。 通过使用 Kusto Graph 语义,可以深入了解时序数据中不同实体之间的关系,例如资产、站点和数据点。 这些见解可帮助你了解系统的各个组件之间的依赖关系和交互。
将时序查询 (TSQ) 转换为 KQL
GetEvents
{
"getEvents": {
"timeSeriesId": [
"assest1",
"siteId1",
"dataId1"
],
"searchSpan": {
"from": "2021-11-01T00:00:0.0000000Z",
"to": "2021-11-05T00:00:00.000000Z"
},
"inlineVariables": {},
}
}
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where assetId_string == "assest1" and siteId_string == "siteId1" and dataid_string == "dataId1"
| take 10000
具有筛选器的 GetEvents
{
"getEvents": {
"timeSeriesId": [
"deviceId1",
"siteId1",
"dataId1"
],
"searchSpan": {
"from": "2021-11-01T00:00:0.0000000Z",
"to": "2021-11-05T00:00:00.000000Z"
},
"filter": {
"tsx": "$event.sensors.sensor.String = 'status' AND $event.sensors.unit.String = 'ONLINE"
}
}
}
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where deviceId_string== "deviceId1" and siteId_string == "siteId1" and dataId_string == "dataId1"
| where ['sensors.sensor_string'] == "status" and ['sensors.unit_string'] == "ONLINE"
| take 10000
具有投影变量的 GetEvents
{
"getEvents": {
"timeSeriesId": [
"deviceId1",
"siteId1",
"dataId1"
],
"searchSpan": {
"from": "2021-11-01T00:00:0.0000000Z",
"to": "2021-11-05T00:00:00.000000Z"
},
"inlineVariables": {},
"projectedVariables": [],
"projectedProperties": [
{
"name": "sensors.value",
"type": "String"
},
{
"name": "sensors.value",
"type": "bool"
},
{
"name": "sensors.value",
"type": "Double"
}
]
}
}
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where deviceId_string== "deviceId1" and siteId_string == "siteId1" and dataId_string == "dataId1"
| take 10000
| project timestamp, sensorStringValue= ['sensors.value_string'], sensorBoolValue= ['sensors.value_bool'], sensorDoublelValue= ['sensors.value_double']
AggregateSeries
{
"aggregateSeries": {
"timeSeriesId": [
"deviceId1"
],
"searchSpan": {
"from": "2021-11-01T00:00:00.0000000Z",
"to": "2021-11-05T00:00:00.0000000Z"
},
"interval": "PT1M",
"inlineVariables": {
"sensor": {
"kind": "numeric",
"value": {
"tsx": "coalesce($event.sensors.value.Double, todouble($event.sensors.value.Long))"
},
"aggregation": {
"tsx": "avg($value)"
}
}
},
"projectedVariables": [
"sensor"
]
}
events
| where timestamp >= datetime(2021-11-01T00:00:00.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.0000000Z)
| where deviceId_string == "deviceId1"
| summarize avgSensorValue= avg(coalesce(['sensors.value_double'], todouble(['sensors.value_long']))) by bin(IntervalTs = timestamp, 1m)
| project IntervalTs, avgSensorValue
带有筛选器的汇总系列
{
"aggregateSeries": {
"timeSeriesId": [
"deviceId1"
],
"searchSpan": {
"from": "2021-11-01T00:00:00.0000000Z",
"to": "2021-11-05T00:00:00.0000000Z"
},
"filter": {
"tsx": "$event.sensors.sensor.String = 'heater' AND $event.sensors.location.String = 'floor1room12'"
},
"interval": "PT1M",
"inlineVariables": {
"sensor": {
"kind": "numeric",
"value": {
"tsx": "coalesce($event.sensors.value.Double, todouble($event.sensors.value.Long))"
},
"aggregation": {
"tsx": "avg($value)"
}
}
},
"projectedVariables": [
"sensor"
]
}
}
events
| where timestamp >= datetime(2021-11-01T00:00:00.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.0000000Z)
| where deviceId_string == "deviceId1"
| where ['sensors.sensor_string'] == "heater" and ['sensors.location_string'] == "floor1room12"
| summarize avgSensorValue= avg(coalesce(['sensors.value_double'], todouble(['sensors.value_long']))) by bin(IntervalTs = timestamp, 1m)
| project IntervalTs, avgSensorValue
Power BI
迁移基于时序见解的 Power BI 报表没有自动化过程。 依赖于时序洞察中存储的数据的所有查询都必须迁移到 Eventhouse。
若要在 Power BI 中创建高效的时序报表,建议参考以下信息性博客文章:
- Power BI 中的
Eventhouse 时序功能 - 如何在没有大多数限制的情况下使用 M 动态参数
- 在 KQL、Power Query 和 Power BI 中
时间跨度/持续时间值 - Power BI 中的
KQL 查询设置 - 在本地时间筛选和可视化 Kusto 数据
- PBI + Kusto 中的准实时报告
- 使用 ADX Power BI 建模 - 速查表
有关在 Power BI 中创建有效的时序报表的指导,请参阅这些资源。
Real-Time 仪表板
Fabric中的Real-Time仪表板是由多个磁贴组成的集合,磁贴可以按需在页面中进行组织。每个磁贴都有其基础查询和相应的视觉表现形式。 可以将 Kusto 查询语言 (KQL) 查询直接导出到仪表板,以可视化形式呈现,并在稍后根据需要修改其基础查询和可视化格式。 除了便于数据浏览外,此完全集成的仪表板体验还提供改进的查询和可视化性能。
首先,在 Fabric Real-Time Intelligence 中创建新的仪表板。 借助此功能,可以浏览数据、自定义视觉对象、应用条件格式以及利用参数。 此外,可以直接从 Real-Time 仪表板创建警报,从而增强监视功能。 有关如何创建仪表板的详细说明,请参阅 官方文档。