将时序分析 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 文件。 可以 导入到 EventhouseKusto Graph 语义 允许将时序模型层次结构作为图进行建模、遍历和分析
时序浏览器 Real-Time 仪表板Power BI 报表 或使用 KustoTrender 编写自定义仪表板
查询语言 在 KQL 中重写查询。

迁移遥测

若要检索环境中所有数据的副本,请使用存储帐户中的 PT=Time 文件夹。 有关详细信息,请参阅 数据存储

迁移步骤 1 - 获取有关遥测数据的统计信息

数据

  1. Env 概述
    • 记录数据访问 FQDN 第一部分的环境 ID(例如,从 .env.crystal-dev.windows-int.net 的 d390b0b0-1445-4c0c-8365-68d6382c1c2a)
  2. Env 概述 -> 存储配置 -> 存储帐户
  3. 使用存储资源管理器获取文件夹统计信息
    • 记录大小和 PT=Time 文件夹的 blob 数。

迁移步骤 2 – 将数据迁移到 Eventhouse

创建 Eventhouse

若要为迁移过程设置 Eventhouse,请按照 创建 Eventhouse中的步骤操作。

数据引入

若要检索与时序见解实例对应的存储帐户的数据,请按照 从 Azure 存储获取数据的步骤进行操作。

请确保:

  1. 选择适当的容器并提供其 URI,以及所需的 SAS 令牌帐户密钥

  2. 将文件筛选器文件夹路径配置为 V=1/PT=Time 以筛选相关 blob。

  3. 验证推断的架构并删除任何不经常查询的列,同时至少保留时间戳、TSID 列和值。 为确保所有数据都复制到 Eventhouse,请添加另一列,并使用 DropMappedFields 映射转换。

  4. 完成引入过程。

查询数据

成功引入数据后,可以使用 KQL 查询集开始浏览它。 如果需要从自定义客户端应用程序访问数据,Eventhouse 为主要编程语言(如 C# (链接)、Java(链接)和 Node.js(链接)提供 SDK。

将时序模型迁移到 Azure 数据资源管理器

可以使用 TSI 资源管理器 UX 或 TSM Batch API 以 JSON 格式从 TSI 环境下载模型。 然后,可以将模型导入到 Eventhouse。

  1. 从 TSI UX 下载 TSM。

  2. 使用 Visual Studio Code 或其他编辑器删除前三行。

    TSM 迁移到 Azure 数据资源管理器的屏幕截图 - 删除前 3 行

  3. 使用 Visual Studio Code 或其他编辑器,使用正则表达式将 \},\n \{ 搜索并替换为 }{

    TSM 迁移到 Azure 数据资源管理器的屏幕截图 - 搜索和替换

  4. 使用 从单个文件获取数据,并将 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 中创建有效的时序报表的指导,请参阅这些资源。

Real-Time 仪表板

Fabric中的Real-Time仪表板是由多个磁贴组成的集合,磁贴可以按需在页面中进行组织。每个磁贴都有其基础查询和相应的视觉表现形式。 可以将 Kusto 查询语言 (KQL) 查询直接导出到仪表板,以可视化形式呈现,并在稍后根据需要修改其基础查询和可视化格式。 除了便于数据浏览外,此完全集成的仪表板体验还提供改进的查询和可视化性能。

首先,在 Fabric Real-Time Intelligence 中创建新的仪表板。 借助此功能,可以浏览数据、自定义视觉对象、应用条件格式以及利用参数。 此外,可以直接从 Real-Time 仪表板创建警报,从而增强监视功能。 有关如何创建仪表板的详细说明,请参阅 官方文档