แดชบอร์ดแบบเรียลไทม์ - การรวม Git

บทความนี้แสดงรายละเอียดโฟลเดอร์และโครงสร้างไฟล์สําหรับ Real-Time รายการแดชบอร์ดเมื่อมีการซิงค์กับที่เก็บ GitHub หรือ Azure Devops

โครงสร้างโฟลเดอร์

เมื่อพื้นที่ทํางานถูกซิงค์กับ repo คุณจะเห็นโฟลเดอร์ระดับบนสุดสําหรับพื้นที่ทํางานและโฟลเดอร์ย่อยสําหรับแต่ละรายการที่ถูกซิงค์ โฟลเดอร์ย่อยแต่ละโฟลเดอร์ถูกจัดรูปแบบด้วย ชื่อรายการชนิดหน่วยข้อมูล

ภายในโฟลเดอร์สําหรับแดชบอร์ด คุณจะเห็นไฟล์ต่อไปนี้:

  • แพลตฟอร์ม: กําหนดค่าแพลตฟอร์มผ้า เช่น ชื่อที่แสดงและคําอธิบาย
  • คุณสมบัติ: กําหนดค่าเฉพาะของรายการ

นี่คือตัวอย่างของโครงสร้างโฟลเดอร์:

Repo

  • พื้นที่ทํางาน A
    • Item_A.KQLDashboard
      • แท่น
      • RealTimeDashboard-1.json
  • พื้นที่ทํางาน B
    • Item_B.KQLDashboard
      • แท่น
      • RealTimeDashboard-2.json

Real-Time ไฟล์แดชบอร์ด

ไฟล์ต่อไปนี้มีอยู่ในโฟลเดอร์แดชบอร์ด:

  • แท่น

    ไฟล์ใช้ schema ต่อไปนี้เพื่อกําหนดแดชบอร์ดแบบเรียลไทม์:

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

    ไฟล์ใช้ schema ต่อไปนี้เพื่อกําหนดแดชบอร์ดแบบเรียลไทม์:

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

ตําแหน่งข้อมูลการโหลดแดชบอร์ด Real-Time จะตรวจสอบความถูกต้องของ JSON นอกเหนือจากความสอดคล้องของสคีมามาตรฐาน การละเมิดจะปรากฏต่อผู้ใช้ใน UI ของแดชบอร์ดเป็นข้อความแสดงข้อผิดพลาด เช่น Error loading dashboard / Error found at: /<section> / Message: <reason>

เอกลักษณ์ของการอ้างอิงคิวรี

ทุกรายการ queryId ในแดชบอร์ดต้องอ้างอิง เพียงครั้งเดียว โดยนับตาม:

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

ถ้า a queryId ถูกแชร์ระหว่างไทล์สองไทล์ หรือระหว่างไทล์และ baseQuery การตรวจสอบความถูกต้องจะล้มเหลวด้วย: /queries: Some query IDs are used in multiple query references (tiles, base queries, parameters)

เมื่อทําสําเนาไทล์ไปยังหน้าใหม่โดยทางโปรแกรม ให้ทําซ้ําแบบสอบถามด้วย (กําหนด queryIdให้เหมือนเดิม text และ dataSource) และชี้ไทล์ queryRef.queryId ใหม่ไปที่แบบสอบถามใหม่

เอกลักษณ์และรูปแบบของ ID

ทุกใน id , , , tiles[]queries[], , baseQueries[]และparameters[]ต้องเป็น: dataSources[]pages[]

  • ไม่ซ้ํากัน ในหมวดหมู่
  • RFC 4122 UUID ที่ถูกต้อง (ตัวอย่างเช่น 3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a) สตริงที่อ่านได้ซึ่งมีขีดกลาง (เช่น my-tile-0001-0000-0000-000000000001) จะถูกปฏิเสธในเวลาโหลดด้วย: Needs to follow the UUID format as defined by RFC 4122.

สําหรับการแก้ไขแบบเป็นโปรแกรม ให้สร้างรหัสด้วยไลบรารี UUID: uuid.uuid4() สําหรับรหัสใหม่ หรือ uuid.uuid5(namespace, label) สําหรับรหัสที่กําหนดที่รอดจากการเรียกใช้สคริปต์ซ้ํา

Tip

หากคุณเห็นข้อผิดพลาดในการโหลดเช่น /tiles/N/queryRef ... must have required property 'baseQueryId'ความผิดพลาดที่แท้จริงมักจะเป็น queryRef.queryIdความผิดปกติ ไม่ใช่ baseQueryIdหายไป สคีมา queryRef คือ ระหว่าง oneOf{ kind: "query", queryId: <uuid> } และ { kind: "baseQuery", baseQueryId: <uuid> }. เมื่อ UUID ภายในไม่ถูกต้อง ผู้ตรวจสอบความถูกต้องจะล้มเหลวใน queryสาขา -kind และรายงานความล้มเหลวจาก baseQueryสาขา -kind แทน แก้ไข UUID และน้ําตกจะล้าง

การรักษาข้อมูลประจําตัวในการแก้ไข

เมื่อต้องการรักษาการเชื่อมโยงระหว่างไฟล์และรายการพื้นที่ทํางานแบบสด อย่าปรับเปลี่ยนสิ่งต่อไปนี้ในรายการ ที่มีอยู่ :

  • ระดับบนสุด: id, , eTagschema_version
  • ต่อไทล์: id, , pageIdqueryRef.queryId
  • ต่อคําค้นหา: id, dataSource.dataSourceId
  • ต่อ dataSource: id, scopeId
  • ต่อหน้า: id
  • ต่อพารามิเตอร์: id, variableName (และbeginVariableName / endVariableNameสําหรับ kind: "duration")
  • .platform: config.logicalId

การแก้ไขตัวระบุเหล่านี้จะทําให้การเปลี่ยนแปลงถือเป็นการลบและการสร้างใหม่ในครั้งถัดไป Update from Gitซึ่งจะทําให้บริบทสูญหาย: การอ้างอิงรายการที่ปักหมุด เป้าหมายการแชร์ และสถานะใดๆ ที่แนบมากับต้นฉบับid

พารามิเตอร์

เมื่อไทล์ที่ใช้พารามิเตอร์ (อ้างอิงผ่าน ) ของคิว usedVariablesรีถูกเพิ่มลงในหน้าใหม่ พารามิเตอร์นั้นจะไม่ปรากฏบนหน้าใหม่โดยอัตโนมัติ ถ้าพารามิเตอร์เป็น showOnPages.kind"selection"คุณต้องผนวกหน้าidใหม่เข้ากับshowOnPages.pageIds ถ้าพารามิเตอร์มี ใช้ได้ defaultValueไทล์จะแสดงผลด้วยค่าเริ่มต้น

พารามิเตอร์หลายตัวแปร เช่น kind: "duration" พารามิเตอร์แสดงตัวแปรสองตัวผ่าน beginVariableName และ endVariableName (โดยทั่วไป _startTime และ _endTime) พวกเขาใช้วัตถุพารามิเตอร์เดียวร่วมกันด้วยการตั้งค่าเดียวshowOnPages

ตัวอย่างการแก้ไขผ่าน Git

การใช้ Schema และบันทึกการตรวจสอบความถูกต้องช่วยให้คุณสามารถทําการเปลี่ยนแปลงแดชบอร์ด Real-Time ผ่าน Git แทนที่จะผ่านอินเทอร์เฟซผู้ใช้

ตัวอย่าง: คัดลอกไทล์ไปยังหน้าใหม่

เมื่อต้องการคัดลอกไทล์จากหน้า A ไปยังหน้า B ที่เพิ่มใหม่โดยการแก้ไข RealTimeDashboard-N.json:

  1. เพิ่มหน้า B ด้วย pages[] .id
  2. คัดลอกไทล์ต้นฉบับแบบลึกใน tiles[]. มอบหมาย:
    • ไทล์ id ใหม่ (GUID ใหม่)
    • pageId = ID ของหน้า B
  3. ค้นหาคิวรีต้นฉบับตาม queries[] ไท queryRef.queryIdล์ต้นฉบับ
  4. คัดลอกแบบสอบถามแบบเจาะลึกด้วย queries[] ไฟล์ id. ใหม่
  5. อัปเดตไทล์ queryRef.queryId ที่โคลนเป็นคิว idรีใหม่
  6. สําหรับแต่ละพารามิเตอร์ที่อ้างอิงในคิวรีusedVariables[]ที่โคลน : if showOnPages.kind == "selection"ให้ผนวกรหัสของหน้า B เข้ากับshowOnPages.pageIds
  7. ตรวจสอบว่าไม่ queryId ปรากฏมากกว่าหนึ่งครั้งใน tiles[], baseQueries[], และ parameters[].dataSource.queryRef.
  8. คอมมิต พุช และเรียกใช้ Update จาก Git บนพื้นที่ทํางาน