Instrumentpanel i realtid – Git-integrering

Den här artikeln beskriver mapp- och filstrukturen för Real-Time instrumentpanelsobjekt när de har synkroniserats till en GitHub- eller Azure Devops-lagringsplats.

Mappstrukturen

När en arbetsyta har synkroniserats till en lagringsplats visas en mapp på den översta nivån för arbetsytan och en undermapp för varje objekt som har synkroniserats. Varje undermapp är formaterad med Objektnamn. Objekttyp

I mappen för instrumentpanelen visas följande filer:

  • Plattform: Definierar infrastrukturplattformsvärden som visningsnamn och beskrivning.
  • Egenskaper: Definierar objektspecifika värden.

Här är ett exempel på mappstrukturen:

Repository

  • Arbetsyta A
    • Item_A.KQLDashboard
      • .plattform
      • RealTimeDashboard-1.json
  • Arbetsyta B
    • Item_B.KQLDashboard
      • .plattform
      • RealTimeDashboard-2.json

Real-Time kontrollpanelsfiler

Följande filer finns i en instrumentpanelsmapp:

  • .plattform

    Filen använder följande schema för att definiera en instrumentpanel i realtid:

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

    Filen använder följande schema för att definiera en instrumentpanel i realtid:

    {
      "$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": [
            "",
            ""
          ]
        }
      ]
    }
    

Realtidsvalidering av instrumentpanel

Real-Time Dashboard-slutpunkt för inläsning validerar JSON utöver standardöverensstämmelse med schema. Överträdelser visas för användare i instrumentpanelens användargränssnitt som felmeddelanden som: Error loading dashboard / Error found at: /<section> / Message: <reason>.

Frågereferensens unikhet

Alla queryId på instrumentbrädan måste refereras exakt en gång, inräknat:

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

Om en queryId delas mellan två paneler eller mellan en panel och en baseQuery misslyckas verifieringen med: /queries: Some query IDs are used in multiple query references (tiles, base queries, parameters).

När du duplicerar en panel till en ny sida programmässigt duplicerar du även frågan (tilldelar en ny queryId, behåll samma text och dataSource) och pekar den nya panelens queryRef.queryId på den nya frågan.

Unikhet och format för ID

Varje id i tiles[], queries[], baseQueries[], parameters[], dataSources[]och pages[] måste vara:

  • Unikt inom dess kategori.
  • En giltig RFC 4122 UUID (till exempel 3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a). Läsbara strängar som råkar ha bindestreck (till exempel my-tile-0001-0000-0000-000000000001) avvisas vid belastningstillfället med: Needs to follow the UUID format as defined by RFC 4122.

För programmatiska redigeringar genererar du ID:er med ett UUID-bibliotek: uuid.uuid4() för nya ID:er eller uuid.uuid5(namespace, label) för deterministiska ID:er som överlever omkörningar av skript.

Tips/Råd

Om du ser ett läsfel som /tiles/N/queryRef ... must have required property 'baseQueryId' är det faktiska felet vanligtvis ett felaktigt queryRef.queryId inte en saknad baseQueryId. Schemats queryRef är en oneOf mellan { kind: "query", queryId: <uuid> } och { kind: "baseQuery", baseQueryId: <uuid> }. När det inre UUID:t är ogiltigt, misslyckas validatorn query-kind-grenen och rapporterar fel från baseQuery-kind-grenen i stället. Åtgärda UUID och rensa kaskaden.

Identitetsbevarande mellan redigeringar

För att bevara länken mellan filen och live-arbetsyteobjektet ska följande inte ändras för befintliga poster:

  • Översta nivån: id, eTag, schema_version
  • Per panel: id, pageId, queryRef.queryId
  • Per förfrågan: id, dataSource.dataSourceId
  • Per dataKälla: id, scopeId
  • Per sida: id
  • Per parameter: id, variableName (och beginVariableName / endVariableName för kind: "duration")
  • .platform: config.logicalId

Om du ändrar dessa identifierare behandlas ändringen som en borttagning och en ny skapelse vid nästa Update from Git, vilket orsakar förlorad kontext: referenser för fästa objekt, delningsmål och all status som är kopplad till den ursprungliga id.

Parameters

När en panel som använder en parameter (som refereras via frågans usedVariables) läggs till på en ny sida visas inte parametern automatiskt på den nya sidan. Om parametern är showOnPages.kind"selection"måste du lägga till den nya sidans id till showOnPages.pageIds. Om parametern har en användbar defaultValuerenderas panelen med standardvärdet.

Parametrar med flera variabler som kind: "duration" parametrar exponerar två variabler via beginVariableName och endVariableName (vanligtvis _startTime och _endTime). De delar ett enda parameterobjekt med en showOnPages inställning.

Exempelredigeringar via Git

Med hjälp av schemat och valideringsanteckningarna kan du göra ändringar i Real-Time instrumentpanelen via Git i stället för via användargränssnittet.

Exempel: Kopiera en panel till en ny sida

Så här kopierar du en panel från sida A till en ny sida B genom att redigera RealTimeDashboard-N.json:

  1. Lägg till sida B i pages[] med en ny id.
  2. Djupkopiera källrutan i tiles[]. Tilldela:
    • nytt kakel id (ny GUID)
    • pageId = sida B:s ID
  3. Leta upp källfrågan i queries[] källpanelens queryRef.queryId.
  4. Gör en djupkopiering av frågan till queries[] med en ny id.
  5. Uppdatera den klonade rutans queryRef.queryId till den nya sökfrågans id.
  6. För varje parameter som refereras i den klonade frågans usedVariables[]: om showOnPages.kind == "selection", läggs sidan B:s ID till showOnPages.pageIds.
  7. Kontrollera att inget queryId visas mer än en gång i tiles[], baseQueries[]och parameters[].dataSource.queryRef.
  8. Checka in, skicka och kör Uppdatering från Git på arbetsytan.