Echtzeit-Dashboard – Git-Integration

In diesem Artikel werden der Ordner und die Dateistruktur für Real-Time Dashboardelemente erläutert, sobald sie mit einem GitHub- oder Azure Devops-Repository synchronisiert wurden.

Ordnerstruktur

Sobald ein Arbeitsbereich mit einem Repository synchronisiert wurde, wird ein Ordner der obersten Ebene für den Arbeitsbereich und ein Unterordner für jedes Element angezeigt, das synchronisiert wurde. Jeder Unterordner ist mit dem Elementnamen formatiert. Elementtyp

Im Ordner für das Dashboard werden die folgenden Dateien angezeigt:

  • Plattform: Definiert Fabric-Plattformwerte wie Anzeigename und Beschreibung.
  • Eigenschaften: Definiert elementspezifische Werte.

Hier ist ein Beispiel für die Ordnerstruktur:

Repo

  • Arbeitsbereich A
    • Item_A.KQLDashboard
      • .Plattform
      • RealTimeDashboard-1.json
  • Arbeitsbereich B
    • Item_B.KQLDashboard
      • .Plattform
      • RealTimeDashboard-2.json

Real-Time Dashboarddateien

Die folgenden Dateien sind in einem Dashboardordner enthalten:

  • .Plattform

    Die Datei verwendet das folgende Schema, um ein Echtzeitdashboard zu definieren:

    {
      "$schema": "https://developer.microsoft.com/json-schemas/fabric/gitIntegration/platformProperties/2.0.0/schema.json",
      "metadata": {
        "type": "KQLDashboard",
        "displayName": "",
        "description": ""
      },
      "config": {
        "version": "2.0",
        "logicalId": ""
      }
    }
    
  • RealTimeDashboard.json

    Die Datei verwendet das folgende Schema, um ein Echtzeitdashboard zu definieren:

    {
      "$schema": "",
      "id": "",
      "eTag": "\"\"",
      "schema_version": "",
      "title": "",
      "tiles": [
        {
          "id": "",
          "title": "",
          "visualType": "",
          "pageId": "",
          "layout": {
            "x": ,
            "y": ,
            "width": ,
            "height":
          },
          "queryRef": {
            "kind": "",
            "queryId": ""
          },
          "visualOptions": {
            "multipleYAxes": {
              "base": {
                "id": "",
                "label": "",
                "columns": [],
                "yAxisMaximumValue": ,
                "yAxisMinimumValue": ,
                "yAxisScale": "",
                "horizontalLines": []
              },
              "additional": [],
              "showMultiplePanels":
            },
            "hideLegend": ,
            "legendLocation": "",
            "xColumnTitle": "",
            "xColumn": ,
            "yColumns": ,
            "seriesColumns": ,
            "xAxisScale": "",
            "verticalLine": "",
            "crossFilterDisabled": ,
            "drillthroughDisabled": ,
            "crossFilter": [
              {
                "interaction": "",
                "property": "",
                "parameterId": "",
                "disabled":
              }
            ],
            "drillthrough": [],
            "selectedDataOnLoad": {
              "all": ,
              "limit":
            },
            "dataPointsTooltip": {
              "all": ,
              "limit":
            }
          }
        }
      ],
      "baseQueries": [],
      "parameters": [
        {
          "kind": "",
          "id": "",
          "displayName": "",
          "description": "",
          "variableName": "",
          "selectionType": "",
          "includeAllOption": ,
          "defaultValue": {
            "kind": ""
          },
          "dataSource": {
            "kind": "",
            "columns": {
              "value": ""
            },
            "queryRef": {
              "kind": "",
              "queryId": ""
            }
          },
          "showOnPages": {
            "kind": ""
          },
          "allIsNull":
        },
      ],
      "dataSources": [
        {
          "id": "",
          "name": "",
          "clusterUri": "",
          "database": "",
          "kind": "",
          "scopeId": ""
        }
      ],
      "pages": [
        {
          "name": "",
          "id": ""
        }
      ],
      "queries": [
        {
          "dataSource": {
            "kind": "",
            "dataSourceId": ""
          },
          "text": "",
          "id": "",
          "usedVariables": [
            "",
            ""
          ]
        }
      ]
    }
    

Echtzeit-Dashboard-Überprüfung

Der Real-Time Dashboardladeendpunkt überprüft den JSON-Code über die Standardschemakonformität hinaus. Verstöße werden benutzern auf der Dashboard-Benutzeroberfläche als Fehlermeldungen wie: Error loading dashboard / Error found at: /<section> / Message: <reason>angezeigt.

Eindeutigkeit der Abfrage-Referenz

Jedes queryId im Dashboard muss genau einmal referenziert werden, gezählt über:

  • tiles[].queryRef.queryId
  • baseQueries[].queryId
  • parameters[].dataSource.queryRef.queryId

Wenn ein queryId zwischen zwei Kacheln oder zwischen einer Kachel und einer BaseQuery gemeinsam genutzt wird, schlägt die Validierung fehl mit: /queries: Some query IDs are used in multiple query references (tiles, base queries, parameters).

Wenn Sie eine Kachel programmgesteuert auf eine neue Seite duplizieren, duplizieren Sie auch die Abfrage (weisen Sie eine neue queryId zu, behalten Sie dasselbe text und dataSource bei) und richten Sie die neue Kachel queryRef.queryId auf die neue Abfrage aus.

Eindeutigkeit und Format der ID

Alle id in tiles[], queries[], baseQueries[], parameters[], dataSources[] und pages[] müssen sein:

  • Einzigartig innerhalb seiner Kategorie.
  • Eine gültige RFC 4122 UUID (z. B 3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a. ). Lesbare Zeichenfolgen mit Bindestrichen (z. B. my-tile-0001-0000-0000-000000000001) werden zum Ladezeitpunkt mit Needs to follow the UUID format as defined by RFC 4122 abgelehnt.

Generieren Sie bei programmgesteuerten Bearbeitungen IDs mit einer UUID-Bibliothek: uuid.uuid4() für neue IDs oder uuid.uuid5(namespace, label) für deterministische IDs, die Skript-Wiederholungen überleben.

Tip

Wenn ein Ladefehler wie /tiles/N/queryRef ... must have required property 'baseQueryId' angezeigt wird, liegt der tatsächliche Fehler normalerweise in einem falsch formatierten queryRef.queryId, nicht in einem fehlenden baseQueryId. Das Schema queryRef ist eine oneOf zwischen { kind: "query", queryId: <uuid> } und { kind: "baseQuery", baseQueryId: <uuid> }. Wenn die innere UUID ungültig ist, versagt der Validator die Überprüfung der query-kind Verzweigung und meldet stattdessen Fehler aus der baseQuery-kind Verzweigung. Beheben Sie die UUID und die Kaskadierung wird zurückgesetzt.

Identitätserhaltung über Bearbeitungen hinweg

Wenn Sie die Verknüpfung zwischen der Datei und dem Element des Livearbeitsbereichs beibehalten möchten, ändern Sie die folgenden Punkte bei vorhandenen Einträgen nicht:

  • Oberste Ebene: id, eTagschema_version
  • Pro Kachel: id, pageId, queryRef.queryId
  • Pro Abfrage: id, dataSource.dataSourceId
  • Pro Datenquelle: id, scopeId
  • Pro Seite: id
  • Pro Parameter: id, variableName (und beginVariableName / endVariableName für kind: "duration")
  • .platform: config.logicalId

Das Ändern dieser Bezeichner führt dazu, dass die Änderung als Löschvorgang behandelt wird und bei der nächsten Update from Git zu einer Neuerstellung führen, was zu verlorenem Kontext führt: Referenzen auf angeheftete Elemente, Freigabeziele und jeder Status, der mit dem ursprünglichen id verknüpft ist.

Parameter

Wenn eine Kachel, die einen Parameter verwendet (über die Abfrage usedVariablesreferenziert), einer neuen Seite hinzugefügt wird, wird dieser Parameter nicht automatisch auf der neuen Seite angezeigt. Wenn der Parameter showOnPages.kind"selection" ist, sollten Sie id der neuen Seite zu showOnPages.pageIds hinzufügen. Wenn der Parameter über einen verwendbaren defaultValueParameter verfügt, wird die Kachel mit der Standardeinstellung gerendert.

Multivariable Parameter wie kind: "duration" Parameter machen zwei Variablen über beginVariableName und endVariableName (häufig _startTime und _endTime) verfügbar. Sie teilen ein einzelnes Parameterobjekt mit einer showOnPages Einstellung.

Beispielbearbeitungen über Git

Mithilfe der Schema- und Validierungshinweise können Sie Änderungen am Real-Time-Dashboard über Git statt über die Benutzeroberfläche vornehmen.

Beispiel: Kopieren einer Kachel auf eine neue Seite

Um eine Kachel von Seite A zu einer neu hinzugefügten Seite B zu kopieren, indem Sie RealTimeDashboard-N.json bearbeiten:

  1. Fügen Sie Seite B zu pages[] mit einem neuen id hinzu.
  2. Führen Sie eine Tiefenkopie der Quellkachel in tiles[] durch. Zuweisen:
    • neue Kachel id (neue GUID)
    • pageId = ID der Seite B
  3. Finden Sie die Quellabfrage in queries[] anhand der Quellkachel queryRef.queryId.
  4. Erstellen Sie eine Tiefenkopie der Abfrage in queries[] mit einem neuen id.
  5. Aktualisieren Sie das queryRef.queryId der geklonten Kachel auf das id der neuen Abfragen.
  6. Für jeden Parameter, auf den in der geklonten Abfrage usedVariables[]verwiesen wird: wenn showOnPages.kind == "selection", fügen Sie die ID der Seite B an showOnPages.pageIds.
  7. Überprüfen Sie, ob nicht queryId mehr als einmal in tiles[], baseQueries[] und parameters[].dataSource.queryRef.
  8. Commit, Pushen und Ausführen von Update von Git im Arbeitsbereich.