Microsoft Fabric での Time Series Insights Gen2 からリアルタイム インテリジェンスへの移行

Note

Time Series Insights サービスは、2024 年 7 月 7 日に廃止されます。 できるだけ早く既存の環境を代替ソリューションに移行することを検討してください。 サポートの終了と移行の詳細については、こちらのドキュメントを参照してください。

概要

Eventhouse は、リアルタイム インテリジェンスの時系列データベースです。 Time Series Insights からデータを移行するためのターゲットとして機能します。

移行に関する推奨事項の概要。

機能 推奨される移行
フラット化とエスケープを使用したハブからの JSON の取り込み Azure Event Hubs からデータを取得する
コールド ストアを開く Eventhouse OneLake の可用性
Power BI コネクタ Eventhouse Power BI コネクタを使用します。 TSQ を KQL に手動で書き換えます。
Spark コネクタ Eventhouse にデータを移行します。 Apache Spark でノートブックを使用して Eventhouse にクエリを実行するか、ノートブックを使用してレイクハウス内のデータを探索します
一括アップロード Azure ストレージからデータを取得する
タイム シリーズ モデル JSON ファイルとしてエクスポートできます。 Eventhouse にインポートできます。 Kusto グラフ セマンティクスにより、時系列モデル階層をグラフとしてモデル化、走査、分析できます
時系列エクスプローラー リアルタイム ダッシュボードPower BI レポート、または KustoTrender を使用したカスタム ダッシュボード作成
クエリ言語 KQL でクエリを書き換えます。

テレメトリの移行

環境内のすべてのデータのコピーを取得するには、ストレージ アカウントで PT=Time フォルダーを使用します。 詳細については、「データ ストレージ」を参照してください。

移行手順 1 – テレメトリ データに関する統計情報を取得する

データ​​

  1. 環境の概要
    • Data Access FQDN の最初の部分の環境 ID を記録します (たとえば、.env.crystal-dev.windows-int.net の d390b0b0-1445-4c0c-8365-68d6382c1c2a)
  2. [環境の概要] -> [ストレージ構成] -> [ストレージ アカウント]
  3. Storage Explorer を使用してフォルダーの統計情報を取得します
    • PT=Time フォルダーのサイズと BLOB の数を記録します。

移行手順 2 – Eventhouse にデータを移行する

Eventhouse を作成する

移行プロセス用に Eventhouse を設定するには、Eventhouse を作成する手順に従います。

データの取り込み

Time Series Insights インスタンスに対応するストレージ アカウントのデータを取得するには、Azure Storage からデータを取得する手順に従います。

次のことを確認してください。

  1. 適切なコンテナーを選択し、その URI と、必要な SAS トークンまたはアカウント キーを指定します。

  2. ファイル フィルター フォルダーパスを V=1/PT=Time として構成し、関連する BLOB をフィルター処理します。

  3. 少なくともタイムスタンプ、TSID 列、および値を保持しながら、推論されたスキーマを確認し、クエリ頻度が低い列を削除します。 すべてのデータが Eventhouse に確実にコピーされるようにするには、別の列を追加し、DropMappedFields マッピング変換を使用します。

  4. インジェスト プロセスを完了します。

データのクエリ

データが正常に取り込まれたので、KQL クエリセットを使用してデータの探索を開始できます。 カスタム クライアント アプリケーションからデータにアクセスする必要がある場合、Eventhouse には、C# (リンク)、Java (リンク)、Node.js (リンク) などの主要プログラミング言語用の SDK が用意されています。

Azure Data Explorer への時系列モデルの移行

モデルは、TSI Explorer UX または TSM Batch API を使用して、TSI 環境から JSON 形式でダウンロードできます。 その後、モデルは Eventhouse にインポートできます。

  1. TSI UX から TSM をダウンロードします。

  2. Visual Studio Code または別のエディターを使用して、最初の 3 行を削除します。

    TSM の Azure Data Explorer への移行の最初の 3 行の削除のスクリーンショット

  3. Visual Studio Code または別のエディターを使用して、正規表現として \},\n \{ を検索して }{ に置き換えます

    TSM の Azure Data Explorer への移行の検索と置換のスクリーンショット

  4. 1 つのファイルからデータを取得する機能を使用し、JSON として ADX に別のテーブルとして取り込みます。

時系列データを Fabric リアルタイム インテリジェンスの Eventhouse に移行したら、Kusto グラフ セマンティクスの機能を使用してデータをコンテキスト化し、分析できます。 Kusto グラフ セマンティクスを使用すると、時系列モデルの階層をグラフとしてモデル化、走査、分析できます。 Kusto グラフ セマンティクスを使用すると、資産、サイト、データ ポイントなど、時系列データ内のさまざまなエンティティ間のリレーションシップに関する分析情報を得ることができます。 これらの分析情報は、システムのさまざまなコンポーネント間の依存関係と相互作用を理解するのに役立ちます。

時系列クエリ (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

{
  "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

Time Series Insights に基づく Power BI レポートの自動化された移行プロセスはありません。 Time Series Insights の格納データに依存するクエリはすべて、Eventhouse に移行する必要があります。

Power BI で効率的な時系列レポートを作成するには、次の有益なブログ記事を参照することをお勧めします。

Power BI での効果的な時系列レポート作成に関するガイダンスについては、これらのリソースを参照してください。

リアルタイム ダッシュボード

Fabric のリアルタイム ダッシュボードはタイルのコレクションです。必要に応じてページ単位で整理され、各タイルに基になるクエリがあり、視覚的に表現されています。 Kusto 照会言語 (KQL) クエリをビジュアルとしてダッシュボードにネイティブにエクスポートし、後で基になるクエリとビジュアルの書式設定を必要に応じて変更できます。 この完全に統合されたダッシュボード エクスペリエンスにより、クエリと視覚化のパフォーマンスが向上し、データ探索が容易になります。

まず、Fabric リアルタイム インテリジェンスで新しいダッシュボードを作成します。 この強力な機能を使用すると、データの探索、ビジュアルのカスタマイズ、条件付き書式の適用、パラメーターの利用が可能です。 さらに、リアルタイム ダッシュボードから直接アラートを作成し、監視機能を強化することもできます。 ダッシュボードを作成する方法の詳細な手順については、公式ドキュメントを参照してください。