เหตุการณ์การวัดและส่งข้อมูลทางไกลสำหรับ Microsoft Dataverse
หมายเหตุ
ศูนย์จัดการ Power Platform ใหม่และได้รับการปรับปรุง อยู่ในพรีวิวสำหรับสาธารณะแล้ว เราออกแบบศูนย์การจัดการใหม่ให้ใช้งานง่ายขึ้นด้วยการนำทางที่มุ่งเน้นงานที่ช่วยให้คุณบรรลุผลลัพธ์ที่เฉพาะเจาะจงได้เร็วขึ้น เราจะเผยแพร่คู่มือใหม่และที่อัปเดตเมื่อศูนย์จัดการ Power Platform ใหม่ย้ายไปยัง ความพร้อมใช้งานทั่วไป
สตรีมข้อมูลในปัจจุบันให้ข้อมูลประสิทธิภาพที่เกี่ยวข้องกับ สายเรียกเข้าของ API Dataverse การเรียกใช้งานปลั๊กอิน Dataverse และการเรียก SDK Dataverse นอกจากนี้ยังให้ข้อมูลสำหรับความล้มเหลวในปลั๊กอินและการดำเนินงาน SDK Dataverse
Dataverse สายเรียกเข้า API
เหล่านี้คือการโทรไปยัง Dataverse API โดยอาจมาจาก ส่วนติดต่อแบบรวม (UCI) เว็บไคลเอ็นต์ดั้งเดิม ไคลเอ็นต์แบบกำหนดเองที่ใช้ SDK และอื่นๆ สามารถพบได้ในตาราง คำขอ ของ Application Insights ซึ่งมีฟิลด์ดังต่อไปนี้
ชื่อ: ชนิดของคำขอ เหล่านี้แบ่งออกเป็นสองประเภท:
- คำขอ API ของเว็บ: คำขอไปยังจุดสิ้นสุด OData v4 ที่ส่วนติดต่อแบบรวมและไคลเอนต์สมัยใหม่ใช้กันทั่วไป คำขอนี้เปลี่ยนเป็นการดำเนินการที่เหมือนกันสำหรับทั้งสองอย่าง Web API เป็น "ตัวห่อหุ้ม" เพื่อเปิดใช้งานโมเดลการเขียนโปรแกรม RESTful แต่หลังจากได้รับข้อมูลแล้ว ทุกอย่างจะเหมือนกันภายในเซิร์ฟเวอร์ เมื่อการตอบกลับถูกส่งกลับ จะถูกแปลงเป็น JSON หากคำขอมาจาก Web API
- คำขอบริการองค์กร: คำขอที่ส่งไปยังตำแหน่งข้อมูล API ที่ใช้โดยไคลเอ็นต์ SDK หรือเว็บไคลเอ็นต์ดั้งเดิม
ระยะเวลา: ระยะเวลาที่เซิร์ฟเวอร์ใช้ในการตอบสนองต่อคำขอ
Url: URL ที่ทำการโทร
CustomDimensions:
UserAgent: Application Insights เติมฟิลด์ตัวแทนผู้ใช้โดยอัตโนมัติด้วย PC เนื่องจากบันทึกเหล่านี้ถูกผลักจากเซิร์ฟเวอร์ในศูนย์ข้อมูล Application Insights ไม่อนุญาตให้แทนที่ฟิลด์ตัวแทนผู้ใช้ บางครั้ง ฟิลด์ตัวแทนผู้ใช้ไม่สามารถเติมข้อมูลได้ ตัวแทนผู้ใช้ที่ทำการโทรสามารถดูได้โดยใช้การสอบถามต่อไปนี้:
requests | summarize count() by tostring(customDimensions.userAgent)
Operation_Name: ชื่อที่อ่านได้ของการดำเนินการที่จะแสดงบนมุมมอง เช่น มุมมองธุรกรรมแบบครบวงจร
Dataverse บันทึกการดำเนินการปลั๊กอิน
บันทึกเหล่านี้สำหรับปลั๊กอินแบบกำหนดเองที่ทำงานสำหรับการดำเนินการที่กำหนด มีอยู่ในตาราง การขึ้นต่อกัน ต่อไปนี้เป็นการสอบถามตัวอย่าง:
dependencies
| where type == "Plugin"
| take 100
- ชื่อ/เป้าหมาย: ชื่อชนิดแบบเต็มสำหรับปลั๊กอินที่กำลังดำเนินการ
- ระยะเวลา: ระยะเวลาที่ใช้ในการดำเนินการปลั๊กอิน
-
CustomDimensions:
- ความลึก: ความลึก ปัจจุบันของการดำเนินการในสแตกการเรียก
- EntityName: ชื่อของเอนทิตีที่ดำเนินการโดยปลั๊กอิน
-
IsolationType: ค่า ระบุว่ากำลังดำเนินการปลั๊กอินใน Sandbox หรือไม่:
- 1: ไม่มี
- 2: Sandbox
- 3: ภายนอก
- PluginName: ชื่อของปลั๊กอินที่ผู้ใช้จำได้ง่าย
- ชนิดปลั๊กอิน: ชื่อของชนิดของปลั๊กอินที่กำลังดำเนินการ
- PluginVersion: เวอร์ชันของปลั๊กอินที่เผยแพร่ ความตั้งใจในที่นี้คือสามารถใช้ข้อมูลนี้เพื่อแก้ไขปัญหาการอัปเดตเวอร์ชันได้
-
ลำดับขั้น: แมปกับค่าต่อไปนี้:
- PreValidation = 10
- PreOperation = 20
- PreOperationBeforeExternalPlugins = 15
- PreOperationAfterExternalPlugins = 25
- MainOperation = 30
- PostOperationBeforeExternalPlugins = 35
- PostOperationAfterExternalPlugins = 45
- PostOperation = 40
- PostOperationDeprecated = 50
- StepName: ชื่อของขั้นตอนการประมวลผลข้อความ SDK ซึ่งมักจะสร้างโดยเครื่องมือการลงทะเบียนปลั๊กอิน โดยใช้ข้อมูลเกี่ยวกับ PluginName, PluginType และชื่อของการดำเนินการ —ตัวอย่างเช่น ErrorMessageTest.ThrowException: การสร้างบัญชี
การวัดและส่งข้อมูลทางไกลภายในโค้ดปลั๊กอินของคุณ
เพื่อเข้าใจสิ่งที่เกิดขึ้น ภายใน รหัสปลั๊กอินของคุณ คุณสามารถรวมการวัดและส่งข้อมูลทางไกลแบบกำหนดเองจากภายในปลั๊กอินของคุณ โดยใช้ อินเทอร์เฟซ Microsoft.Xrm.Sdk.PluginTelemetry.ILogger ในโค้ดปลั๊กอินของคุณ เพื่อเขียนข้อมูลจากการวัดและส่งข้อมูลทางไกลโดยตรงไปยังทรัพยากร Application Insights ข้อมูลเพิ่มเติม: เขียนการวัดและส่งข้อมูลทางไกลไปที่ ทรัพยากร Application Insights ของคุณ โดยใช้ ILogger (พรีวิว)
บันทึก Dataverse SDK
บันทึกเหล่านี้เป็นบันทึกสำหรับการดำเนินการ SDK ที่ทริกเกอร์โดยเป็นส่วนหนึ่งของคำขอที่เข้ามา สิ่งเหล่านี้ถูกบันทึกไว้ในตาราง การขึ้นต่อกัน ใน Application Insights เนื่องจากถูกติดตามเป็นการขึ้นต่อกันสำหรับคำขอที่จะดำเนินการ บันทึกจะถูกระบุด้วยชื่อชนิด ที่ขึ้นต้นด้วย SDK ต่อไปนี้เป็นการสอบถามตัวอย่าง:
dependencies
| where type startswith "SDK"
| take 10
- ชนิด: ชนิดของคำขอ SDK ที่ทริกเกอร์ ตัวอย่าง ได้แก่ Retrieve, RetrieveMultiple, FetchXmlToQueryExpression และ WhoAmI
- ชื่อ/เป้าหมาย: นี่คือชื่อของเอนทิตีที่เป็นเป้าหมายโดยการดำเนินการ SDK
-
CustomDimensions:
- ClientType: ชนิดของลูกค้าที่โทรมา ค่าที่เป็นไปได้บางค่า ได้แก่ Web, UCIClient และ OutlookFull
- EntityId: รหัสเฉพาะของเอนทิตีที่กำลังใช้งาน
- EntityName: ชื่อของเอนทิตีที่กำลังใช้งาน
ข้อยกเว้น
คุณจะเห็นรายละเอียดของความล้มเหลวในปลั๊กอินและการดำเนินการ SDK ใน Application Insights ตาราง ข้อยกเว้นใน ใน Application Insights ให้ความสามารถในแผง ความล้มเหลว รายละเอียดความล้มเหลวเหล่านี้สัมพันธ์กับเหตุการณ์ที่เหลือในการเรียกปลั๊กอินและ SDK ในมุมมองแบบครบวงจร ข้อมูลที่มีอยู่ทั้งหมดจะถูกเพิ่มลงในคอลัมน์เมื่อเป็นไปได้ และเพิ่มลงใน customDimensions เมื่อไม่มีคอลัมน์ที่ตรงกันทุกประการ
คุณจะสังเกตเห็นว่าบางส่วนของฟิลด์ในตาราง ข้อยกเว้น ไม่ถูกเติมข้อมูล เนื่องจากฟิลด์เหล่านี้สามารถตั้งค่าได้ก็ต่อเมื่อ Application Insights SDK ถูกใช้เพื่อปล่อยบันทึกจากแหล่งที่มา คุณลักษณะนี้รวบรวมการวัดและส่งข้อมูลทางไกลของแพลตฟอร์มแล้วส่งไปยัง Application Insights ให้สอดคล้องกับสคีมา Application Insights
exceptions
| take 10
การสอบถามนี้จะส่งคืนรายละเอียดแอตทริบิวต์ทั้งหมดจากตาราง ข้อยกเว้น
- รหัสปัญหา/ชนิด: ชนิดของข้อยกเว้น
- outerMessage: ข้อความข้อยกเว้น
-
customDimensions:
- clientType: ชนิดของลูกค้าที่โทรมา ค่าที่เป็นไปได้บางค่า ได้แก่ Web, UCIClient และ OutlookFull
- exceptionSource: ปลั๊กอินหรือจุดที่ส่งข้อยกเว้น
- entityName: ชื่อของเอนทิตีที่กำลังใช้งาน
- pluginName: ชื่อของปลั๊กอินที่มีการส่งข้อยกเว้น
หากผู้ใช้รายงานข้อผิดพลาด คุณสามารถใช้ รหัสผู้ใช้ (รหัสของ Microsoft Entra ID) เพื่อทำความเข้าใจรายละเอียดจากตาราง ข้อยกเว้น
exceptions
| where user_Id == '00aa00aa-bb11-cc22-dd33-44ee44ee44ee'
รหัสเอนทิตีและชื่อเอนทิตีมีอยู่ใน customDimensions ในตาราง การขึ้นต่อกัน
dependencies
| where type == "SDK Retrieve"
คำถามที่ถามบ่อย (FAQs)
ต่อไปนี้เป็นคำถามที่พบบ่อยเกี่ยวกับเหตุการณ์การวัดและส่งข้อมูลทางไกลสำหรับ Dataverse
ฉันจะทราบได้อย่างไรว่าการอัปเกรดปลั๊กอินของฉันทำให้ประสิทธิภาพการทำงานลดลงหรือไม่
dependencies
| where ['type'] == "Plugin"
| where name startswith "[InsertYourPluginName]"
| summarize avg(duration) by name
ชื่อปลั๊กอินควรมีเวอร์ชันสำหรับปลั๊กอินที่กำหนดเองด้วย
API ทำงานอย่างไรก่อนเกิดปัญหาที่รายงาน ตามเวลาของวันหรือสถานที่ API ลดลงทีละน้อยหรือกะทันหัน
requests
| where url == "https://<URLHere>"
| summarize avg(duration), count() by bin(timestamp, 1h)
| render timechart
ในแผนภูมินี้ เราจะเห็นประสิทธิภาพของจุดสิ้นสุด API ในช่วงระยะเวลาหนึ่งเทียบกับจำนวนคำขอที่ส่ง
นอกจากนี้คุณยังสามารถ ตั้งค่าการแจ้งเตือน ตามประสิทธิภาพของ API เฉพาะที่นี่ ภายใน Application Insights
ฉันสามารถดูรายละเอียดแนวลึกเกี่ยวกับข้อผิดพลาดหรือความล้มเหลวในเวลาที่กำหนด หรือสำหรับผู้ใช้เฉพาะเพื่อให้เข้าใจสแตกการเรียกได้หรือไม่
ดูที่แผง ความล้มเหลว ให้ภาพรวมของความล้มเหลวในช่วงเวลาที่กำหนด จากนั้นคุณสามารถจำกัดความล้มเหลวให้แคบลงตามการเรียก API หรือชนิดการขึ้นต่อกัน เพื่อดูมุมมองแบบครบวงจร
ฉันสามารถสร้างแดชบอร์ดแบบกำหนดเองได้หรือไม่
ใช่ คุณสามารถสร้าง แดชบอร์ดแบบกำหนดเอง ด้วย Application Insights
ฉันสามารถกำหนดประสิทธิภาพการใช้งานปลั๊กอิน (เวลาตอบสนอง) และอัตราความล้มเหลวระหว่างการใช้งานสูงสุดได้หรือไม่
ใช่ ดูตัวอย่างการสอบถามต่อไปนี้ เพื่อทำความเข้าใจว่าปลั๊กอินของคุณทำงานอย่างไร
dependencies
| where ['type'] == "Plugin"
| where name == "[Plugin name here]"
| summarize avg(duration) by bin(timestamp, 1h)
| render timechart
การวัดและส่งข้อมูลทางไกลนี้จะมีการควบคุมปริมาณหรือไม่
ใช่ ขณะนี้มีรายละเอียดข้อผิดพลาดพื้นฐาน 429
ฉันสามารถเข้าใจเส้นทางการดำเนินการได้หรือไม่ การโทรโดยปลั๊กอินทำให้ปลั๊กอินช้าลงหรือไม่
ใช่ คุณสามารถดูข้อความและปลั๊กอินทั้งหมดที่ดำเนินการตามคำขอใดๆ
ระยะเวลาของข้อความและการทำงานของปลั๊กอินทั้งหมดจะถูกบันทึก หากปลั๊กอินใดใช้เวลานานกว่านั้น คุณสามารถระบุปลั๊กอินนั้นได้ หากปลั๊กอินกำลังติดต่อกลับไปยัง Dataverse ระยะเวลาของการโทรนั้นจะถูกบันทึก มีการวางแผนข้อมูลเพิ่มเติมเกี่ยวกับปลั๊กอินสำหรับการปรับใช้ในอนาคต
การโทรออกโดยปลั๊กอินจะถูกบันทึกโดยอัตโนมัติเป็นการขึ้นต่อกัน
ฉันสามารถดูการวัดและส่งข้อมูลทางไกลสำหรับคำขอเฉพาะได้หรือไม่
Dataverse ส่งคืน x-ms-service-requestId ในการตอบสนองส่วนหัวของคำขอทั้งหมด เมื่อใช้ requestId นี้ คุณสามารถค้นหาการวัดและส่งข้อมูลทางไกลทั้งหมดได้
union *
| where operation_ParentId contains <requestId>