หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
Note
เนื้อหานี้อ้างอิงเนื้อหาจากการใช้งานแบบเดิมสําหรับการวินิจฉัยใน Visual Studio ในปัจจุบัน เนื้อหาจะได้รับการอัปเดตในอนาคตอันใกล้นี้เพื่อให้ครอบคลุม Power Query SDK ใหม่ใน Visual Studio Code
บทช่วยสอนแบบหลายส่วนนี้ครอบคลุมการสร้างส่วนขยายแหล่งข้อมูลใหม่สําหรับ Power Query บทช่วยสอนมีไว้ให้ทําตามลําดับ—แต่ละบทเรียนจะสร้างขึ้นจากตัวเชื่อมต่อที่สร้างขึ้นในบทเรียนก่อนหน้า โดยจะเพิ่มความสามารถใหม่ให้กับตัวเชื่อมต่อของคุณทีละน้อย
ในบทเรียนนี้ คุณ:
- เรียนรู้เกี่ยวกับฟังก์ชัน Diagnostics.Trace
- ใช้ฟังก์ชันตัวช่วยการวินิจฉัยเพื่อเพิ่มข้อมูลการติดตามเพื่อช่วยแก้ไขข้อบกพร่องของตัวเชื่อมต่อของคุณ
การเปิดใช้งานการวินิจฉัย
ผู้ใช้ Power Query สามารถเปิดใช้งานการบันทึกการติดตามได้โดยเลือกกล่องกาเครื่องหมายภายใต้ ตัวเลือก | Power Query การวินิจฉัย
เมื่อเปิดใช้งาน การสืบค้นที่ตามมาจะทําให้กลไกจัดการ M ส่งข้อมูลการติดตามไปยังไฟล์บันทึกที่อยู่ในไดเรกทอรีผู้ใช้คงที่
เมื่อคุณเรียกใช้คิวรี M จากภายใน Power Query SDK การติดตามจะเปิดใช้งานในระดับโครงการ บนหน้าคุณสมบัติของโครงการ มีการตั้งค่าสามรายการที่เกี่ยวข้องกับการติดตาม:
ล้างบันทึก: เมื่อตั้งค่า
trueเป็น บันทึกจะถูกรีเซ็ต/ล้างเมื่อคุณเรียกใช้การสืบค้น เราขอแนะนําให้คุณเก็บชุดtrueนี้เป็นแสดงการติดตามเครื่องยนต์: การตั้งค่านี้ควบคุมเอาต์พุตของการติดตามในตัวจากเอ็นจิ้น M การติดตามเหล่านี้มีประโยชน์กับสมาชิกของทีม Power Query เท่านั้น ดังนั้นโดยทั่วไป คุณต้องการเก็บการตั้งค่า
falseนี้เป็นแสดงการติดตามผู้ใช้: การตั้งค่านี้ควบคุมข้อมูลการติดตามที่ส่งออกโดยตัวเชื่อมต่อของคุณ คุณต้องการตั้งค่านี้เป็น
true
เมื่อเปิดใช้งานแล้ว รายการบันทึกจะแสดงในหน้าต่าง M Query Output ภายใต้แท็บ บันทึก
การวินิจฉัย.ติดตาม
ฟังก์ชัน Diagnostics.Trace ใช้เพื่อเขียนข้อความลงในบันทึกการติดตามของกลไกจัดการ M
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
สําคัญ
M เป็นภาษาที่ใช้งานได้พร้อมการประเมินแบบขี้เกียจ เมื่อใช้ Diagnostics.Traceโปรดทราบว่าฟังก์ชันจะถูกเรียกก็ต่อเมื่อนิพจน์เป็นส่วนหนึ่งของสิ่งที่ประเมินจริง ตัวอย่างของลักษณะการทํางานนี้สามารถพบได้ในบทช่วยสอนนี้ในภายหลัง
traceLevelพารามิเตอร์สามารถเป็นค่าใดค่าหนึ่งต่อไปนี้ (จากมากไปหาน้อย):
TraceLevel.CriticalTraceLevel.ErrorTraceLevel.WarningTraceLevel.InformationTraceLevel.Verbose
เมื่อเปิดใช้งานการติดตาม ผู้ใช้สามารถเลือกระดับสูงสุดของข้อความที่ต้องการดูได้ ข้อความการติดตามทั้งหมดของระดับนี้และต่ํากว่าจะถูกส่งออกไปยังบันทึก ตัวอย่างเช่น หากผู้ใช้เลือกระดับ "คําเตือน" ให้ติดตามข้อความของ TraceLevel.Warning, TraceLevel.Errorและ TraceLevel.Critical ปรากฏในบันทึก
messageพารามิเตอร์คือข้อความจริงที่ส่งออกไปยังไฟล์การติดตาม ข้อความ value ไม่มีพารามิเตอร์ เว้นแต่คุณจะรวมพารามิเตอร์ไว้ในข้อความอย่างชัดเจน
valueพารามิเตอร์คือสิ่งที่ฟังก์ชันส่งคืน เมื่อ delayed ตั้งค่าพารามิเตอร์เป็น trueเป็น ฟังก์ชัน value พารามิเตอร์ศูนย์ที่ส่งกลับค่าจริงที่คุณกําลังประเมิน เมื่อ delayed ถูกตั้งค่าเป็น falseคือ value ค่าจริง ตัวอย่างของวิธีการทํางานนี้สามารถพบได้ในการประเมินล่าช้า
การใช้ Diagnostics.Trace ในขั้วต่อ TripPin
สําหรับตัวอย่างที่ใช้งานได้จริงของการใช้ Diagnostics.Trace และผลกระทบของ delayed พารามิเตอร์ ให้อัปเดตฟังก์ชันของ GetSchemaForEntity ตัวเชื่อมต่อ TripPin เพื่อตัด error ข้อยกเว้น:
GetSchemaForEntity = (entity as text) as type =>
try
SchemaTable{[Entity=entity]}[Type]
otherwise
let
message = Text.Format("Couldn't find entity: '#{0}'", {entity})
in
Diagnostics.Trace(TraceLevel.Error, message, () => error message, true);
คุณสามารถบังคับให้เกิดข้อผิดพลาดในระหว่างการประเมิน (เพื่อวัตถุประสงค์ในการทดสอบ) โดยการส่งชื่อเอนทิตีที่ไม่ถูกต้องไปยัง GetEntity ฟังก์ชัน ที่นี่คุณเปลี่ยนwithDataบรรทัดในTripPinNavTableฟังก์ชันแทนที่[Name]ด้วย"DoesNotExist"
TripPinNavTable = (url as text) as table =>
let
// Use our schema table as the source of top level items in the navigation tree
entities = Table.SelectColumns(SchemaTable, {"Entity"}),
rename = Table.RenameColumns(entities, {{"Entity", "Name"}}),
// Add Data as a calculated column
withData = Table.AddColumn(rename, "Data", each GetEntity(url, "DoesNotExist"), type table),
// Add ItemKind and ItemName as fixed text values
withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
// Indicate that the node should not be expandable
withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
// Generate the nav table
navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
in
navTable;
เปิดใช้งานการติดตาม สําหรับโครงการของคุณ และเรียกใช้การสืบค้นทดสอบของคุณ บน Errors แท็บ คุณจะเห็นข้อความของข้อผิดพลาดที่คุณยกขึ้นมา:
นอกจากนี้บน Log แท็บคุณควรเห็นข้อความเดียวกัน ถ้าคุณใช้ค่าที่แตกต่างกันสําหรับ message พารามิเตอร์ และ value ค่าเหล่านี้จะแตกต่างกัน
โปรดทราบด้วยว่า Action ฟิลด์ของข้อความบันทึกมีชื่อ (ชนิดแหล่งข้อมูล) ของส่วนขยายของคุณ (ในกรณีนี้คือ Engine/Extension/TripPin) ฟิลด์นี้ช่วยให้ค้นหาข้อความที่เกี่ยวข้องกับส่วนขยายของคุณได้ง่ายขึ้นเมื่อมีการสืบค้นหลายรายการที่เกี่ยวข้อง และ/หรือเปิดใช้งานการติดตามระบบ (กลไกจัดการ mashup)
การประเมินล่าช้า
ตัวอย่างของวิธี delayed การทํางานของพารามิเตอร์ คุณต้องทําการปรับเปลี่ยนบางอย่างและเรียกใช้คิวรีอีกครั้ง
ขั้นแรก ให้ตั้งค่าเป็น delayedfalseแต่ปล่อยให้ value พารามิเตอร์ as-is:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
เมื่อคุณเรียกใช้แบบสอบถาม คุณได้รับข้อผิดพลาดว่า "เราไม่สามารถแปลงค่าของชนิด ฟังก์ชัน เป็นชนิด ชนิด" และไม่ใช่ข้อผิดพลาดจริงที่คุณยกขึ้น ความแตกต่างนี้เป็นเพราะการเรียกกําลังส่งคืน function ค่าแทนที่จะเป็นค่าเอง
จากนั้นลบฟังก์ชันออกจาก value พารามิเตอร์:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
เมื่อคุณเรียกใช้แบบสอบถาม คุณจะได้รับข้อผิดพลาดที่ถูกต้อง แต่ถ้าคุณตรวจสอบแท็บ บันทึก จะไม่มีข้อความ ความคลาดเคลื่อนนี้เกิดจากการ error จบลงด้วยการยก/ประเมิน ระหว่าง การโทรไปที่ Diagnostics.Traceดังนั้นข้อความจึงไม่เคยถูกส่งออกจริง
เมื่อคุณเข้าใจผลกระทบของ delayed พารามิเตอร์แล้ว อย่าลืมรีเซ็ตตัวเชื่อมต่อของคุณกลับเป็นสถานะการทํางานก่อนดําเนินการต่อ
ฟังก์ชันตัวช่วยการวินิจฉัยใน Diagnostics.pqm
ไฟล์ Diagnostics.pqm ที่รวมอยู่ในโครงการนี้มีฟังก์ชันตัวช่วยมากมายที่ทําให้การติดตามง่ายขึ้น ดังที่แสดงใน บทช่วยสอนก่อนหน้านี้ คุณสามารถรวมไฟล์นี้ในโปรเจ็กต์ของคุณ (อย่าลืมตั้งค่า Build Action เป็น Compile) แล้วโหลดลงในไฟล์ตัวเชื่อมต่อของคุณ ด้านล่างของไฟล์ตัวเชื่อมต่อของคุณควรมีลักษณะคล้ายกับข้อมูลโค้ดต่อไปนี้ อย่าลังเลที่จะสํารวจฟังก์ชันต่างๆ ที่โมดูลนี้มีให้ แต่ในตัวอย่างนี้ คุณใช้ฟังก์ชัน Diagnostics.LogValue และ Diagnostics.LogFailure เท่านั้น
// Diagnostics module contains multiple functions. We can take the ones we need.
Diagnostics = Extension.LoadFunction("Diagnostics.pqm");
Diagnostics.LogValue = Diagnostics[LogValue];
Diagnostics.LogFailure = Diagnostics[LogFailure];
การวินิจฉัย.LogValue
ฟังก์ชันนี้ Diagnostics.LogValue คล้ายกับ Diagnostics.Traceและสามารถใช้เพื่อส่งออกค่าของสิ่งที่คุณกําลังประเมินได้
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
พารามิเตอร์จะถูก prefix นําหน้าข้อความบันทึก คุณใช้พารามิเตอร์นี้เพื่อค้นหาว่าการเรียกใดที่ส่งออกข้อความ
valueพารามิเตอร์คือสิ่งที่ฟังก์ชันส่งคืน และยังถูกเขียนลงในการติดตามเป็นข้อความที่แสดงค่า M ตัวอย่างเช่น ถ้า value เท่ากับ a table ที่มีคอลัมน์ A และ B บันทึกจะมีการแสดงที่เทียบเท่า #table กัน: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Note
การทําให้ค่า M เป็นข้อความเป็นอนุกรมอาจเป็นการดําเนินการที่มีราคาแพง ระวังขนาดที่เป็นไปได้ของค่าที่ส่งออกไปยังการติดตาม
Note
สภาพแวดล้อม Power Query ส่วนใหญ่ตัดทอนข้อความการติดตามให้มีความยาวสูงสุด
ตัวอย่างเช่น อัปเดต TripPin.Feed ฟังก์ชันเพื่อติดตามอาร์กิวเมนต์ url และ schema ที่ส่งผ่านไปยังฟังก์ชัน
TripPin.Feed = (url as text, optional schema as type) as table =>
let
_url = Diagnostics.LogValue("Accessing url", url),
_schema = Diagnostics.LogValue("Schema type", schema),
//result = GetAllPagesByNextLink(url, schema)
result = GetAllPagesByNextLink(_url, _schema)
in
result;
คุณต้องใช้ค่าใหม่_urlและ_schemaค่าในการเรียกGetAllPagesByNextLink หากคุณใช้พารามิเตอร์ฟังก์ชันดั้งเดิม การ Diagnostics.LogValue เรียกจะไม่ถูกประเมินจริง ซึ่งส่งผลให้ไม่มีข้อความที่เขียนลงในการติดตาม
การเขียนโปรแกรมที่ใช้งานได้เป็นเรื่องสนุก!
เมื่อคุณเรียกใช้การค้นหา คุณควรเห็นข้อความใหม่ในบันทึก
การเข้าถึง URL:
ประเภทสคีมา:
เวอร์ชันอนุกรมของ schema พารามิเตอร์ type จะปรากฏขึ้นแทนที่จะเป็นสิ่งที่คุณได้รับเมื่อคุณทําแบบง่าย Text.FromValue กับค่าชนิด (ซึ่งส่งผลให้เป็น "ชนิด")
การวินิจฉัย.LogFailure
ฟังก์ชันนี้ Diagnostics.LogFailure สามารถใช้เพื่อตัดการเรียกฟังก์ชัน และเขียนไปยังการติดตามก็ต่อเมื่อการเรียกใช้ฟังก์ชันล้มเหลว (นั่นคือ ส่งคืน error)
Diagnostics.LogFailure = (text as text, function as function) as any => ...
ภายใน Diagnostics.LogFailure เพิ่ม try โอเปอเรเตอร์ใน function การโทร หากการเรียกล้มเหลว ค่าจะถูกtextเขียนลงในการติดตามก่อนที่จะส่งคืนต้นฉบับerror หากการ function เรียกสําเร็จ ผลลัพธ์จะถูกส่งกลับโดยไม่เขียนอะไรลงในการติดตาม เนื่องจากข้อผิดพลาด M ไม่มีการติดตามสแต็กแบบเต็ม (นั่นคือ โดยทั่วไปคุณจะเห็นเฉพาะข้อความของข้อผิดพลาด) ฟังก์ชันนี้จึงมีประโยชน์เมื่อคุณต้องการระบุตําแหน่งที่เกิดข้อผิดพลาด
เป็นตัวอย่าง (แย่) แก้ไข withData บรรทัดของ TripPinNavTable ฟังก์ชันเพื่อบังคับให้เกิดข้อผิดพลาดอีกครั้ง:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
ในการติดตาม คุณจะพบข้อความแสดงข้อผิดพลาดที่เป็นผลลัพธ์ที่มีข้อมูลข้อผิดพลาด และข้อมูลข้อผิดพลาดเดิมของคุณtext
อย่าลืมรีเซ็ตฟังก์ชันของคุณเป็นสถานะการทํางานก่อนที่จะดําเนินการกับบทช่วยสอนถัดไป
บทสรุป
บทเรียนสั้น ๆ (แต่สําคัญ) นี้แสดงให้คุณเห็นถึงวิธีการใช้ประโยชน์จากฟังก์ชันตัวช่วยการวินิจฉัยเพื่อบันทึกไปยังไฟล์การติดตาม Power Query เมื่อใช้อย่างถูกต้องฟังก์ชันเหล่านี้จะมีประโยชน์ในการดีบักปัญหาภายในตัวเชื่อมต่อของคุณ
Note
ในฐานะนักพัฒนาตัวเชื่อมต่อ คุณมีหน้าที่รับผิดชอบที่จะต้องตรวจสอบให้แน่ใจว่าคุณไม่ได้บันทึกข้อมูลที่ละเอียดอ่อนหรือข้อมูลส่วนบุคคลที่สามารถระบุตัวตนได้ (PII) ซึ่งเป็นส่วนหนึ่งของการบันทึกการวินิจฉัยของคุณ คุณต้องระมัดระวังไม่ให้ส่งออกข้อมูลการติดตามมากเกินไป เนื่องจากอาจส่งผลเสียต่อประสิทธิภาพการทํางาน