Instrumentbord i sanntid – Git-integrering

Denne artikkelen beskriver mappe- og filstrukturen for Real-Time instrumentbordelementer når de er synkronisert til et GitHub- eller Azure Devops-repositorium.

Mappestruktur

Når et arbeidsområde er synkronisert til et repo, ser du en mappe på øverste nivå for arbeidsområdet og en undermappe for hvert element som ble synkronisert. Hver undermappe er formatert med elementnavn. Elementtype

I mappen for instrumentbordet ser du følgende filer:

  • Plattform: Definerer stoffplattformverdier som visningsnavn og beskrivelse.
  • Egenskaper: Definerer elementspesifikke verdier.

Her er et eksempel på mappestrukturen:

Repo

  • Arbeidsområde A
    • Item_A.KQLDashboard
      • .plattform
      • RealTimeDashboard-1.json
  • Arbeidsområde B
    • Item_B.KQLDashboard
      • .plattform
      • RealTimeDashboard-2.json

Real-Time instrumentbordfiler

Følgende filer finnes i en instrumentbordmappe:

  • .plattform

    Filen bruker følgende skjema til å definere et instrumentbord i sanntid:

    {
      "$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 bruker følgende skjema til å definere et instrumentbord i sanntid:

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

Real-Time dashbordvalidering

Real-Time Dashboard-lastendepunktet validerer JSON-en utover standard skjema-samsvar. Brudd vises for brukerne i dashbordets UI som feilmeldinger som: Error loading dashboard / Error found at: /<section> / Message: <reason>.

Spørringsreferansens unikhet

Alle queryId i dashbordet må refereres nøyaktig én gang, telles over:

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

Hvis a queryId deles mellom to fliser, eller mellom en flis og en baseQuery, feiler valideringen med: /queries: Some query IDs are used in multiple query references (tiles, base queries, parameters).

Når du programmatisk dupliserer en flis til en ny side, dupliser du også spørringen (tildel en ny queryId, behold den samme text og dataSource) og pek de nye flisene queryRef.queryId mot den nye spørringen.

ID-unikhet og format

Hver i , , , , parameters[], dataSources[], og pages[] må være: baseQueries[]queries[]tiles[]id

  • Unik innenfor sin kategori.
  • En gyldig RFC 4122 UUID (for eksempel 3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a). Lesbare strenger som tilfeldigvis har bindestreker (for eksempel my-tile-0001-0000-0000-000000000001) blir avvist ved lastetid med: Needs to follow the UUID format as defined by RFC 4122.

For programmatiske redigeringer, generer ID-er med et UUID-bibliotek: uuid.uuid4() for ferske ID-er, eller uuid.uuid5(namespace, label) for deterministiske ID-er som overlever skript-rekjøringer.

Tips

Hvis du ser en lastfeil som /tiles/N/queryRef ... must have required property 'baseQueryId', er den faktiske feilen vanligvis en feil, queryRef.queryIdikke en manglende baseQueryIdfeil. Skjemaet queryRef er et oneOf mellom { kind: "query", queryId: <uuid> } og { kind: "baseQuery", baseQueryId: <uuid> }. Når den indre UUIDEN er ugyldig, feiler validatoren i -kind-grenen queryog rapporterer feil fra -kind-grenen baseQueryi stedet. Fikser du UUID, forsvinner kaskaden.

Bevaring av identitet på tvers av redigeringer

For å bevare koblingen mellom filen og det levende arbeidsområdet, ikke endre følgende på eksisterende oppføringer:

  • Toppnivå: id, eTag, schema_version
  • Per flis: id, pageId, queryRef.queryId
  • Per spørring: id, dataSource.dataSourceId
  • Ifølge dataKilde: id, scopeId
  • Per side: id
  • Per parameter: id, variableName (ogbeginVariableName / endVariableNamefor kind: "duration")
  • .platform: config.logicalId

Å endre disse identifikatorene vil føre til at endringen behandles som en sletting og en gjenskaping på neste Update from Git, noe som vil føre til tapt kontekst: festede elementreferanser, share-targets og enhver tilstand knyttet til originalen id.

Parametre

Når en flis som bruker en parameter (referert via forespørselens usedVariables) legges til på en ny side, vises ikke den parameteren automatisk på den nye siden. Hvis parameteren showOnPages.kind er "selection", må du legge til de nye sidene id til .showOnPages.pageIds Hvis parameteren har en brukbar defaultValue, gjengir flisen med standard.

Parametere med flere variabler som kind: "duration" parametere eksponerer to variabler via beginVariableName og endVariableName (vanligvis _startTime og _endTime). De deler et enkelt parameterobjekt med én showOnPages innstilling.

Eksempelredigeringer via Git

Ved å bruke skjema- og valideringsnotatene kan du gjøre endringer på Real-Time-dashbordet via Git i stedet for via brukergrensesnittet.

Eksempel: Kopier en flis til en ny side

For å kopiere en flis fra side A til en nylig lagt til side B ved å redigere RealTimeDashboard-N.json:

  1. Legg til side B med pages[] en ny id.
  2. Dypkopier kildeflisen i tiles[]. Tildel:
    • ny flis id (frisk GUID)
    • pageId = side Bs ID
  3. Finn kildespørringen i queries[] ved kildeflisens .queryRef.queryId
  4. Dypkopier spørringen inn i queries[] med en ny id.
  5. Oppdater de klonede flisene queryRef.queryId til de nye spørringene id.
  6. For hver parameter som refereres til i den klonede spørringen usedVariables[]: hvis showOnPages.kind == "selection", legg til side Bs ID til showOnPages.pageIds.
  7. Valider at ingen queryId forekommer mer enn én gang over tiles[], baseQueries[], og parameters[].dataSource.queryRef.
  8. Committ, push, og kjør Oppdatering fra Git på arbeidsområdet.