TripPin ส่วนที่ 8 - การเพิ่มการวินิจฉัย
หมายเหตุ
เนื้อหานี้อ้างอิงเนื้อหาจากการดําเนินการแบบดั้งเดิมสําหรับการวินิจฉัยใน Visual Studio เนื้อหาจะได้รับการอัปเดตในอนาคตอันใกล้นี้เพื่อครอบคลุม Power Query SDK ใหม่ใน Visual Studio Code
บทช่วยสอนแบบหลายส่วนนี้ครอบคลุมการสร้างส่วนขยายแหล่งข้อมูลใหม่สําหรับ Power Query บทช่วยสอนมีไว้ให้ทําตามลําดับ —บทเรียนแต่ละบทจะสร้างขึ้นบนตัวเชื่อมต่อที่สร้างขึ้นในบทเรียนที่แล้ว โดยการเพิ่มความสามารถใหม่ให้กับตัวเชื่อมต่อของคุณแบบเพิ่มหน่วย
ในบทเรียนนี้ คุณจะ:
- เรียนรู้เกี่ยวกับฟังก์ชัน Diagnostics.Trace
- ใช้ฟังก์ชันตัวช่วยเหลือการวินิจฉัยเพื่อเพิ่มข้อมูลการติดตามเพื่อช่วยแก้จุดบกพร่องตัวเชื่อมต่อของคุณ
เปิดใช้งานการวินิจฉัย
ผู้ใช้ Power Query สามารถเปิดใช้งานการบันทึกการติดตามได้โดยการเลือกกล่องกาเครื่องหมายภายใต้ ตัวเลือก | ไปที่แท็บ การตั้งค่า การวินิจฉัย
เมื่อเปิดใช้งาน คิวรีใด ๆ ที่ตามมาจะทําให้กลไกจัดการ M ส่งข้อมูลการติดตามไปยังไฟล์บันทึกที่อยู่ในไดเรกทอรีผู้ใช้แบบคงที่
เมื่อเรียกใช้คิวรี M จากภายใน Power Query SDK การติดตามจะเปิดใช้งานในระดับโครงการ บนหน้าคุณสมบัติโครงการ มีการตั้งค่าสามแบบที่เกี่ยวข้องกับการติดตาม:
- ล้างบันทึก—เมื่อตั้งค่า
true
เป็น บันทึกจะถูกรีเซ็ต/ล้างเมื่อคุณเรียกใช้คิวรีของคุณ เราขอแนะนําให้คุณตั้งค่าtrue
นี้เป็น - แสดงการติดตามกลไกจัดการ—การตั้งค่านี้จะควบคุมผลลัพธ์ของการติดตามที่มีอยู่ภายในจากกลไกจัดการ M การติดตามเหล่านี้จะมีประโยชน์เฉพาะกับสมาชิกของทีม Power Query เท่านั้น ดังนั้นโดยทั่วไปแล้วคุณจะต้องเก็บการตั้งค่า
false
นี้เป็น - แสดงการติดตามผู้ใช้ —การตั้งค่านี้จะควบคุมผลลัพธ์ข้อมูลการติดตามโดยตัวเชื่อมต่อของคุณ คุณจะต้องตั้งค่านี้เป็น
true
เมื่อเปิดใช้งาน คุณจะเริ่มต้นดูรายการบันทึกในหน้าต่างผลลัพธ์คิวรี M ภายใต้แท็บบันทึก
Diagnostics.Trace
ฟังก์ชัน 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.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
เมื่อเปิดใช้งานการติดตาม ผู้ใช้สามารถเลือกระดับสูงสุดของข้อความที่ต้องการดูได้ ข้อความการติดตามทั้งหมดของระดับนี้และใต้ จะแสดงผลเป็นล็อก ตัวอย่างเช่น ถ้าผู้ใช้เลือกระดับ "คําเตือน" ข้อความการติดตามของ TraceLevel.Warning
TraceLevel.Error
, และ TraceLevel.Critical
จะปรากฏในล็อก
พารามิเตอร์ message
เป็นข้อความจริงที่จะถูกส่งออกไปยังไฟล์การติดตาม ข้อความจะไม่ประกอบด้วย value
พารามิเตอร์เว้นแต่ว่าคุณจะรวมไว้อย่างชัดเจนในข้อความ
พารามิเตอร์ value
คือสิ่งที่ฟังก์ชันจะส่งกลับ delayed
เมื่อตั้งค่าtrue
value
พารามิเตอร์เป็น จะเป็นฟังก์ชันพารามิเตอร์ศูนย์ที่ส่งกลับค่าจริงที่คุณกําลังประเมิน เมื่อ delayed
ตั้งค่าfalse
value
เป็น จะเป็นค่าจริง ตัวอย่างของวิธีการทํางานนี้สามารถพบได้ที่ด้านล่าง
ใช้การวินิจฉัย การติดตามในตัวเชื่อมต่อ 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
คือ ) ซึ่งทําให้ง่ายต่อการค้นหาข้อความที่เกี่ยวข้องกับส่วนขยายของคุณเมื่อเปิดใช้งานการติดตามหลายคิวรีที่เกี่ยวข้องและ/หรือการติดตามระบบ (กลไกจัดการผสมเข้าด้วยกัน)
การประเมินล่าช้า
ในฐานะตัวอย่างของวิธี delayed
การทํางานของพารามิเตอร์ คุณจะทําการปรับเปลี่ยนบางอย่างและเรียกใช้คิวรีอีกครั้ง
ก่อนอื่น ให้ delayed
ตั้งค่าเป็น false
แต่ปล่อย value
พารามิเตอร์ไว้ตามที่เป็น:
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 ที่รวมอยู่ในโครงการนี้ประกอบด้วยฟังก์ชันผู้ช่วยเหลือจํานวนมากที่ทําให้การติดตามง่ายขึ้น ดังที่แสดงใน บทช่วยสอนก่อนหน้านี้ คุณสามารถรวมไฟล์นี้ในโครงการของคุณ (โปรดจําไว้ว่าการตั้งค่าการดําเนินการสร้างเป็น คอมไพล์) จากนั้นโหลดไฟล์นี้ในไฟล์ตัวเชื่อมต่อของคุณ ด้านล่างของไฟล์ตัวเชื่อมต่อของคุณควรมีลักษณะบางอย่างเช่นส่วนย่อยของโค้ดด้านล่าง อย่าลังเลที่จะสํารวจฟังก์ชันต่าง ๆ ที่โมดูลนี้ให้ แต่ในตัวอย่างนี้ คุณจะใช้ 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];
Diagnostics.LogValue
ฟังก์ชัน Diagnostics.LogValue
จะเหมือนกับ Diagnostics.Trace
และ สามารถใช้เพื่อแสดงค่าของสิ่งที่คุณกําลังประเมิน
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
พารามิเตอร์ prefix
ถูกตั้งไว้ล่วงหน้าไปยังข้อความบันทึก คุณจะต้องใช้ข้อมูลนี้เพื่อหาว่าเรียกใช้ผลลัพธ์ข้อความใด พารามิเตอร์ value
คือสิ่งที่ฟังก์ชันจะแสดง และจะถูกเขียนลงในการติดตามในรูปแบบการแสดงข้อความของค่า M ตัวอย่างเช่น หาก value
เท่ากับ table
คอลัมน์ A และ B ไฟล์บันทึกจะมีค่าที่แสดงที่เทียบเท่า #table
: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
หมายเหตุ
การจัดเรียงค่า M ให้เป็นข้อความให้เป็นอนุกรมอาจเป็นการดําเนินการที่มีราคาแพง ระวังขนาดที่เป็นไปได้ของค่าที่คุณกําลังส่งออกไปที่การติดตาม
หมายเหตุ
สภาพแวดล้อม 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;
คุณต้องใช้ค่า และ _schema
ใหม่_url
ในการเรียก ไปยังGetAllPagesByNextLink
ถ้าคุณใช้พารามิเตอร์ Diagnostics.LogValue
ฟังก์ชันดั้งเดิม การเรียกใช้จะไม่ถูกประเมินผลจริง ส่งผลให้ไม่มีข้อความที่เขียนลงในการติดตาม การเขียนโปรแกรมที่ใช้งานได้เป็นเรื่องสนุก!
เมื่อคุณเรียกใช้คิวรีของคุณ ตอนนี้คุณควรเห็นข้อความใหม่ในบันทึก
URL การเข้าถึง:
ชนิดเค้าร่าง:
คุณเห็นพารามิเตอร์type
เวอร์ชันschema
อนุกรมแล้ว แทนที่จะเป็นสิ่งที่คุณได้รับเมื่อคุณทําอย่างง่ายText.FromValue
บนค่าชนิด (ซึ่งส่งผลให้เป็น "ประเภท")
Diagnostics.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 เมื่อใช้อย่างถูกต้อง ฟังก์ชันเหล่านี้จะมีประโยชน์ในการดีบักปัญหาภายในตัวเชื่อมต่อของคุณ
หมายเหตุ
ในฐานะนักพัฒนาตัวเชื่อมต่อ ถือเป็นความรับผิดชอบของคุณในการตรวจสอบให้แน่ใจว่าคุณไม่ได้บันทึกข้อมูลที่ละเอียดอ่อนหรือสามารถระบุตัวตนส่วนบุคคล (PII) เป็นส่วนหนึ่งของการบันทึกการวินิจฉัยของคุณ นอกจากนี้คุณยังต้องระมัดระวังไม่ให้ส่งออกข้อมูลการติดตามมากเกินไปเนื่องจากอาจมีผลกระทบเชิงลบต่อประสิทธิภาพการทํางาน